Einzelnen Beitrag anzeigen

Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.862 Beiträge
 
Delphi 10.1 Berlin Professional
 
#10

AW: Problem Auslesen von MySQL und Ausgabe in ListViews

  Alt 26. Aug 2017, 08:44
Moin...

Zitat:
Ich möchte ja was lernen und mich verbessern
Dann mache ich mal den Erklärbär...

Wie weit du dich darauf einläßt und die Tipps umsetzt, ist dir überlassen. Als Anfänger hab ich mich auch nicht darum gekümmert... Aber auch als Anfänger sollte man es schon wenigstens gehört haben. Learning by doing ohne Hilfe ist nicht schlecht aber sehr zeitaufwendig. Besser ist, die erhaltenen Tipps selbst auszuprobieren und daraus zu lernen. Ich wünschte, daß hätte ich damals auch gehabt...

Dafür ist das Forum da...

Der Reihenfolge nach:

1:
Progammierprinzipien: (die Wichtigsten)
DRY: https://de.wikipedia.org/wiki/Don%E2...epeat_yourself
* Dopplung von Code durch auslagern in Methoden vermeiden
* Bestehenden Code verwenden und danach suchen
KISS: https://de.wikipedia.org/wiki/KISS-Prinzip
* Wenn es mehrere Erklärungen für einen bestimmten Sachverhalt gibt, dann ist diejenige Erklärung zu bevorzugen, die am einfachsten ist, also mit den wenigsten Annahmen und Variablen auskommt.

Allgemein:
CamelCase: https://de.wikipedia.org/wiki/Binnenmajuskel
vernünftige Namen: Auch wenn es am Anfang lästig ist, man hat ja andere Probleme, ist es besser das man sich gleich daran gewöhnt. In 2 Monaten weist du nicht mehr was ListView1 ist.
Denglisch vermeiden: Auch wenn wir Deutsch sind... in der Programmierei ist Englisch die bevorzugte Sprache. Damit hat man auch die Probleme mit Umlauten vom Tisch. Wenn man dann in einem Team arbeitet muß man sich nicht umgewöhnen.
Styleguide: https://www.delphi-treff.de/object-pascal/styleguide/
WITH vermeiden: Fast vergessen. Mit WITH nimmst du dir alle Möglichkeiten den Code, bzw. die Variablen, zu debuggen. Erst Recht als Anfänger will man doch wissen was in der Komponente (Property) los ist...

2:
Werkzeuge allgemein:
Programmieren geht mit der Benutzung der zur Verfügung stehenden Werkzeuge los. Der CnPack ist einer davon. Mit den bunten Strichen im Quelltext wäre dir das:
Zitat:
Natürlich war es das vergessene "begin...end" und der Query.close innerhalb der Schleife.
selbst sofort aufgefallen.

Codeformatter:
Das Wichtigste ist ein gut formatierter Code. (kommt auch im Forum nicht schlecht...) Mit einem Tastendruck (CnPack) ist alles "toll" ausgerichtet...

Was ist besser?
das
Delphi-Quellcode:
while not SQLQuery1.Eof do
begin
item:=mainFrm.ListView1.Items.Add;
item.Caption:= SQLQuery1.FieldByName('ID').AsString;
item.SubItems.Add(SQLQuery1.FieldByName('Produktna me').AsString);
...
SQLQuery1.Next;
end;
SQLQuery1.Close;
oder das?
Delphi-Quellcode:
while not SQLQuery1.Eof do
begin
  Item := mainFrm.ListView1.Items.Add;
  Item.Caption := SQLQuery1.FieldByName('ID').AsString;
  Item.SubItems.Add(SQLQuery1.FieldByName('Produktname').AsString);
...
  SQLQuery1.Next;
end;
SQLQuery1.Close;
3.
Zitat:
Wer neu beginnt, sollte solche Basics quasi schon mit der Muttermilch aufnehmen.
...ein wahres Wort.

4.
Zitat:
Es wäre sinnvoll, den Zugriff auf die Daten (=SQL) vom UI (=ListView) zu trennen.
Trennung der Daten von der GUI ist das A und O.

allgemeiner Programmaufbau (Schicht Model):
https://de.wikipedia.org/wiki/Model_View_Controller
...ist für den Anfang zu kompliziert. Aber das ist das was damit gemeint wurde.

Für den Anfang kannst du dich an folgende Tipps halten:
* GUI<->Logik<->Datenbank Für jeden Part gibt es eine Unit oder DataModule.
* Definition der Datenablage...in der Regel die Unit mit der Logik. Die GUI holt sich direkt, oder über Events, die Daten dort ab. Das hat den Vorteil das du die GUI austauschen/verändern kannst ohne die Datenstruktur anzufassen.
* visuelle Controls niemals als Datenablage benutzen. Die Daten immer in der Logik vorhalten (Variable, DataSet etc.).
* SQL gehören nicht auf die Form oder in die auf die Form gepappte Query, sondern in eine seperate Unit oder Datenmodul. (erleichert den Austausch des DBMS)
* strikte Trennung Ablage der Prozeduren... alles was mit der GUI zu tun hat gehört in die Form, Berechnungen etc. in die Logik.
Zitat:
Außerdem würde ich mir eine Hilfsroutine schreiben (nennen wir sie DisplayData), der man ein TDataset und eine TListView-Instanz übergibt.
...hier scheiden sich die Geister. Wenn du eine allgemeine Prozedur machen willst, dann gehört diese in die Logik. Wenn du die procedure in der GUI mehrfach verwenden willst (DRY), kann die procedure auch in der Form plaziert sein. (weil: die procedure nur diese eine Form kennt)
Zitat:
in der das abläuft und diese dann zu gegebener Zeit aufzurufen?
...so ist es.

5.
Zitat:
Und es wäre sinnvoll, vor dem Lesen der Daten die Listviews zu leeren.
Wenn du die procedure mehrfach benutzt, solltest du am Beginn die Listview leeren, damit du nicht die Einträge aneinanderhängst.

6.
Datenbank:
Delphi-Quellcode:
item.Caption:= SQLQuery1.FieldByName('ID').AsString; // sollte in der Datenbank ein Integer und Primary Key sein!
...
item2.Caption:= SQLQuery2.FieldByName('IDIH').AsString; // sollte in der Datenbank ein Integer und Primary Key sein!
// Das ID Feld sollte in jeder Tabelle den gleichen Namen haben... :-) Verwechslungsgefahr...
Auch für die Datenbank gilt: "Denglisch vermeiden" und Präfixe für Felder- und Tabellennamen wegen der reservierten Worte der Datenbank. (F_xxx, T_xxx ...oder so )

7.
Verbesserungen:
Delphi-Quellcode:
/bei Programmstart auslesen der Datenbank "barcodes"
// verfünftige Namen

// wenn die Colums im OI definiert wurden. Mit lvBarcodes.Clear müssen auch die Colums definiert werden. Das ist das was DeddyH mit allgemein gemeint hatte.
lvBarcodes.Items.Clear;
//QueryBarcodes.SQL.Clear; // nicht notwendig...passiert mit Zuweisung von "SQL.Text" automatisch
//QueryBarcodes.Params.Clear; // nicht notwendig...passiert mit Zuweisung von "SQL.Text" automatisch
QueryBarcodes.SQL.Text := 'SELECT ID,Produktname,Hersteller,Inhalt,Lieferant,Preis,Barcode,Kommentar FROM barcodes'; //Leerzeichen
QueryBarcodes.Open;
//schreiben der Daten aus der Datenbak "barcodes" in die Listview
while not QueryBarcodes.Eof do
begin
  Item := mainFrm.lvBarcodes.Items.Add; // Name
  Item.Caption := QueryBarcodes.FieldByName('ID').AsString;
  Item.SubItems.Add(QueryBarcodes.FieldByName('Produktname').AsString);
  Item.SubItems.Add(QueryBarcodes.FieldByName('Hersteller').AsString);
  Item.SubItems.Add(QueryBarcodes.FieldByName('Inhalt').AsString);
  Item.SubItems.Add(QueryBarcodes.FieldByName('Lieferant').AsString);
  Item.SubItems.Add(QueryBarcodes.FieldByName('Preis').AsString);
  Item.SubItems.Add(QueryBarcodes.FieldByName('Barcode').AsString);
  Item.SubItems.Add(QueryBarcodes.FieldByName('Kommentar').AsString);
  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.
QueryBarcodes.Close;
Frage:
Ohne dir auf die Füße treten zu wollen...Wie kommt man als Anfänger an eine XE7 Enterprise?

Dann viel Spaß...

Geändert von haentschman (26. Aug 2017 um 09:24 Uhr)
  Mit Zitat antworten Zitat