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:
end;// guiManager.pas(192,1) Error: Wrong number of parameters specified
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 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 network • my 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.
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.
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:
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 network • my 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
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 network • my 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
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.
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 network • my 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
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
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.
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 network • my 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
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.