AGB  ·  Datenschutz  ·  Impressum  







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

Viele Objekte ordentlich(!) erstellen

Ein Thema von TheMiller · begonnen am 19. Dez 2009 · letzter Beitrag vom 20. Dez 2009
Antwort Antwort
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Viele Objekte ordentlich(!) erstellen

  Alt 19. Dez 2009, 18:51
Hallo,

hab ein etwas kurioses Problem. Ich vermute, es liegt daran, wie ich die Objekte erstelle - es ist noch etwas Neuland für mich.

Also, ich habe mehrere Klassen: Kategorie-Klasse, Artikel-Klasse und eine Kategorien-Klasse (sie enthält alle Kategorien). Jedem Kategorie-Objekt kann man mehrere Artikel-Objekte hinzufügen.

Mein Quelltext sieht demnach so aus:

Delphi-Quellcode:
procedure TForm1.UpdateList;
var
  i,j: Integer;
  Item, Parent: TTreeNode;
  expanded: TIntArray;
  Kategorie: TKategorie;
  Artikel: TArtikel;
begin
  //Root-Kategorie (ID: -1) erstellen
  Kategorie:=TKategorie.Create;
  Kategorie.ID:=-1;
  KomKats.Add(Kategorie); //Typ: TKategorien Mehrzahl(!)
  Kategorie:=nil;
  //...
  while not (Form1.ZQuery1.Eof) do
  begin
    Kategorie:=TmKategorie.Create;
    Kategorie.ID:=Form1.ZQuery1.FieldByName('katid').AsInteger;
    Kategorie.Titel:=Form1.ZQuery1.FieldByName('titel').AsString;
    Kategorie.ChildFrom:=Form1.ZQuery1.FieldByName('parent').AsInteger;
    KomKats.Add(Kategorie);
    Form1.Zquery1.Next;
  end;
  
  //...
  while not (Form1.ZQuery1.Eof) do
  begin
    Artikel:=TArtikel.Create;
    Artikel.ID:=Form1.ZQuery1.FieldByName('ARTIKELID').AsInteger;
    Artikel.Titel:=utf8encode(Form1.ZQuery1.FieldByName('TITEL').AsString);
    Artikel.Kategorie:=Form1.ZQuery1.FieldByName('KID').AsInteger;
    KomKats.Kategorie[KomKats.getIndexById(Artikel.Kategorie)].AddArtikel(Artikel);
    Form1.ZQuery1.Next;
  end;

  //...
  //Kategorie-Objekte durchgehen und diese inkl. dessen Artikel im TreeView anzeigen.
end;
Sodele... Dieser Code hat mal funktioniert, bis ich die in der SQL-Query das "ORDER-BY"-Kriterium geändert habe. Seitdem kamen AVs. Habe ich das ORDER-BY wieder hinzugefügt, hat es wieder funktioniert.
Ich denke, ich mache einen Fehler beim Objekte erstellen und Objekte (nicht-)freigeben. Zumal es bei dieser Lösung so ist, dass jede Kategorie den Titel der ersten Kategorie hat. So denke ich, ich muss das Kategorie-Objekt "löschen" und ein neues erstellen, wenn ein neuer Datensatz geladen wurde (in der while-Schleife).

Bitte gebt mir Tipps und sagt mir, was ich falasch mache!

Vielen Dank
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Viele Objekte ordentlich(!) erstellen

  Alt 19. Dez 2009, 18:57
Schau Dir mal dieses Codeschnipsel an:
KomKats.Kategorie[KomKats.getIndexById(Artikel.Kategorie)].AddArtikel(Artikel); Daraus würde ich dies machen:
Delphi-Quellcode:
kat := KomKats.FindKategorieByName(Artikel.Kategorie);
if not Assigned(kat) then
  ShowMessageFmt('Kategorie %s nicht gefunden',[Artikel.Kategorie])
  // hier könnte auch eine Exception statt ShowMessage stehen
else
  kat.AddArtikel(Artikel);
PS:
du schreibst überall Form1.[irgendwas].
Lass das Form1. mal weg, denn es schadet nur.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#3

Re: Viele Objekte ordentlich(!) erstellen

  Alt 19. Dez 2009, 19:46
Vielen Dank.

Das Form1. habe ich nur bei der ZEOS-Komponente. Ist so eine Angewohnheit - sonst, bei anderen Komponenten mache ich das nicht.

Das mit den Objekten erstellen mache ich aber richtig? Ich muss nicht in jedem Durchlauf ein neues Objekt erstellen und am Ende auch nicht freigeben - es verschwindet sonst nämlich auch aus der Object-List (Kategorien).
Wenn das so richtig ist, wie bekomme ich es dann hin, dass im nächsten Durchlauf das Objekt mit allen Eigenschaften wieder "geleert" ist und so nicht fälschlicherweise Daten eingetragen werden, die vom vorherigen Durchlauf kommen.

Ist doof beschrieben - ich hoffe ihr wisst, was ich meine!

Danke im Voraus
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Viele Objekte ordentlich(!) erstellen

  Alt 19. Dez 2009, 20:06
Wichtig ist, wer den "Besitz" (Ownership) über die Objekte übernimmt.
Das Objekt, das den Besitz über ein anderes übernommen hat ist verantwortlich für die Freigabe.
Es darf nur einen Besitzer geben.
Gibt es keinen Besitzer entsteht ein Speicherleck; gibt es mehr als einen folgt eine mehrfache Freigabe.
Die Klasse TObjectList hat im Constructor Create() einen Parameter, der angibt, ob der Besitz übernommen werden soll.
Bei den Objekte der Klasse TKategorie wäre der Besitzer "KomKats" (class(TKategorien)).

Bei den Artikel wird das schon schwieriger.
Ein Artikel könnte mehreren Kategorien angehören.
Wenn dies der Fall ist, kann die Klasse TKategorie nicht den Besitz über die Artikel übernehmen, sondern es müsste dann ein separate Artikelliste geben.
Diese Artikelliste könnte von "KomKats" geführt werden.

Zitat von DJ-SPM:
wie bekomme ich es dann hin, dass im nächsten Durchlauf das Objekt mit allen Eigenschaften wieder "geleert" ist und so nicht fälschlicherweise Daten eingetragen werden, die vom vorherigen Durchlauf kommen.
Das kann gar nicht passieren, schlieslich erzeugst du in jedem Durchlauf ein neues Objekt.
Dieses Objekt hat keine Daten vom Vorgänger.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#5

Re: Viele Objekte ordentlich(!) erstellen

  Alt 19. Dez 2009, 21:03
Ok, dann mach ich das ja soweit richtig. Das freut mich. Das die Object-List den Besitz übernimmt, dass wusste ich - genauso wie sie die Objekte wieder freigibt.

Wobei ich mir nicht sicher war, ist die Stelle, an der die neuen Objekte erzeugt werden. Immerhin ist es immer die gleiche Variable, die zudem auch nicht freigegeben wird - das hat mich etwas verwirrt...

Was die "Mehrfachwerte" angeht: Da habe ich wohl einen "Anzeigefehler".

Nur weis ich nicht, woher diese blöde AV kommt... Auch durch Breakpoints setzen und debuggen konnte ich es nicht herausfinden. Mal hier, mal da...

Bin aber grad nicht am PC, schaue "Schlag den Raab"

Vielen Dank für eure Hilfe!
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#6

Re: Viele Objekte ordentlich(!) erstellen

  Alt 20. Dez 2009, 10:26
Hallo,

ich habe den Fehler mit der AV gefunden. Den hätte keine finden können - er hing mit den Daten aus der Datenbank zusammen.

Aber immerhin bin ich jetzt um einiges schlauer, was die OOP betrifft.

Vielen Dank!
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:45 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