AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Fehler beim Programm beenden
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler beim Programm beenden

Ein Thema von Jens Hartmann · begonnen am 19. Okt 2015 · letzter Beitrag vom 15. Nov 2015
Antwort Antwort
bcvs

Registriert seit: 16. Jun 2011
674 Beiträge
 
Delphi 12 Athens
 
#1

AW: Fehler beim Programm beenden

  Alt 30. Okt 2015, 07:04
Zusätzlich wäre es schon, wenn mir mal jemand den Vorschlag mit der Objektliste erklären könnte.

Danke schon mal. Gruß Jens
Ich mache es mal anhand von deinem Beispiel. Ist doch ganz einfach:

Du definiert die eine ObjectList. Da ich Delphi 2007 habe, nehme ich zwangsläufig die einfache TOjectList aus der Unit Contnrs;

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    vstKunden: TVirtualStringTree;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    KundenList:TObjectList; // <-----
  public
    { Public-Deklarationen }
  end;
Beim Einlesen des Trees passiert folgendes:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  I : Integer;
  CustomerNode, BuildingNode, SystemNode: PVirtualNode;
  Daten: PRKundenDaten;
  fk:TOCustomers;
  fo:TOBuilding;
  fs:TOSystems;
begin
  vstKunden.NodeDataSize := SizeOf(TRKundenDaten);

  KundenList:=TObjectList.create; // <--- Instanz der ObjectList erzeugen;

  // Besser wäre es, alles ab hier in eine eigene Methode auszulagern,
  // damit man das Einlesen des Trees vom Erzeugen des Liste trennen kann.
  // Vielleicht soll der Tree ja wärend der Lebenszeit des Form nochmal neu eingelesen werden.
  vstKunden.BeginUpdate;
  try
    vstKunden.Clear;

    //CustomerNode := vstKunden.AddChild(nil); wozu soll das gut sein?
    //vstKunden.InvalidateNode(CustomerNode);

    for I := 0 to 10 do
    begin
      BuildingNode := vstKunden.AddChild(nil);
      Daten := vstKunden.GetNodeData(BuildingNode);

      fk := TOCustomers.Create; // <---- Datenobjekte erzeugen
      fo := TOBuilding.Create; // Wahrscheinlich brauchst du nur ein Objekt pro Node,
      fs := TOSystems.Create; // das dann die verschiedenen Node-Typen verwalten kann.
                                // Das ist aber ein anderes Thema

      Daten^.FKundedaten := fk; // <---- Datenobjekte dem VST übergeben
      Daten^.FObjektdaten := fo;
      Daten^.FSystemdaten := fs;

      KundenList.Add(fk); // <---- Datenobjekte der Liste hinzufügen
      KundenList.Add(fo); // Die Objekte gehören jetzt der ObjectList
      KundenList.Add(fs);
    end;

    vstKunden.SortTree(0, sdAscending, True);
  finally
    vstKunden.EndUpdate;
  end;
end;
Zum Schluss musst du nur die ObjectList wieder freigeben. Damit werden automatisch auch die darin enthaltenen Objekte freigegeben. Der VST muss sich um nichts mehr kümmern.

Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  KundenList.free;
end;
  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 06:12 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