Thema: Kundenliste

Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#84

AW: Kundenliste

  Alt 21. Apr 2017, 19:42
Mach's dir doch nicht so schwer.
Definiert doch einfach in TCustomer die Funkton

Delphi-Quellcode:
RemoveFromDB(con: TZConnection); //Kannst die auch DeleteFromDB() nennen, oder auch HansWurst(), ist völlig egal.
var
  q: TZQuery;
begin
  q:=TZQuery.Create(nil);
  try
    q.sql.Text:='Delete from Customer where id=:id';
    q.params.parseSQL(q.sql.text, True);
    q.params.paramvalue['id']:=self.id;
    q.execSQL;
  finally
    q.free;
  end;
end;
Diese Funktion löscht den Datensatz mit der id aus der DB.
Und unter dem Button "Löschen" schreibst du jetzt einfach:

Delphi-Quellcode:
begin
  if ListView.Selected<>Nil then
  begin
    CustomerList[ListView.Selected.Index].RemoveFromDB(DBConnection);
    Customerlist[ListView.Selected.Index].Free;
    CustomerList.Delete(ListView.Selected.Index);
    ListView.Items.Delete(ListView.Selected.Index);
  end;
end;
(Das hab ich jetzt mal aus dem Kopf hier geschrieben. Kann sein, dass ich die Variablen nicht ganz korrekt benannt habe, ist halt ohne Codervervollständigung)
Zur Erklährung:
Als erstes sagst du dem Object in CustomerList, dass es sich selbst aus der DB löschen soll.
Danach gibt's du das Object Frei, weil du es ja nicht mehr brauchst (Laut Hilfe würde nämlich TObjectList.Delete nur den Eintrag löschen, nicht aber das Object selbst freigeben).
Anschließend wird eben mit CustomerList.Delete(...) eben der Eintrag aus der ObjectListe entfernt.
Und damit der Index der nachfolgenden ListView-Einträge wieder passt, wird auch die Zeile in der ListView gelöscht, somit ersparst du dir das neuladen über FuelleListView, was ja sehr lange dauert.

Die Hilfe dazu findest du, in dem im Sourcecode der Klasse auf dem Wort "TObjectList" den Cursor setzt und einfach mal F1 drückst. Dann
Dannach wählst du einen der beiden Einträge aus, entweder "System.Generics.Collections.TObjectList" oder "System.Contnrs.TObjectList". Welchen ist egal.
Dann findest du oben einen Link zu den Methoden. Und dort auch die Hilfe zu Delete.

Dort steht dann unter anderem:
Hinweis: Der für das Element reservierte Speicherplatz wird von Delete nicht freigegen.

Deswegen habe ich noch das Customerlist[ListView.Selected.Index].Free; mit eingebaut. Man könnte auch die Methode Notify der TObjectList aufrufen, so wie es in der Hilfe steht.
Möglicherweise könnte man das mit TObjectList.Remove() erledigen, denn da wird (glaube ich) das Object automatisch mit freigegeben. Probier es einfach mal aus.

Geändert von Hobbycoder (21. Apr 2017 um 19:45 Uhr)
  Mit Zitat antworten Zitat