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

Aktuelle Zeit: Do Jul 10, 2025 15:31

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Vererbte Klassen und Objekte
BeitragVerfasst: Mi Jun 06, 2007 12:39 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Hi, ich sitz hier grad vor einer im Grunde sicher schnell geloesten Sache, doch scheinbar bin ich mal wieder betriebsblind...

Von der Klasse TSE_GUI_Custom leitet sich die Klasse TSE_GUI_Rectangle_Custom ab. Von dieser wiederrum leitet sich TSE_GUI_Window_Custom ab.


Code:
  1. TSE_GUI_Window_Custom = class (TSE_GUI_Button_Custom)
  2.   public
  3.     fItems                    : THashedStringList;
  4.  
  5.     constructor Create        (NLeft, NTop, NWidth, NHeight: Integer);
  6.  
  7.     function    AddGUIItem    (NText: String; NObject: TSE_GUI_Custom) : Integer;
  8.     procedure   Draw;
  9.  
  10.     destructor  Destroy;
  11.   end;
  12.  
  13. constructor TSE_GUI_Window_Custom.Create (NLeft, NTop, NWidth, NHeight: Integer);
  14. begin
  15.   inherited Create(NLeft, NTop, NWidth, NHeight);
  16.   fItems := THashedStringList.Create;
  17. end;
  18.  
  19. function TSE_GUI_Window_Custom.AddGUIItem (NText: String; NObject: TSE_GUI_Custom): Integer;
  20. begin
  21.   fItems.AddObject(NText,NObject);
  22. end;
  23.  
  24. procedure TSE_GUI_Window_Custom.Draw;
  25. var FontPos : Array[0..1] of Byte;
  26.     i:Integer;
  27. begin
  28.  
  29.   for i := 0 to fItems.Count - 1 do
  30.     (fItems.Objects[i] as TSE_GUI_Custom).Draw;
  31.    
  32. end;
  33.  


NUn erschaffe ich mir ein Fenster (Test ist dabei ein Object vom Typ TSE_GUI_Button_custom):
Code:
  1.     mywindow: TSE_GUI_Window_custom;
  2.   mywindow := TSE_GUI_Window_Custom.Create(200,200,200,200);
  3.   mywindow.AddGUIItem('laaa',test);
  4.  


Und dann wird gezeichnet:

Code:
  1. mywindow.draw;



Im Grunde muesste jetzt bei Draw die Forschleife aufgerufen werden, und die Drawprozedur aller beeinhalteten Objekte aufgerufen werden. Das Problem ist, dass TSE_GUI_Custom.Draw statt TSE_GUI_BUtton_Custom, was ja der Typ von Test ist. Bei meinem Szenenmanager funktioniert das im Grunde genauso, nur irgendwo muss ich ja was uebersehen haben, sonst würd es ja auch hier gehen ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 06, 2007 13:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
Also auf den ersten Blick würd ich sagen:

du hast die deklarationen virtual und override bei Draw vergessen.

Sonst fällt mir auf die schnelle nichts auf

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 06, 2007 13:24 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
override ist es ^^ danke.
Ich hatte alle Draw Prozeduren Virtual gesetzt, aber scheinbar kann ich eine Prozedur nciht gleichzeitig Virtual und Override geben. So wär es mir am liebsten gewesen, nun musste ich bei allen Prozeduren alle virtuals wegmachen und durch overrides ersetzten.-..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 06, 2007 13:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du solltest dir evtl auch mal dieses OOP Tutorial anschauen. Besser wird es dir keiner erklären können.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 06, 2007 13:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
Eine als virtual deklarierte Funktion ist sozusagen das Fundament. Alle weiteren Ebenen müssen die gleiche Breite (gleichen Parameter) wie die Originalfunktion haben. Natürlich kannst du beliebig viele Ebenen auf ein Fundament setzen, aber ein weiteres Fundament als Ebene aufsetzen ist eher sinnlos.

*klugsche**modus OFF* :)

Grüße

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 06, 2007 13:31 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Also bei mir ist die Struktur so:

TSE_GUI -> TSE_GUI_Rectangle -> TSE_GUI_Window
Virtual------> Virtual, Override ------> Virtual, Override


So müsste es im Grunde aussehen, denn am Ende wird von TSE_GUI_Window eine letzte Klasse abgeleitet, um alle Events abzufangen. Das mit Virtual und Override gleichzeitig funktioniert nur leider nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 06, 2007 13:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
So wäre es richtig:

TSE_GUI -> TSE_GUI_Rectangle -> TSE_GUI_Window
Virtual------> Override --------------> Override


wenn du dann in TSE_GUI_Window.Draw inherited aufrufst, werden alle überschriebenen Funktionen ausgeführt

Bsp:

Code:
  1.  
  2. procedure TTest.Draw; virtual;
  3. begin
  4.   writeln('Test1');
  5. end;
  6.  
  7. // TABC = class(TTest)
  8.  
  9. procedure TABC.Draw; override;
  10. begin
  11.   inherited;
  12.   writeln('Test2');
  13. end;
  14.  


ohne inherited würde bei TABC.Draw folgendes ausgegeben:

Test2

mit inherited hingegen

Test1
Test2

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 06, 2007 13:47 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Okay dann habe ich das mit dem Virtual nur falsch verstanden, es muss also nicht immer drin sein, danke


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 18 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.010s | 16 Queries | GZIP : On ]