![]() |
[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:
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):
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;
Delphi-Quellcode:
TIST ist der VTV, der die IstDaten "verwaltet", den ich per Parameter übergeben kann.
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]; 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:
Gruß Igotcha
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); |
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 |
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; |
Re: [Records] Codeoptimierung bei Übergabetypen
Zitat:
Delphi-Quellcode:
Und funktioniert bei Deinem Record auch die o.g. Zugrifssmethode (die ja einen Zeiger auf meinen Record-Satz liefert)?
type
PPrognoseData = ^TPrognoseData; TPrognoseData = record Gruß Igotcha |
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; |
Re: [Records] Codeoptimierung bei Übergabetypen
Zitat:
Aber wie kann ich jetzt dafür den Übergabeparameter in Proceduren definieren?
Delphi-Quellcode:
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 ;-)
procedure DoSomething(atree: TVirtualStringTree; arecord: TData)
oder procedure DoSomething(atree: TVirtualStringTree; arecord: ^TData) Gruß Igotcha |
Re: [Records] Codeoptimierung bei Übergabetypen
@Igotcha: Ich habe nur die Zeiger-Deklaration auf den Record weggelassen.
|
Re: [Records] Codeoptimierung bei Übergabetypen
imho so:
Code:
procedure DoSomething(atree: TVirtualStringTree; VAR arecord: ^TData)
|
Re: [Records] Codeoptimierung bei Übergabetypen
Danke Euch!
Ich werde mal ein kleines Testprojekt aufsetzen und mich dann wieder melden... |
Re: [Records] Codeoptimierung bei Übergabetypen
Hmmm, leider geht es offensichtlich so nicht :-(
Delphi-Quellcode:
Ergibt beim Compilieren:
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; [Error] Unit1.pas(55): Incompatible types: 'TData' and 'Pointer' Die Variante
Delphi-Quellcode:
Ergibt ein:
procedure BuildTree(atree: TVirtualStringTree; var adata: ^TData);
[Error] Unit1.pas(35): Identifier expected but '^' found Nicht gut ;-) Gruß Igotcha |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz