Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#11

AW: Problem Auslesen von MySQL und Ausgabe in ListViews

  Alt 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);
  ...
  Mit Zitat antworten Zitat