Einzelnen Beitrag anzeigen

Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#24

AW: Fehler beim Programm beenden

  Alt 24. Okt 2015, 18:50
Hallo nochmal,

ich glaube das ich bei der Definition der Datenhaltung (Objekt, Record) schon was verbessern muss. Eventuell kann mit hier jemand einen Tip geben...

Aktuell habe ich 3 Klassen "Kunde", "Objekt" und "System"

Der Aufbau sieht wie folgt aus:

Delphi-Quellcode:
{ TObject für die Kundendaten }
type
  TOCustomers = class(TObject)
    private
      FID : integer; //ID
      FESID : integer; //ESID
      FName : string; //Name des Kunden
      FOrt : string; //Ort des Kunden
      FStraße : string; //Straße des Kunden
      FAnsprechpartnerId : integer; //Ansprechpartnernummer
      FAnsprechpartner : string; //Ansprechpartner
      FAnsPosition : string; //Position/Stellung
      FEMail : string; //EMail des Ansprechpartners
      FTel1 : string; //Telefonnummer 1 des Ansprechpartners
      FTel2 : string; //Telefonnummer 2 des Ansprechpartners
      FFax : string; //Faxnummer des Ansprechpartners
      FBemerkung : string; //Kunden Zusatzinformation
    public
      property Kunden_Kundennummer : integer read FID write FID;
      property Kunden_ESKundennummer : integer read FESID write FESID;
      property Kunden_Kundenname : string read FName write FName;
      property Kunden_Ort : string read FOrt write FOrt;
      property Kunden_Straße : string read FStraße write FStraße;
      property Kunden_Bemerkung : string read FBemerkung write FBemerkung;
      property Ansprechpartner_Id : integer read FAnsprechpartnerId write FAnsprechpartnerId;
      property Ansprechpartner_Name : string read FAnsprechpartner write FAnsprechpartner;
      property Ansprechpartner_Position : string read FAnsPosition write FAnsPosition;
      property Ansprechpartner_EMail : string read FEMail write FEMail;
      property Ansprechpartner_Telefon1 : string read FTel1 write FTel1;
      property Ansprechpartner_Telefon2 : string read FTel2 write FTel2;
      property Ansprechpartner_Fax : string read FFax write FFax;
  end;

//Das Object für die Objektdaten und Systemdaten ist ähnlich. Teilweise andere Felder
Den Bezug zum VST stelle ich über das NodeLevel her.

Delphi-Quellcode:
  NodeLevel 0 = Datenbankpfad
  NodeLevel 1 = Kundendaten
  NodeLevel 2 = Objektdaten
  NodeLevel 3 = Systemdaten
  NodeLevel 4 = Menüpunkte zum System
Beim Click auf den jeweiligen Knoten (VST in Baumstruktur auf der Linken Programmseite), werden auf der rechten Seite in verschiedenen Frames die zugehörigen Datenangezeigt und zum editieren etc. zur Verfügung gestellt.

Da ich drei Objekte habe, stellt sich mir die Frage erneut nach dem NodeDataSize . Wie geh man sowas an.

Vorstellen könnte ich mir folgende alternativen.

1.

Das Object "TOCustomers" bekommt ein Feld Objektdaten array of TOBuildings und das Object TOBulidings bekommt ein Feld Systemdaten array of TOSystems 2.

Die Objecte liegen ja je in einer eigenen Unit. Diese könnte man ja eventuell in einen Record einbinden:

Delphi-Quellcode:
type
  TRKundenDaten = record
    FKundedaten : TOCustomers;
    FObjektdaten : TOBuildings;
    FSystemdaten : TOSystems;
  end;

  PRKundenDaten = ^TRKundenDaten;
Vieleicht gibt es ja noch bessere/sinnvollere Wege. Die Variante 2 scheint mir aktuell am sinnvollsten. Dabei würde ich einen Record verwenden, welchen ich dann auch dem NodeDataSize zuweisen könnte.

vst.NodeDataSize:=sizeof(TRKundenDaten); Weiterhin, wäre dann das OnFreeNode klar...

Delphi-Quellcode:
procedure TForm1.vstFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
  daten: PRMeineDaten;
begin
  daten := vst.GetNodeData(node);
  daten^.FKundendaten.free;
  daten^.FObjektdaten.free;
  daten^.FSystemdaten.free;
end;
Ich hoffe, das ich nicht ganz auf dem Holzweg bin...
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat