AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi [Records] Codeoptimierung bei Übergabetypen

[Records] Codeoptimierung bei Übergabetypen

Ein Thema von Igotcha · begonnen am 21. Sep 2004 · letzter Beitrag vom 23. Sep 2004
Antwort Antwort
Seite 1 von 3  1 23   
Igotcha

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

[Records] Codeoptimierung bei Übergabetypen

  Alt 21. Sep 2004, 16: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
Igotcha

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

Re: [Records] Codeoptimierung bei Übergabetypen

  Alt 22. Sep 2004, 10:10
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: [Records] Codeoptimierung bei Übergabetypen

  Alt 22. Sep 2004, 10:15
Wenn alle Records identisch sind, warum hast du sie denn drei mal deklariert?

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


var
 IstDaten, SollDaten, MoechteDaten: TDaten;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Igotcha

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

Re: [Records] Codeoptimierung bei Übergabetypen

  Alt 22. Sep 2004, 10:33
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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#5

Re: [Records] Codeoptimierung bei Übergabetypen

  Alt 22. Sep 2004, 10:38
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;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Igotcha

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

Re: [Records] Codeoptimierung bei Übergabetypen

  Alt 22. Sep 2004, 10:44
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: [Records] Codeoptimierung bei Übergabetypen

  Alt 22. Sep 2004, 10:45
@Igotcha: Ich habe nur die Zeiger-Deklaration auf den Record weggelassen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#8

Re: [Records] Codeoptimierung bei Übergabetypen

  Alt 22. Sep 2004, 10:51
imho so:

Code:
procedure DoSomething(atree: TVirtualStringTree; VAR arecord: ^TData)
  Mit Zitat antworten Zitat
Igotcha

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

Re: [Records] Codeoptimierung bei Übergabetypen

  Alt 22. Sep 2004, 11:45
Danke Euch!

Ich werde mal ein kleines Testprojekt aufsetzen und mich dann wieder melden...
  Mit Zitat antworten Zitat
Igotcha

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

Re: [Records] Codeoptimierung bei Übergabetypen

  Alt 22. Sep 2004, 12:02
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

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

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

Nicht gut

Gruß Igotcha
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:43 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