AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kundenliste

Ein Thema von EdAdvokat · begonnen am 14. Apr 2017 · letzter Beitrag vom 22. Apr 2017
Antwort Antwort
Seite 9 von 10   « Erste     789 10      
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
414 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#81

AW: Kundenliste

  Alt 21. Apr 2017, 15:38
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?
Norbert
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#82

AW: Kundenliste

  Alt 21. Apr 2017, 16:00
Jupp. Schau dir wie gesagt mal an, wie du das bei Remove oder so machst.
Ralph
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
414 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#83

AW: Kundenliste

  Alt 21. Apr 2017, 17:00
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 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?
Norbert
  Mit Zitat antworten Zitat
Hobbycoder

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

AW: Kundenliste

  Alt 21. Apr 2017, 18: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 18:45 Uhr)
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
414 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#85

AW: Kundenliste

  Alt 22. Apr 2017, 09:16
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.
Norbert
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
414 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#86

AW: Kundenliste

  Alt 22. Apr 2017, 18:09
es ist mir wirklich peinlich, doch es soll wohl nicht sein. Ich habe nun dem Vorschlag von Hobbycoder folgend die Function:
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.
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#87

AW: Kundenliste

  Alt 22. Apr 2017, 18:24
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
414 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#88

AW: Kundenliste

  Alt 22. Apr 2017, 19:10
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.
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#89

AW: Kundenliste

  Alt 22. Apr 2017, 19:34
Und woher soll die Query, die in RemoveFromDB erzeugt wird, davon wissen?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
414 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#90

AW: Kundenliste

  Alt 22. Apr 2017, 20:06
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?
Norbert
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 9 von 10   « Erste     789 10      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 Uhr.
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