Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 10, 2025 13:25

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: const Parameter - Pointer
BeitragVerfasst: Do Sep 03, 2009 01:17 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Hi Leute,
ich bastel zZ nen kleines Grundgerüsst für ne GUI. Irgendwie habe ich aber ein Problem. Zu erst aber mal wie meine GUI aufgebaut ist:

TGLComponent <- Basisklasse
TGLLabel <- Wird von Basisklasse abgeleitet
TGLWindow <- Wird auch von Basisklasse abgeleitet

alle haben einen constructor Create wo der erste parameter ein Pointer auf eine TGLComponent ist

TGLLabel-constructor ruft als erstes den von TGLComponent auf und dann das eigene Zeugs
TGLWindow hat ne private Instanz von TGLLabel. Im TGLWindow constructor wird auch erst per "inherited Create(Parameterliste...);" der Konstruktor von TGLComponent aufgerufen. Danach kommt wieder eigenes zeug und dann wird der Konstrukter vom TGLLabel aufgerufen so dass der Methoden-Stack so aus sieht wenn ich im "tiefsten" konstrukter bei TGLWindow bin


TGLWindow.Create(const p:PGLComponent;...)
. |-->TGLComponent.Create(const p:PGLComponent;...)
. |-->TGLLabel.Create(const p:PGLComponent;...) //Hier ist p = @TGLComponent(Self)
........... |--> TGLComponent.Create(const p:PGLComponent;...) //Laut Delphi kommt hier auch die Speicheradresse p= @TGLComponent(Self) an,

in TGLComponent.Create(const p:PGLComponent) ist gleich die allererste Zeile
FParent:=p;
FParent ist auch vom Typ PGLComponent

wenn ich mir jetzt den durchlauf des Label konstruierens mit dem Debugger angucke dann hab ich folgendes Problem:
p hatte z.B. die Speicheradresse $12FDBC, hat es auch noch wenn FParent:=p; aufgerufen wird, allerdings wird FParent nicht wie erwartet auf $12FDBC gesetzt sondern (in diesem Beispiel) auf $1000315

Wisst ihr wo das Problem liegt?

hier nochmal ein paar Code-Fetzen

Code:
  1.  
  2. TGLComponent = class
  3.     private
  4.       ...
  5.       FParent: PGLComponent;
  6.       ...
  7.     public
  8.       constructor Create(const p:PGLComponent;id,x,y,w,h:integer;t:PTexture);
  9.       ...
  10. end;
  11.  
  12. TGLLabel = class(TGLComponent)
  13.     private
  14.       ...
  15.     public
  16.       constructor Create(const p:PGLComponent;id:integer;dc:longWord;x,y,w,h:integer;t:PTexture);
  17. end;
  18.  
  19. TGLWindow = class(TGLComponent)
  20.     private
  21.       FTitlebar: TGLLabel;
  22.       ...
  23.     public
  24.       constructor Create(const p:PGLComponent;id,x,y,w,h:integer;t:PTexture);
  25. end;
  26.  
  27. constructor TGLWindow.Create(const p: PGLComponent; id, x, y, w, h: integer;
  28.   t: PTexture);
  29. begin
  30.   inherited Create(p,id,x,y,w,h,t); //Konstruktor von TGLComponent aufrufen
  31.   FTitlebar:=TGLLabel.Create(@TGLComponent(Self),id+1,Form1.DC,5,h-35,w-10,30,T_GUI_TITLEBAR);  // FTitlebar erstellen...
  32.   ...
  33. end;
  34.  
  35. constructor TGLLabel.Create(const p: PGLComponent; id:integer;dc:longWord; x, y, w, h: integer;
  36.   t: PTexture);
  37. begin
  38.   inherited Create(p,id,x,y,w,h,t); //Konstruktor von TGLComponent aufrufen
  39.   ...
  40. end;
  41.  
  42. constructor TGLComponent.Create(const p: PGLComponent; id, x, y, w,
  43.   h: integer; t: PTexture);
  44. begin
  45.   inherited Create;
  46.   FParent:=p; //Hier tritt der Fehler auf, statt p in FParent zu schreiben, landet dort irgendeine Speicheradresse <!-- s:( --><img src=\"{SMILIES_PATH}/icon_sad.gif\" alt=\":(\" title=\"Sad\" /><!-- s:( -->
  47.   ...
  48. end;
  49.  


Ich hoffe ihr könnt mir helfen, ich verzweifel langsam :( :( :(

Wer mehr Code-Schnipsel brauch, einfach bescheid sagen ...

cuz bubble

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 03, 2009 07:32 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Also Klassen sind selbst schon Pointer, wenn du also PGLComponent = ^TGLComponent definierst, dann ist das ein Pointer auf einen Pointer. Das ist vollkommen unnötig und bringt wie man sieht nur Probleme mit sich. Du kannst FParent einfach als TGLComponent deklarieren, ist einfacher und funktioniert. Dann kannst du dir auch böses Zeug wie @TGLComponent(Self) sparen :wink:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]