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

Aktuelle Zeit: Fr Jul 11, 2025 08:15

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Feb 02, 2007 15:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hi @ll

Passt vielleicht nicht ganz hierrein, aber es hat mit Object-Pascal zu tun. Wenn es hier doch so falsch ist, dann kann es ein Mod ruhig verschieben.

Also für mein aktuelles Projekt schreibe ich mir ne *kleine* GUI. Allerdings habe ich seit neuestem nen Compilerfehler, der mich ziemlich dumm da stehen lässt. Und zwar in einem Constructor:

Code:
  1.  
  2. constructor TguiElement.Create(AParent: TguiElement);
  3. begin
  4.   inherited Create;
  5.   FParent := AParent;
  6.   FChildren := TList.Create;
  7.  
  8.   FStandardTexture := TguiTexture.Create;
  9.   FActiveTexture := TguiTexture.Create;
  10.  
  11.   FClickInteraction := ciNone;
  12.   FClickInteractionActive := False;
  13.  
  14.   FEnabled := True;
  15.   FVisible := True;
  16.  
  17.   FTop := 0.0;
  18.   FLeft := 0.0;
  19.   FWidth := 0.0;
  20.   FHeight := 0.0;
  21.  
  22.   FOnClick := nil;
  23. end; // guiManager.pas(192,1) Error: Wrong number of parameters specified
  24.  


Der Fehler ist oben bereits gekennzeichnet. Ich habe nicht die geringste Ahnung, woran es liegt. Alle prozeduralen Aufrufe innerhalb des Constructors brauchen eigentlich keine Parameter, das END schon garnicht :wink:
Meine Ahnung sagte mir zunächst, dass der ein Problem mit dem FOnClick hat, welches ja ein Zeiger auf eine procedure ist, aber das erwies sich als falsch, trotz auskommentieren der gleiche Fehler. TguiTexture.Create erwartet garkeine Parameter, TList.Create tut es auch nicht.

Ich bitte zu beachten, dass ich den FPC unter Lazarus benutze.

//Nachtrag: Selbst wenn ich ALLES innerhalb von begin und end auskommentiere, bleibt der Fehler erhalten O.o. In der Klasse ist auch das AParent: TguiElement als Parameter im Funktionskopf vorgegeben, da kann der Fehler also auch nicht liegen.
//Nachtrag 2: Da der Fehler ganz plötzlich aufgetreten ist, halte ich ihn für eine Kompilerfehlfunktion, also dass die Zeilenangabe net stimmt, aber ich find den Fehler net. Aber ein Kompiler bzw. eine IDE, der/die eine komplette dglOpenGL.pas für Leer hält, sobald man sie in einem Tab offen hat... Naja, dem traue ich einiges zu.

Gruß ein für schnelle Hilfe dankbarer Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Zuletzt geändert von Lord Horazont am Fr Feb 02, 2007 18:56, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 02, 2007 15:58 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Noch eine GUI *kopfschüttel*

Wie sieht den der Konstructor in der Klasse aus?
Und rufst du ihn auch mit der richtigen Anzahl der Parameter auf?
Ansonsten kann ich es mir nicht erklären.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 02, 2007 15:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Bis jetzt wird der Constructor noch nirgendwo aufgerufen. Und in der Klasse hat er den gleichen header, sonst wäre der Fehler auch in dem Funktionskopf und es wäre eine andere Meldung.

Und leider sind die anderen GUI's entweder nicht nach meinem Geschmack oder nicht offen oder nicht fertig. Also muss ich selbst Hand anlegen.

//Edit: Ich habe die Ursache, aber das lässt das ganze nicht gerade klarer werden:
Code:
  1.  
  2. constructor TguiElement.Create(AParent: TguiElement; AAllowChildren: Boolean = True);
  3. begin
  4.   inherited Create;
  5.   FParent := AParent;
  6.   FAllowChildren := AAllowChildren;
  7.   FChildren := TList.Create;
  8.  
  9.   FStandardTexture := TguiTexture.Create;
  10.   FActiveTexture := TguiTexture.Create;
  11.  
  12.   FClickInteraction := ciNone;
  13.   FClickInteractionActive := False;
  14.  
  15.   FEnabled := True;
  16.   FVisible := True;
  17.  
  18.   FTop := 0.0;
  19.   FLeft := 0.0;
  20.   FWidth := 0.0;
  21.   FHeight := 0.0;
  22.  
  23.   FOnClick := nil;
  24. end;
  25.  
  26. destructor TguiElement.Destroy(DestroyChildren: Boolean);
  27. var
  28.   I: Integer;
  29. begin
  30.   if DestroyChildren then
  31.     for I := 0 to FChildren.Count-1 do
  32.     begin
  33.       TguiElement(FChildren[I]).Destroy(True);
  34.     end;
  35.   FChildren.Destroy;
  36.  
  37.   FStandardTexture.Destroy;
  38.   FActiveTexture.Destroy;
  39.   inherited Destroy;
  40. end;
  41.  


Wenn ich in der Klasse und im Funktionskopf von Destroy selbst den Parameter entferne (und dementsprechend alle Folgefehler auflöse) dann tritt der Fehler nicht mehr auf. Kann man einem Destructor keine Parameter geben?

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 02, 2007 16:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Überschreib einfach den destructor, dann kannst du auch eigene Parameter angeben.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 02, 2007 16:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Code:
  1.  
  2. TguiElement = class (TObject)
  3.     constructor Create(AParent: TguiElement; AAllowChildren: Boolean = True);
  4.     destructor Destroy(DestroyChildren: Boolean); reintroduce;                      


...

Lord Horazont hat geschrieben:
Ich bitte zu beachten, dass ich den FPC unter Lazarus benutze.


Meinst du das mit "überschreiben"?

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 02, 2007 16:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Damit mein ich das Schlüsselwort "override", also halt so wie man dass in Delphi auch macht. Renintroduce hat nen anderen Zweck.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 02, 2007 16:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Den Destruktor zu überschreiben und parameter zu übergeben funktioniert aber auch nur so lange wie mal TKlasse.Destroy aufruft. Wenn man aber irgendwann einmal TObjekt.Destroy (oder besser eigentlich Free) aufruft würde der eigene Destruktor nicht aufgerufen werden. Bzw überschreiben würde auch gar nicht gehen, da er Virtuell ist und somit nur mit gleichen Parametern (keine) überschrieben werden kann. So könntet ihr ihn nur verdecken.

Besser ist es, wenn du den Wert in eine Eigenschaft schreibst und diese im richtig echt überschriebenen Destruktor auswertest.. Mache ich bei der glBitmap auch so. Ist zwar eine Zeile mehr aber bei einem sinnvollen Defaultwert bist du in jedem Fall auf der Glücksseite.

Warum du da allerdings so ein Problem hast kann ich mir nicht erklären.

[edit] Hier auch ein Thema wo ich das vor 2 Tagen schon mal genauer erklärt hatte.
http://www.delphigl.com/forum/viewtopic.php?p=52353#52353


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 02, 2007 16:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Da ich TguiElement als Basisklasse verwende, wäre das mit dem TObject.Destroy relativ egal. Aber du hast natürlich recht. Ich habe das jetzt so gelöst, dass es eine Prozedur DestroyChildren gibt, das geht auch.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 02, 2007 18:51 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Also für den destructor würde ich grundsätzlich IMMER "destructor destroy;overrride;" nehmen, da der bei free oder freeandnil aufgerufen wird. Die Parameter würde ich eher als eigenschaften der Objektes machen. In deinem fall dann z.B. AutoFreeChildren oder OwnsChilden


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 02, 2007 22:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo, Lord Horazont,
ich weiss nicht ob es Dich freut zu hören: Ich habe den Quelltext, den Du angegeben hast, sowohl in Delphi, als auch in Lazarus, als auch in Free Pascal kompiliert (ich habe den Inhalt des Konstruktors und Destruktors auskommentiert).

Ergebnis: In Lazarus (Version 0.9.12 Beta, also eine alte Version) kam der gleiche Fehler wie bei Dir.
Sowohl Delphi7 als auch Free Pascal (Version 1.0.6, Version 27.12.2005, also eine uralte Version) haben keine Fehlermeldung ausgegeben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 03, 2007 11:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich habe die aktuelle Lazarus Version, also 0.9.20 Beta. Aber wie gesagt, ich habe das Problem jetzt anders gelöst. Außerdem hatte Sascha natürlich recht, mit dem Vererben. Wenn ich jetzt aus schusseligkeit oder aus sonst irgendwelchen gründen einmal ein TguiElement als TObject löschen würde, würde der Speicher nicht komplett freigegeben werden. Deshalb isses gut so.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


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


Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot] und 6 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 | 16 Queries | GZIP : On ]