(Gast)
n/a Beiträge
|
AW: Problem Auslesen von MySQL und Ausgabe in ListViews
26. Aug 2017, 12:59
Die Routine würd' ich noch ein bisserl allgemeiner machen:
Delphi-Quellcode:
var
i : Integer;
Item : TListItem;
begin
lvBarcodes.Items.Clear;
QueryBarcodes.SQL.Text := ' SELECT ID, Produktname, Hersteller, Inhalt, Lieferant, Preis, Barcode, Kommentar FROM barcodes';
QueryBarcodes.Open;
// schreiben der Daten aus der Datenbank "barcodes" in die Listview
while not QueryBarcodes.Eof do
begin
Item := lvBarcodes.Items.Add; // Name
// Der Wert der ersten Ergebnisspalte kommt nach Caption,
// die übrigen Spalten werden in der Reihenfolge,
// in der sie im SQL stehen, übernommen.
// Damit werden wir bei der Datenübernahme unabhängig vom
// Inhalt der Datenmenge.
Item.Caption := QueryBarcodes.Fields[0].AsString;
for i := 1 to QueryBarcodes.Fields.Count - 1 do begin
Item.SubItems.Add(QueryBarcodes.Fields[i].AsString);
end;
QueryBarcodes.Next;
end;
// außerhalb der Schleife. Imho ist Close nicht notwendig. Mit Zuweisung von "SQL.Text" und dem Open wird Close automatisch augeführt.
// Aber eine Datenmenge dann, wenn man sie nicht mehr benötigt, zu schließen, ist auch nicht unbedingt verkehrt.
QueryBarcodes.Close;
end;
Oder noch allgemeiner:
Delphi-Quellcode:
procedure DataSetToListView(ds : TDataSet; lv : TListView);
var
i : Integer;
iCount : Integer;
isActive : Boolean;
Item : TListItem;
begin
lv.Items.Clear;
// Ist die Datenmenge offen?
// Wenn nein, öffnen wir sie,
// ansonsten gehen wird zum ersten Datensatz.
isActive := ds.Active;
if not isActive then ds.Open else ds.First; // Man könnte sich auch noch den aktuellen Satz merken.
iCount := ds.Fields.Count - 1;
while not ds.EoF do begin
Item := lv.Items.Add;
Item.Caption := ds.Fields[0].AsString;
for i := 1 to iCount do Item.SubItems.Add(ds.Fields[i].AsString);
ds.Next;
end;
// Haben wir die Datenmenge selbst geöffnet, schließen wir sie auch wieder.
if not isActive then ds.Close else ds.First; // oder zum ggfls. gemerkten Satz zurückgehen.
end;
Aufruf:
Delphi-Quellcode:
QueryBarcodes.SQL.Text := 'SELECT ID, Produktname, Hersteller, Inhalt, Lieferant, Preis, Barcode, Kommentar FROM barcodes';
DataSetToListView(QueryBarcodes,lvBarcodes);
// Weitere Datenmengen, wenn Bedarf besteht:
QueryIrgendwas.SQL.Text := 'select Name, Strasse, Ort form irgendeinertabelle';
DataSetToListView(QueryIrgendwas,lvIrgendwas);
...
|
|
Zitat
|