Einzelnen Beitrag anzeigen

100nF

Registriert seit: 7. Nov 2004
639 Beiträge
 
#1

VirtualStringTree: Dynamisches Array in Klasse verwenden?

  Alt 24. Okt 2011, 18:02
Hallo zusammen,

Ich beschäftige mich wiedermal mit der VirtualStringTree. Dabei arbeite ich mit einer Klasse dieser Form (Hab Sie der Übersichtlichkeit halber auf nur 2 Eigenschaften gekürzt):

Delphi-Quellcode:
type
  TTeil = class (TComponent)
      private
          fID: Integer;
          fName: String;
        published
          property ID: integer read fID write fID;
          property Name: string read fName write fName;
      end;
      pTeil = ^TTeil;
Das Hinzufügen von Datensätzen zur VST geschieht genau so wie es im damaligen Stammtisch-Video gezeigt wurde:
Delphi-Quellcode:
Teil := TTeil.create(nil);
Teil.ID := TeileID;
Teil.Name := 'BlaBla' ;
VST_Teile.AddChild(nil,Teil);
Und so werden die Nodes gespeichert und geladen:
Delphi-Quellcode:
procedure TF_Main.VST_TeileSaveNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Stream: TStream);
var
  Teil: TTeil;
begin
  Teil:=TTeil(Sender.GetNodeData(node)^);
  Stream.WriteComponent(Teil);
end;

procedure TF_Main.VST_TeileLoadNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Stream: TStream);
var
  Teil: TTeil;
  p: pTeil;
begin
  Teil:=Stream.ReadComponent(nil) as TTeil;
  p:=sender.GetNodeData(node);
  p^:=Teil;
end;
Das funktioniert soweit auch alles.
Wie sich vielleicht schon vermuten lässt, handelt es sich bei den Datensätzen um Teile. Es soll also eine kleine Bauteilverwaltung werden Nun kann man das selbe Teil ja auch von verschiedenen Anbietern kaufen, was dann bedeutet, dass ich jedem Bauteil (Datensatz) mehrere Lieferanten, Bestellnummern und Preise zuordnen können muss. Da ich mich dabei nicht auf z.B. maximal 3 Anbietern festlegen will, muss das ganze ja dynamisch werden. Also mit Dynamischen Arrays würde ich mal schätzen.

Und genau da liegt jetzt mein Problem. Dem VST muss ja ganz am Anfang mal die Grösse zugewiesen werden:
VST_Teile.NodeDataSize := SizeOf(TTeil);
So, und wenn nun mein TTeil plötzlich dynamisch wird, wird wohl diese Initialisierung scheitern.

Übrigens wäre es schön wenn ich die, ich nenne sie mal Einkaufsinformationen, auch mit einer Klasse erstellen könnte, da ich dann diese Informationen wiederum ganz einfach in einer separaten VST darstellen kann:
Delphi-Quellcode:
type
  TEinkaufsinformation = class (TComponent)
      private
          fLieferantenID: Integer;
          fBestellnummer: String;
          fPreis: Extended;
      published
          property LieferantenID: integer read fLieferantenID write fLieferantenID;
          property Bestellnummer: String read fBestellnummer write fBestellnummer;
          property Preis: Extended read fPreis write fPreis;
      end;
Und dann mache ich einfach mal ein Array dazu:
type TEinkaufinformationen = Array of TEinkaufsinformation;
Das war jetzt einfach so ein bisschen Brainstorming, ich weiss nämlich nicht was ich nun mit diesem Array genau machen soll Irgendwie müsste das jetzt der Klasse TTeil hinzugefügt werden...nur wie?

Bitte schlagt mich nicht. Ich befürchte dass mein Ansatz schon ziemlich falsch sein könnte, mir fehlt einfach die Erfahrung. Ich habe schon nach Ansätzen im Internet gesucht, aber ich befürchte mein Vorhaben ist da schon sehr speziell, das ist schwierig da irgendwas ähnliches zu finden.

Also: Wie kann ich der Klasse TTeil beibringen, dass Sie einen dynamischen Inhalt annimmt und diesen auch korrekt speichern / laden kann?

Ich wäre extrem dankbar wenn mir da jemand auf die Sprünge helfen könnte!

mfg
  Mit Zitat antworten Zitat