Einzelnen Beitrag anzeigen

Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#1

[Records] Codeoptimierung bei Übergabetypen

  Alt 21. Sep 2004, 15:33
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
  Mit Zitat antworten Zitat