Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [Records] Codeoptimierung bei Übergabetypen (https://www.delphipraxis.net/30164-%5Brecords%5D-codeoptimierung-bei-uebergabetypen.html)

Igotcha 21. Sep 2004 15:33


[Records] Codeoptimierung bei Übergabetypen
 
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

Igotcha 22. Sep 2004 09:10

Re: [Records] Codeoptimierung bei Übergabetypen
 
Ich möchte meine Frage gerne nochmal nach oben pushen mit dem Hintergrund, ob ich mich evtl. in der Fragestellung ungenügend ausgedrückt habe. Die Frage ist mir nämlich sehr wichtig.

Gruß Igotcha

Luckie 22. Sep 2004 09:15

Re: [Records] Codeoptimierung bei Übergabetypen
 
Wenn alle Records identisch sind, warum hast du sie denn drei mal deklariert?

Delphi-Quellcode:
type
  TDaten = record
  ...;
  ...;
  ...;
end;


var
 IstDaten, SollDaten, MoechteDaten: TDaten;

Igotcha 22. Sep 2004 09:33

Re: [Records] Codeoptimierung bei Übergabetypen
 
Zitat:

Zitat von Luckie
Wenn alle Records identisch sind, warum hast du sie denn drei mal deklariert?

Delphi-Quellcode:
type
  TDaten = record
  ...;
  ...;
  ...;
end;


var
 IstDaten, SollDaten, MoechteDaten: TDaten;

So hätte ich mir das auch gedacht, nur, wie unterscheidet sich Deine Deklaration von dieser aus technischer Sicht? Die folgende Art der Deklaration ist so in sämtlichen Unterlagen zum VTV zu finden:

Delphi-Quellcode:
type
  PPrognoseData = ^TPrognoseData;
  TPrognoseData = record
Und funktioniert bei Deinem Record auch die o.g. Zugrifssmethode (die ja einen Zeiger auf meinen Record-Satz liefert)?

Gruß Igotcha

Sharky 22. Sep 2004 09:38

Re: [Records] Codeoptimierung bei Übergabetypen
 
Hai Igotcha,
es sollte eigentlich so machbar sein:
Delphi-Quellcode:
type
  PPrognoseData = ^TData;
  PIstData = ^TData;
  PPlanData = ^TData;

  TData = 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;

Igotcha 22. Sep 2004 09:44

Re: [Records] Codeoptimierung bei Übergabetypen
 
Zitat:

Zitat von Sharky
Hai Igotcha,
es sollte eigentlich so machbar sein:
Delphi-Quellcode:
type
  PPrognoseData = ^TData;
  PIstData = ^TData;
  PPlanData = ^TData;

  TData = 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;

Ok, das wäre eine Simplifizierung der Record-Deklaration - schon mal gut ;-)

Aber wie kann ich jetzt dafür den Übergabeparameter in Proceduren definieren?

Delphi-Quellcode:
procedure DoSomething(atree: TVirtualStringTree; arecord: TData)

oder

procedure DoSomething(atree: TVirtualStringTree; arecord: ^TData)
Sorry, dass ich viel Frage, ohne es evtl. im Code zu testen, aber meine Anwendung hat im Moment ca. 60.000 Zeilen Code und bei der testweisen Änderung z.B. der Recorddefinition würde ich einen Tag sitzen, nur um den Code anzupassen, um dann evtl. festzustellen, dass es nicht funktioniert ;-)

Gruß Igotcha

Luckie 22. Sep 2004 09:45

Re: [Records] Codeoptimierung bei Übergabetypen
 
@Igotcha: Ich habe nur die Zeiger-Deklaration auf den Record weggelassen.

ibp 22. Sep 2004 09:51

Re: [Records] Codeoptimierung bei Übergabetypen
 
imho so:

Code:
procedure DoSomething(atree: TVirtualStringTree; VAR arecord: ^TData)

Igotcha 22. Sep 2004 10:45

Re: [Records] Codeoptimierung bei Übergabetypen
 
Danke Euch!

Ich werde mal ein kleines Testprojekt aufsetzen und mich dann wieder melden...

Igotcha 22. Sep 2004 11:02

Re: [Records] Codeoptimierung bei Übergabetypen
 
Hmmm, leider geht es offensichtlich so nicht :-(

Delphi-Quellcode:
type
  PPrognoseData = ^TData;
  PIstData = ^TData;
  PPlanData = ^TData;

  TData = record
    FGBez: String;
    FMonat: Array [0..1] of double;
end;

...

 public
    { Public declarations }
    procedure BuildTree(atree: TVirtualStringTree; var adata: TData);
  end;

...

procedure TForm1.BuildTree(atree: TVirtualStringTree; var adata: TData);
var
 myNode : PVirtualNode;
begin
      aTree.Clear;
      aTree.NodeDataSize:=sizeof(adata);
      myNode:=atree.AddChild(nil);
      adata:=atree.GetNodeData(myNode); // hier kommt der Fehler
end;
Ergibt beim Compilieren:

[Error] Unit1.pas(55): Incompatible types: 'TData' and 'Pointer'

Die Variante

Delphi-Quellcode:
procedure BuildTree(atree: TVirtualStringTree; var adata: ^TData);
Ergibt ein:

[Error] Unit1.pas(35): Identifier expected but '^' found

Nicht gut ;-)

Gruß Igotcha


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:00 Uhr.
Seite 1 von 3  1 23      

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