pqxx und wxGrid
-
hallo
ich versuche, das Result einer SQL-Abfrage in ein wxGrid zu laden.
Folgendes funktioniert bei einer wxComboBOX:for (result::const_iterator c = namen.begin(); c != namen.end(); ++c) { ComboBox1->Append(_(c[0].as<string>())); ComboBox1->SetSelection(0); }
Beim wxGrid wird der pqxx Iterator c nicht akzeptiert:
for (result::const_iterator c = vorg.begin(); c != vorg.end(); ++c) { string dat = (c[1].as<string>()); wxString Sdat(dat.c_str(), wxConvUTF8); Grid1->SetCellValue(c,1,Sdat); //Fehlerzeile
die Fehlermeldung :
error: no matching function for call to ‘wxGrid::SetCellValue(pqxx::result::const_iterator&, int, wxString&)’
Kann man den constIterator in int umwandeln?
oder gibt es eine andere Lösung?
-
Du möchtest den Wert, auf den der
result::const_iterator c
verweist, als Zeilenindex verwenden?
Ich nehme mal an, inc[0]
steht der Index undc[1]
der Inhalt aus der Datenbank-Tabelle.Möchtest du evtl.
int row = c[0].as<int>(); Grid1->SetCellValue(row,1,Sdat);
?
-
@Th69
c steht für den Zeilenindex, c[0] und c[1] usw.verweist auf die Inhalte der Spalten. Bei der ComboBox wird c als Zeilenindex akzeptiert und der Spalteninhalt zurückgegeben, beim Grid leider nicht, siehe Error. Aus dem pqxx Iterator c müsste ein int werdenint row = ?? c ??;
-
@gokusa sagte in pqxx und wxGrid:
c steht für den Zeilenindex,
Bist du dir sicher, dass
c
für einen Zeilenindex und nicht für einen Zeileniterator steht (bzw.*c
für eine Zeile, also einepqxx::row
, steht - nicht für einen Index)?
Dannc->rownumber()
(https://libpqxx.readthedocs.io/en/stable/a01148.html#aadd30c2141060d954c16301e3711a02c)PS: warum heißt dein Iterator
c
, das klingt nach column und nicht nach row - oder verstehe ich hier was falsch?PS2: vielleicht bin ich auch ganz verwirrt, es ist schon 2 Jahre her, dass ich mit pqxx gearbeitet habe.
-
@wob
das c ist in der Tat irreführend, hab ich aus irgendeinem Beispielcode und so belassen.
c ist der Zeilen-Iterator und lässt sich in dem Beispiel der ComboBox als Zeilenindex verwenden.for (result::const_iterator c = vorg.begin(); c != vorg.end(); ++c)
(++c in der for Schleife) Die ComboBox wird mit dem Inhalt der im SELECT angegebenen Spalte aus allen Datensätzen gefüllt. Das Problem ist, dass wxGrid den Iterator nicht als int akzeptiert.
error: no matching function for call to ‘wxGrid::SetCellValue(pqxx::result::const_iterator&, int, wxString&)’
-
Vielleicht bin ich zu doof zu verstehen, aber ich verstehe nicht, wo du im oberen Beispiel den Iterator als int verwendest - geschweige denn, warum das funktionieren sollte.
-
@gokusa: Du scheinst nicht zu verstehen, was ein Iterator ist. Das ist keine einfache Zahl (sondern eine eigene Datenstruktur).
Man kann aber den Index daraus errechnen:
int row = c - vorg.begin(); Grid1->SetCellValue(row,1,Sdat);
Oder du benutzt eine eigene Zählvariable für den Zeilenindex.
PS: Und bei deinem ComboBox-Beispiel zeigst du die Daten der ersten Spalte (mit Index 0) an - daher mein äquivalenter Code in meiner ersten Antwort.
-
@Th69
Ich erinnere an meine eingangs gestellte Frage:
Kann man den constIterator in int umwandeln oder gibt es eine andere Lösung?
Also, mir war schon klar, dass ein Iterator ein anderes Konstrukt ist.
Was entscheidend ist, du hat meine Frage beantwortet und deine Lösung funktioniert.
Vielen Dank
-
@gokusa Der Punkt ist, das ein Iterator nicht in einen
int
umgewandelt werden kann. Die Vorgestellte Lösund berechnet die Distanz vom aktuellen Iterator zum ersten. Es gäbe dafür auchstd::distance
https://en.cppreference.com/w/cpp/iterator/distance was aber im Prinzip dasselbe macht.