Delphi-PRAXiS
Seite 9 von 10   « Erste     789 10      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Kundenliste (https://www.delphipraxis.net/192392-kundenliste.html)

EdAdvokat 21. Apr 2017 15:38

AW: Kundenliste
 
bedeutet das, dass ich die procedure Delete(idx:integer); in meiner bestehenden CustomerList deklarieren sollte, etwa so:
Delphi-Quellcode:
type
  TCustomerlist : Class(Tobjectlist); //also die bei mir bestehende TCustomerlist?

  procedure Delete(idx:integer); //neu aufnehmen
 
  end;

procedure TCustomerList.Delete(idx:integer); { lÖSCHEN DES DATENSATZES AUS DER lISTE }
begin
  if self.id>-1 then DeleteFromDB(self.id); { und aus der DB }
  inherited dELETE;
end;
Alles weitere müßte natürlich dann noch geschrieben werden. Nur im Prinzip so?

Jumpy 21. Apr 2017 16:00

AW: Kundenliste
 
Jupp. Schau dir wie gesagt mal an, wie du das bei Remove oder so machst.

EdAdvokat 21. Apr 2017 17:00

AW: Kundenliste
 
Also war doch Mist, oder was bedeutet Jupp?
Neustart: myList(oder wie auch immer) leite ich von meiner TCustomerList ab. Also wie ihr geschrieben habt, da ich ja, wie aus meinem Programm ersichtlich bereits eine
Delphi-Quellcode:
CustomerList.Delete(lvCustomer.Selected.Index);
habe, mit der ich den DS aus der objectlist gelöscht habe. Nun geht es also an das Überschreiben dieser Delete-Methode in der Form wie ihr es geschrieben habt, damit ich dann mit der "neuen Delete-Methode" (also überschreiben) genau das machen kann was die bisher implementierte Delete-Methode nicht konnte???
Nun habe ich in system.contnrs und system.generetics.colletions herumgestöbert. Wo ist denn die in der objectlist enthaltene delete-Methode, die ich verwendet habe definiert?

Hobbycoder 21. Apr 2017 18:42

AW: Kundenliste
 
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.

EdAdvokat 22. Apr 2017 09:16

AW: Kundenliste
 
Nochmals Danke. Deine Antwort enthielt mehr als ich erwartet hatte. Ich habe nach dem nochmaligen Durchsehen der Posts viel dazugelernt, vor allem in der Praxis selbst. Die vielen Abhandlungen über die Grundsatzfragen zu OOP sind durchaus verständlich, doch wenn es dann praktisch wird, kommt das Grübeln. Auch hätte ich nie gedacht, dass so ein überschaubares Projekt so viel Potential enthält.

EdAdvokat 22. Apr 2017 18:09

AW: Kundenliste
 
es ist mir wirklich peinlich, doch es soll wohl nicht sein. Ich habe nun dem Vorschlag von Hobbycoder folgend die Function:
Delphi-Quellcode:
function RemovefromDB(con: TZConnection):integer;
mit einem Rückgabewert Integer ausgerüstet und in Tcustomer aufgenommen. Die Function so geschrieben, wie vorgegeben und beim Aufruf "löschen" ebenfalls den nachfolgenden Code eingefügt:
Delphi-Quellcode:
if lvCustomer.Selected<>nil then
  begin
    CustomerList[lvCustomer.Selected.Index].RemoveFromDB(conMain);
    Customerlist[LVCustomer.Selected.Index].Free;
    CustomerList.Delete(LVCustomer.Selected.Index);
    LVCustomer.Items.Delete(LVCustomer.Selected.Index);
  end;
Also für (DBConnection) den connection aus meinem Programm(conMain) so wie bei LoadFormDB und SaveToDB eingesetzt.
Alles läuft ohne Fehlermeldung durch, doch wenn ich im kompilierten Programm den Button "löschen" betätige meldet er:
Zitat:

"Database connection component ist not assigned"
.
Diese Meldung kommt doch weder bei LoadfromDB noch bei SaveToDB vor, warum klappt das beim Löschen nicht? In diesen beiden Methoden wird doch auch conMain aufgerufen und da klappt es.
Habe dann in der löschen-Routine am Beginn explizit nochmals eine connetion hergestellt, doch auch das bringt nicht den Erfolg -wieder die gleiche Meldung. Wie sollte ich denn welcher Komponente noch was zuweisen? Es gibt die zqrMain (Querry) und die TZConnection.
Irgendwie habe ich das Gefühl, dass es nicht sein soll.
Ich wollte Euch eigentlich nicht mehr nerven, doch andererseits will ich auch zeigen, dass ich mich mit der Sache beschäftige und nicht sofort um Hilfe ersuche. Doch jetzt weiss ich an dieser Stelle wirklich nicht weiter und die Hinweise aus dem I-Net sind auch nicht zielführend.:?::pale:

DeddyH 22. Apr 2017 18:24

AW: Kundenliste
 
Was wird mit dem übergebenen Connection-Parameter denn gemacht? Nix. Der war einfach dafür gedacht, dem dynamisch erzeugten Query diese Connection zuzuweisen, aber das muss man dann auch tun. Eigentlich steht genau das ja auch in der Fehlermeldung.

EdAdvokat 22. Apr 2017 19:10

AW: Kundenliste
 
Ich poste mal die maßgebliche Procedure löschen:
Delphi-Quellcode:
procedure TFRMMainCustomer.btnDeleteClick(Sender: TObject);//löschen (update)
var zqyMain: TZQuery;
begin
   zqyMain:=TZQuery.Create(nil);
   zqyMain.connection:=conMain;
   if lvCustomer.Selected<>nil then
  begin
    CustomerList[lvCustomer.Selected.Index].RemoveFromDB(conMain);
    Customerlist[LVCustomer.Selected.Index].Free;
    CustomerList.Delete(LVCustomer.Selected.Index);
    LVCustomer.Items.Delete(LVCustomer.Selected.Index);

   {CustomerList.Delete(lvCustomer.Selected.Index); //akt. Datensatz löschen
    CustomerList.SavetoDB(conMain);
    FuelleListView; }
  end;
end;
Also es soll der dynamisch erzeugen querry eine Connection zugewiesen werden. Habe ich das nicht mit zqrMain.connection:=conMain getan?
Es ist mir wieder mal zu schwierig.

DeddyH 22. Apr 2017 19:34

AW: Kundenliste
 
Und woher soll die Query, die in RemoveFromDB erzeugt wird, davon wissen?

EdAdvokat 22. Apr 2017 20:06

AW: Kundenliste
 
Die removeFromDB-Methode:
Delphi-Quellcode:
function TCustomer.RemovefromDB(con: TZConnection):integer;
var
  q: TZQuery;
begin
  q:=TZQuery.Create(nil);
  q.connection:=con;
  try
    q.sql.Text:='Delete from Warenverkauf1 where id= :id';
    q.params.parseSQL(q.sql.text, True);
    q.params.paramvalues['id']:=self.id;
    q.execSQL;
  finally
    q.free;
  end;

end;
gibt nach dem Löschen-ButtonClick die Meldung "ungültige Zeigeroperation" aus. Nach dem loadFormDB bzw. Neustart des Programms ist jedoch festzustellen, dass der entsprechende Datensatz gelöscht wurde.
Was ist das nun?
Mir wird wieder einmal meine schiere Größe bewußt. Wie und wo soll man all da lernen können, was mit so einem kleinen Programmchen zusammenhängt. Ich habe in meinem bisherigen Leben 2 Studien (auf völlig anderen Gebieten, als der Informatik) sehr erfolgreich absolviert, doch hier in einer Hobbybeschäftigung ist es so schwer die jeweils nächste Stufe wirklich zu finden. Ich könnte noch 10 Bücher über OOP lesen, doch hier an so einer Stelle weiss ich einfach nicht weiter. Habe ich nun dem Querry die richtige Connection gegeben?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:38 Uhr.
Seite 9 von 10   « Erste     789 10      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz