AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi VirtualStringTree: Dynamisches Array in Klasse verwenden?
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualStringTree: Dynamisches Array in Klasse verwenden?

Ein Thema von 100nF · begonnen am 24. Okt 2011 · letzter Beitrag vom 2. Nov 2011
Antwort Antwort
Seite 1 von 2  1 2      
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
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: VirtualStringTree: Dynamisches Array in Klasse verwenden?

  Alt 24. Okt 2011, 18:11
Würde anstatt eines Arrays eine TList nehmen.
Edit: oder eine TObjectList.
Nr.1 Delphi-Tool: [F7]

Geändert von ConnorMcLeod (24. Okt 2011 um 18:14 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#3

AW: VirtualStringTree: Dynamisches Array in Klasse verwenden?

  Alt 24. Okt 2011, 18:26
Ich kenn mich mit VST nicht aus, aber anstatt dem Objekt würde ich nur eine ID im Knoten speichern. Die Daten selbst sind dann in einer separaten Liste.

Ist es das, was ConnorMcLeod meint?

Man sollte grundsätzlich Datenhaltung und Visualisierung strikt trennen.
  Mit Zitat antworten Zitat
100nF

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

AW: VirtualStringTree: Dynamisches Array in Klasse verwenden?

  Alt 24. Okt 2011, 18:40
Zitat:
Würde anstatt eines Arrays eine TList nehmen.
Edit: oder eine TObjectList.
Also eine TList wäre halt nicht so toll weil ich da ja nur Strings speichern kann.
TObjectList kenne ich noch nicht, müsste ich mir erst mal anschauen. Aber diese wird dann doch auch dynamisch sein oder? Ich weiss dann eben nicht was ich bei der NodeDataSize angeben muss.

Mein TTeil hat nun ja eine feste, vordefinierte Grösse. Und genau diese Grösse gebe ich ja dann bei der VST_Teile.NodeDataSize an. Nur wie mache ich das wenn TTeil dynamisch ist?

Oder kriege ich es irgendwie hin, dass TTeil gar nicht erst dynamisch wird? Wohl eher nicht oder? Wäre irgendwie ja unlogisch...

Zitat:
Ich kenn mich mit VST nicht aus, aber anstatt dem Objekt würde ich nur eine ID im Knoten speichern. Die Daten selbst sind dann in einer separaten Liste.
OK auf die Idee bin ich noch gar nicht gekommen^^ Eine separate Liste mit den Einkaufsinformationen aller Bauteile, und dann jeweils nur die Einträge anzeigen, die zum markierten Artikel gehören? Wäre eine Möglichkeit, allerdings finde ich Sie etwas umständlich. Ein direktes Zuweisen der Einkaufsinformationen zum jeweiligen Artikel ist irgendwie viel schöner und übersichtlicher.

Zitat:
Man sollte grundsätzlich Datenhaltung und Visualisierung strikt trennen.
Genau das ist eben bei der VST nicht der Sinn. Da hat man alles in einem, und man "sagt" dann der Komponente, welche Datensätze sie wie anzeigen soll, wie sie sich genau verhalten soll usw.
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#5

AW: VirtualStringTree: Dynamisches Array in Klasse verwenden?

  Alt 24. Okt 2011, 18:43
Zitat:
Würde anstatt eines Arrays eine TList nehmen.
Edit: oder eine TObjectList.
Also eine TList wäre halt nicht so toll weil ich da ja nur Strings speichern kann

Nein, Du kannst da nicht nur Strings speichern. Du kannst dort ebenso Records, Klassen etc.. drin ablegen.
Lars
  Mit Zitat antworten Zitat
100nF

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

AW: VirtualStringTree: Dynamisches Array in Klasse verwenden?

  Alt 24. Okt 2011, 19:35
Ach so, ich hab da an TStringList gedacht, da ich auch TList noch nicht kannte
Aber das scheint ja eine Art Liste von Pointern zu sein. Nur versteh ich nicht wie ich das verwenden soll, ich will ja nicht die Pointer meiner Daten abspeichern, sondern die Daten selber....
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#7

AW: VirtualStringTree: Dynamisches Array in Klasse verwenden?

  Alt 24. Okt 2011, 19:46
Korrekt, es ist eine Liste von Pointern auf deine Daten. Du erzeugst wie gewohnt deine Objekte und fügst Sie per .Add hinzu und kannst später per Items[index] draufzugreifen. So kommst Du dann an deine Daten ran.
Lars
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: VirtualStringTree: Dynamisches Array in Klasse verwenden?

  Alt 25. Okt 2011, 09:44
hi,

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.

echt? Rate mal was folgendes für ne Ausgabe produziert:

Delphi-Quellcode:
  Memo1.Lines.Add(IntToStr(SizeOf(TForm)));
  Memo1.Lines.Add(IntToStr(SizeOf(TMemo)));
  Memo1.Lines.Add(IntToStr(SizeOf(TStrings)));
Und dann die Erklärung: Du ermittelst mit SizeOf NICHT die Größe einer Instanz sondern die Größe des Pointers (!) der auf die Instanz zeigt! Von daher spielt es keine Rolle wie viele Eigenschaften/Methoden/Arrays deine Klasse hat - der Pointer hat immer 4 Bytes.... (keine Regel ohne Außnahme: Win64 Code )

Und meine Vorredner haben natürlich Recht - Visualisierung und Datenhaltung sollten getrennt voneinander sein, d.h. Die Teile speicherst Du in einer ObjectList, die Du in einer Lade-Methode füllst und anschließend verwendest Du die Objectlist um die Instanzen in den Tree zu hängen.

Grüße
  Mit Zitat antworten Zitat
Medium
Online

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: VirtualStringTree: Dynamisches Array in Klasse verwenden?

  Alt 25. Okt 2011, 10:28
Ich nehme an, TTeil ist ein Record. In diesem Fall gibt SizeOf tatsächlich die Größe der Instanz an, weil potenziell Stack-Objekt.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: VirtualStringTree: Dynamisches Array in Klasse verwenden?

  Alt 25. Okt 2011, 10:31
Aus dem Ausgangspost:
Zitat:
Delphi-Quellcode:
type
  TTeil = class (TComponent)
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
Antwort Antwort
Seite 1 von 2  1 2      


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 01:47 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