Hallo zusammen,
nachdem ich in meiner Anwendung so gut wie alle Basisfunktionalitäten implementiert habe, möchte ich mich an die Codeoptimierung machen. Speziell stelle ich mir hier Fragen zum Thema Records, da diese zur Laufzeit in Verbindung mit vier VirtualTreeviews zur Datenhaltung benutzt werden.
Ich stelle in 3 der 4 VTVs verschiedene Daten mit der gleichen Record-Struktur dar:
Delphi-Quellcode:
type
PPrognoseData = ^TPrognoseData;
TPrognoseData = record
FGid: integer;
FPid: integer;
FGroupid: integer;
FGBez: String;
FGTyp: integer;
FGColor: String;
FGS1: String;
FGOP1: String;
FGS2: String;
FGOP2: String;
FGS3: String;
FMonat: Array [0..16] of double;
end;
type
PIstData = ^TIstData;
TIstData = record
FGid: integer;
FPid: integer;
FGroupid: integer;
FGBez: String;
FGTyp: integer;
FGColor: String;
FGS1: String;
FGOP1: String;
FGS2: String;
FGOP2: String;
FGS3: String;
FMonat: Array [0..16] of double;
end;
type
PPlanData = ^TPlanData;
TPlanData = record
FGid: integer;
FPid: integer;
FGroupid: integer;
FGBez: String;
FGTyp: integer;
FGColor: String;
FGS1: String;
FGOP1: String;
FGS2: String;
FGOP2: String;
FGS3: String;
FMonat: Array [0..16] of double;
end;
Das "Optimierungsproblem" besteht jetzt darin, dass, wenn ich auf die Daten innerhalb der einzelnen VTVs zugreifen möchte (lesen, editieren), die Daten so zugewiesen werden müssen (hier für die IstDaten):
Delphi-Quellcode:
procedure ...
var
myData : pIstData;
mydouble: double;
begin
myData:=TIST.GetNodeData(Node); // Die Funktion GetNodeData gibt einen Verweis auf den Recordeintrag zurück, der für den Node "Node" hinterlegt ist. An dieser Stelle existiert also eine Verknüpfung vom VTV zu den IstDaten
myData.FGBez:='etc.'; oder
mydouble:=myData.FMonat[0];
TIST ist der VTV, der die IstDaten "verwaltet", den ich per Parameter übergeben kann.
Dies hat im Moment zur Folge, dass ich für alle Routinen, die etwas mit den drei VTVs anstellen, eine eigene Version habe - nämlich abhängig vom Record-Typ
Da die Record-Struktur in allen drei Fällen gleich ist, suche ich nun nach einer Optimierungsmöglicheit in der Form, dass ich beim Aufruf der Routinen "irgendwie" den Record-Typ mit übergeben und dann innerhalb der Routine damit arbeiten kann.
Also etwas in der Art wie:
Delphi-Quellcode:
procedure DoSomething(atree: TVirtualStringTree; arecord: ???);
begin
arecord:=atree.GetNodeData(Node);
arecord.FGBez:='Test';
...
end;
So dass ich dann die Procedure so aufrufen könnte:
DoSomething(TIST, pIstData);
Gruß Igotcha