Delphi-PRAXiS
Seite 3 von 3     123   

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?

DeddyH 22. Apr 2017 20:24

AW: Kundenliste
 
Und wenn Du nach dem Aufruf von RemoveFromDB das explizite Free einmal weglässt? Standardmäßig gibt die TObjectList das zu löschende Element selbst frei, das geht aber in die Hose, wenn Du das vorher schon tust.

EdAdvokat 22. Apr 2017 20:42

AW: Kundenliste
 
so sieht nun die löschen-Methode aus:
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);
  end;
end;
ich habe erkenntlich die Freigabe Free herausgenommen und es geht. Ja es geht!!!
Ich habe wirklich Hochachtung vor Euch Fachleuten, doch wie kommt man von der 5Oldi- Kreisklasse wenigstens in die 4.Oldi- Kreisklasse ohne aufdringlich solche Fragen zu stellen?
Ich danke für die Hilfe.

DeddyH 22. Apr 2017 20:48

AW: Kundenliste
 
Außer üben, üben und nochmals üben sowie viel Nachlesen und Nachvollziehen habe ich spontan keinen Vorschlag.

p80286 22. Apr 2017 20:49

AW: Kundenliste
 
Vor dem Aufstieg bleibt die Frage "wofür ist zqYMain gut?"

Gruß
K-H

EdAdvokat 22. Apr 2017 21:04

AW: Kundenliste
 
nimm mir doch bitte nich die Freude darüber, dass es funktioniert. Ich sollte doch der Querry eine connection zuweisen, damit das Löschen funktioniert. Wohl doch der Abstieg in die 6. grand-Oldi-Liga?!:)
war all das doch Quatsch?

p80286 22. Apr 2017 21:08

AW: Kundenliste
 
Hier meine ich:

Delphi-Quellcode:
procedure TFRMMainCustomer.btnDeleteClick(Sender: TObject);//löschen (update)
var zqyMain: TZQuery;
begin
    zqyMain:=TZQuery.Create(nil);
    zqyMain.connection:=conMain;
Zumindest ist ein offensichtlicher Zweck nicht zu erkennen!

Gruß
K-H

Hobbycoder 22. Apr 2017 21:18

AW: Kundenliste
 
Zitat:

Zitat von EdAdvokat (Beitrag 1368680)
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);
  end;
end;

Hast du eigentlich überhaupt irgendwas von dem verstanden, was du die ganze Zeit in einem Programm machst?
Ich habe so langsam das Gefühl, du meinst, wenn du so halbwegs alles zusammen-kopierst wird das schon irgendwie funktionieren.
Wenn du dir die obige Methode mal anschaust, dann definiert du dort eine zqyMain, die du nie benutzt und auch nie freigibst, und die logischerweise bei jedem Löschen aber neu erzeugt wird. Heißt, nach 10mal Löschen hast du 10 Objecte vom Typ TZQuery, die als Speicherleichen zurück bleiben.

Ich gebe dir nochmals den Rat bei den Basics anzufangen und dir erst mal klar zu machen, was Objekte und wie man damit umgeht. Und vor allem wie der Debugger funktioniert, wie man ihn bedient und wie man sich den Inhalt von Objecten und Variablen anzeigen lassen kann. So schwer ist das nun auch nicht.

Denn, so Sätze wie
Zitat:

Zitat von EdAdvokat (Beitrag 1368678)
Was ist das nun?

zeigen, dass du a) sehr schnell dich auf die Hilfe und Vorlagen der User hier im Forum verläßt und b) du scheinbar nicht wirklich den Debugger benutzt.

Zitat:

Zitat von EdAdvokat (Beitrag 1368678)
Wie und wo soll man all da lernen können, was mit so einem kleinen Programmchen zusammenhängt.

Aus Büchern, dem Internet, Tutorials und sich die Zeit nehmen erst mal einen Teil zu verstehen, bevor man mit dem nächsten anfängt.

Zitat:

Zitat von EdAdvokat (Beitrag 1368678)
Ich habe in meinem bisherigen Leben 2 Studien (auf völlig anderen Gebieten, als der Informatik) sehr erfolgreich absolviert.

Das Wissen für diese Fachbereiche hast du dir sicherlich auch durch viel lesen in entsprechende Fachbüchern angeeignet und dir bestimmt auch die Zeit genommen, jeden Teilbereich zu verstehen, bevor du mit dem nächsten angefangen hast.

Zitat:

Zitat von EdAdvokat (Beitrag 1368678)
Ich könnte noch 10 Bücher über OOP lesen, doch hier an so einer Stelle weiss ich einfach nicht weiter

Selbst wenn du 100 Bücher über OOP gelesen hast, so wirst du trotzdem die Funktionsweisen der speziellen Klassen und Methoden in der Hilfe nachlesen müssen, weil diese nun mal sich nicht automatisch durch das Wissen was OOP ist von selbst erklären.

Also wirst du auch deinen Code mal länger als 10 Minuten anschauen müssen, mal eine Nacht drüber schlafen und dann noch mal schauen, wo dein Fehler liegt.

EdAdvokat 22. Apr 2017 21:41

AW: Kundenliste
 
Ok. Hobbycoder einiges sicher schon. Einiges ist der Situation geschuldet,möglichst zeitnah Antworten zu geben, die dann doch zu unüberlegt waren und einiges kann ich bislang wirklich noch nicht überblicken, weil mir das Wissen noch fehlt. Ok, mein Problem. Ich arbeite daran.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:52 Uhr.
Seite 3 von 3     123   

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