SQLITE die Zweite



  • Hallo!
    Ich hatte gestern schon ein Post zu SQLITE. Ich habe noch ein kleines Problem ich Versuch es euch mal zu schildern.
    Ich habe ein dynamisches Image (oder eher Image Array) erstellt, welche welche auf einen ONClick-Funktion reagieren:

    void __fastcall TForm1::Image1Click(TObject *Sender)
    {
    //Wählt das ausgewählte Image aus der Liste aus
    int imageTag= dynamic_cast<TImage*>(Sender)->Tag;
    
    AnsiString db_select= (AnsiString)"select info from t_hosts WHERE tag = '"+imageTag+"';";
    
    //Öffnet DB
    datenbank = sqlite_open( "db_netmon" , 0 , NULL);
    sqlite_exec( datenbank , db_select.c_str(), Callback , this , NULL);
    sqlite_close(datenbank);
    
    }
    //---------------------------------------------------------------------------
    

    Jedem Image gebe ich ein Wert als TAG, damit ich es identifizieren kann.
    Beim Click auf das Image generiere ich eine SQL Anfrage mit dessen TAG. Soweit alles Wunderbar.
    KOmischerweise, ruft er aber immer nur die CALLBACK-Funktion des letzten erstellten IMage auf???!! Ansonsten Ignoriert er die SQL-Anfrage beziehungsweise den Aufruf der CALLBACK Funktion:

    int Callback( void *Pointer, int argc, char **argv, char **columnNames)
    {
    
      TForm1* Form = reinterpret_cast<TForm1*>(Pointer);
      //Form->... // Daten der Abfrage im Form auswerten
      Form1->Memo1->Lines->Add(argv[0]);
    
    return 0;
    }
    //---------------------------------------------------------------------------
    


  • Hallo

    läßt sich aus deinem Code nicht nachvollziehen.
    Wie erstellst du denn die Images? Überprüfe das du auch wirklich jedem Image ein Tag und den OnClick-Event zuweist.
    Ansonsten benutzt deinen Debugger und setzt Breakpoints, beninnend mit dem OnClick-Event.

    /Edit :
    Desweiteren würde ich das Zusammensetzen des AnsiStrings lieber so machen

    AnsiString db_select= "select info from t_hosts WHERE tag = '"+ IntToStr(imageTag)+"';";
    

    bis bald
    akari



  • Hallo akari. Danke für den Tip.
    Also, das mit den TAGs funktioniert alles. Jedes Image bekommt ein Tag das hab ich alles mit MessageBoxen geprüft. Der SQL Befehl ist auch korrekt. Leider wird trotzdem aber immer nur beim letzten aktuellen Image die Funktion aufgerufen, bei den anderen landet man erst gar nicht in der Funktion.
    Also alle IMages basieren auf einer IMage1:OnClick Prozedur. Ich wüßte jetzt auch nicht wie ich das bei einem dynamischen IMage-Array anders machen müsste. Daher habe ich auch die Tags zum identifizieren genommen.

    Ich hab hier mal den Code den ich zum erstellen des IMage-Array nutze:

    DynamicArray<TImage*>imgArray;  //Image Array
    
    imgArray[aktIMG]->Parent = this;
                    imgArray[aktIMG]->Width = 32;
                    imgArray[aktIMG]->Height = 32;
                    imgArray[aktIMG]->Left = random (200);;
                    imgArray[aktIMG]->Top = random (200);;
                    imgArray[aktIMG]->Tag = imgTAG++;    //Icon wird mit dieser Nr. identifiziert
    
                    //imgArray[aktIMG]->Picture->LoadFromFile("Server.ico");
                    imgArray[aktIMG]->Picture->LoadFromFile(Form2->Edit4->Text);
    
                    imgArray[aktIMG]->OnMouseDown =  Image1MouseDown; //Zuweisung eines Events für das PopUpMenue
                    imgArray[aktIMG]->OnMouseUp =  Image1MouseUp;
                    imgArray[aktIMG]->OnMouseMove =  Image1MouseMove;
                    imgArray[aktIMG]->OnClick =  Image1Click;
    
                    imgArray[aktIMG]->Show();
    
                    ListBox1->Items->Add(imgArray[aktIMG]->Tag);
    
                    aktIMG++;
    
    return 0;
    }
    //---------------------------------------------------------------------------
    

    Danke nochmal für deine Hilfe.



  • Also das Problem scheint wirklich nicht in der Anweisung zu sein die ich geposted habe. Es scheint an der Art zu liegen wie ich die Werte in die Datenbank schreibe. Was da nun aber falsch sein soll weiss ich auch nicht so genau. Evtl. findet ja von euch jemand den Fehler.

    Wenn ich die Einträge einzelnt auf diese Art und Weise hinzufüge (statisch), dann gehts anscheinend:

    sqlite_exec( datenbank , "insert into t_hosts (tag , hostname, ip, info) values ('100','test','0.0.0.0','test1');", NULL , NULL , NULL);
    sqlite_exec( datenbank , "insert into t_hosts (tag , hostname, ip, info) values ('101','test','0.0.0.0','test12');", NULL , NULL , NULL);
    sqlite_exec( datenbank , "insert into t_hosts (tag , hostname, ip, info) values ('102','test','0.0.0.0','test123');", NULL , NULL , NULL
    

    Aber ich wollte die Werte aus EditBoxen zuweisen:

    AnsiString db_insert= "insert into t_hosts (tag , hostname, ip, info) values (" + IntToStr(imgTAG) + ",'" + Form2->Edit1->Text + "','" + Form2->Edit2->Text + "','" + Form2->Edit3->Text + "');";
    
    sqlite_exec( datenbank , db_insert.c_str(), NULL , NULL , NULL);
    

    Das scheint dann zu den komischen Fehler zu führen. Aber warum???!

    gruß

    kmb



  • Hallo

    was werden denn nach der dynamischen Anweisung effektiv für Werte in die Datenbank eingetragen? Mit fällt zum Beispiel auf, das du bei den statischen den ersten Wert in Hochkommas, in der zweiten aber ohne übergibst. Wenn das erste Feld "Tag" nicht vom Typ Integer ist, sondern Text (varchar...), kommt also bei dem dynamischen ein falscher Wert an. Das hat zur Folge das die Anweisung gar nicht ausgeführt wird. Du solltest mal schauen, wie SQLLite Fehler bei SQL-Anweisungen behandelt und meldet.
    Werte also im Programm aus, ob und warum die dynamische Anweisung fehlschlägt.

    bis bald
    akair


Anmelden zum Antworten