Entwickler-Ecke
Sonstiges (Delphi) - TButton Click unwirksam machen
Jakob_Ullmann - Sa 11.12.10 18:19
Titel: TButton Click unwirksam machen
Hi!
Ich möchte einen visuellen Form-Designer programmieren (ist bis jetzt soweit, dass ein Grid gezeichnet wird :P ). Ich habe mir gedacht, da die Komponenten ja immer plattformtypisch aussehen sollen, ist es am besten, auch wirklich solche zu erzeugen. Wahrscheinlich gibt es auch gar keine Alternative. Also habe ich eine Klasse TButtonWidget von TButton abgeleitet. Mein bisheriger Code sieht so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| type TButtonWidget = class(TButton) constructor Create(AOwner: TComponent); override; procedure Click; override; public IsSelected: Boolean; end;
implementation
constructor TButtonWidget.Create(AOwner: TComponent); begin inherited Create(AOwner); Caption := 'Button'; IsSelected := False; end;
procedure TButtonWidget.Click; begin IsSelected := not IsSelected; end; |
Der Button soll aber beim Drücken nicht "runtergehen" (auch wenn das bei schlechten Form-Designern wie z. B. dem Boa Constructor (wxPython-IDE) so ist). In der Schule hatten wir kürzlich die Aufgabe, von einer VCL-Klasse eine neue Klasse abzuleiten. Da hatte ich einen Button, der beim Klicken "aufblinkt" (kitschig, ich weiß). Da hatte ich ein inherited Click vergessen und beim Klicken passierte nichts.
Bei Lazarus scheint das nicht zu funktionieren. Der Button geht ganz normal runter.
Jemand eine Idee?
jaenicke - Sa 11.12.10 18:44
Unter Windows gibt es gleich noch weitere Möglichkeiten (per Thememanager zeichnen oder in den Verschieben-Modus versetzen z.B.). Das gibt es aber unter anderen Betriebssystemen AFAIK schlicht nicht.
Schau doch einfach einmal in den Lazarus Quelltext. Schließlich ist da der komplette Designer auch umgesetzt.
Jakob_Ullmann - Sa 11.12.10 19:18
Ich habe mir schon gedacht, dass es das unter Windows gibt. Allerdings soll das Teil plattformunabhängig werden. Ich programmiere unter Ubuntu.
Zum Lazarus-Source: Den Einfall hatte ich heute auch schon. Allerdings habe ich keine Idee, in welcher Unit der Designer steht. Über Google CodeSearch habe ich zumindest schonmal den Code gefunden:
http://www.google.com/codesearch/p?hl=de#_8yzG8gYArE/trunk/ide/customformeditor.pp&q=lazarus%20lang:pas&d=1
Ich vermutete ihn vom Namen her in der Unit. Aber nach längerem Suchen musste ich leider feststellen, dass ich in den tausend Units keinen Überblick habe.
Alternative wäre das hier, aber auch das sieht nicht wirklich so aus, als ob dort visuelle Komponenten gezeichnet werden:
http://www.google.com/codesearch/p?hl=de#_8yzG8gYArE/trunk/designer/designer.pp&q=lazarus%20lang:pas&d=1
Zumindest für Buttons habe ich jetzt einen Workaround gefunden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| type TButtonWidget = class(TToggleBox) constructor Create(AOwner: TComponent); override; procedure Click; override; public IsSelected: Boolean; end;
implementation
constructor TButtonWidget.Create(AOwner: TComponent); begin inherited Create(AOwner); Caption := 'Button'; IsSelected := False; AllowGrayed := True; State := cbGrayed; Width := 75; Height := 25; end;
procedure TButtonWidget.Click; begin IsSelected := not IsSelected; end; |
HeftCD - Sa 11.12.10 21:50
mhh, kann jetzt ein Denkfehler sein, aber warum platzierst Du nicht einfach Rechtecke oder Images [falls die mit Bild sein sollen] in Deinem Formdesigner und ersetzt die nachher bei der Ausgabe/Export/ Compiling(?)-Code durch den Code für Buttons ?
jaenicke - So 12.12.10 00:35
Nachdem ich eine Weile mit Lazarus und seinen Macken gekämpft habe, schreibe ich mal meine Idee. Umsetzen wird mit Lazarus wohl nix (Access Violation / Fehlermeldung / ...). :nixweiss:
Ich wollte schauen was passiert, wenn ich die Mouse-Messages in der WndProc einfach mal abfange und nicht durchlasse. Leider behauptet Lazarus beim Versuch die WndProc zu überschreiben standhaft, dass es die WndProc in der Basisklasse nicht gebe. Obwohl ich diese dort sehe... :roll:
Ich kann ja wohl in Lazarus nicht nur eine Methode überschreiben, die in der direkten Oberklasse ist. :shock:
In TControl.WndProc habe ich jedenfalls ganz oben diesen Kommentar gefunden:
In dem Fall wird die Bearbeitung der Message abgebrochen. Deshalb vermute ich, dass es so klappt. Es müsste dann halt nur irgendwie funktionieren. :nixweiss:
Jakob_Ullmann - So 12.12.10 10:49
HeftCD hat folgendes geschrieben : |
mhh, kann jetzt ein Denkfehler sein, aber warum platzierst Du nicht einfach Rechtecke oder Images [falls die mit Bild sein sollen] in Deinem Formdesigner und ersetzt die nachher bei der [highlight]Ausgabe/Export/ Compiling(?)-Code[/hithlight] durch den Code für Buttons ? |
Bzw. Interpreting (das soll nämlich mal eine Python-IDE werden, ähnlich dem Boa-Constructor). Ich habe aber nicht den nötigen Enthusiasmus, für jede Komponente/Widget eine Darstellung zu schreiben, die nicht abstoßend wirkt.
jaenicke hat folgendes geschrieben : |
Nachdem ich eine Weile mit Lazarus und seinen Macken gekämpft habe, schreibe ich mal meine Idee. Umsetzen wird mit Lazarus wohl nix (Access Violation / Fehlermeldung / ...). :nixweiss: |
Ich glaube, Lazarus setzt einfach auf den falschen Compiler. FreePascal ist zwar umfangreich, aber trotzdem Schrott. Das ist mir auch aufgefallen, als ich mit der Konsolen-IDE von FreePascal programmiert habe.
Zitat: |
Ich wollte schauen was passiert, wenn ich die Mouse-Messages in der WndProc einfach mal abfange und nicht durchlasse. Leider behauptet Lazarus beim Versuch die WndProc zu überschreiben standhaft, dass es die WndProc in der Basisklasse nicht gebe. Obwohl ich diese dort sehe... :roll:
Ich kann ja wohl in Lazarus nicht nur eine Methode überschreiben, die in der direkten Oberklasse ist. :shock: |
Das ist natürlich Mist. Aber das scheint ja auch eher ein FPC-Problem zu sein.
Zitat: |
In TControl.WndProc habe ich jedenfalls ganz oben diesen Kommentar gefunden:In dem Fall wird die Bearbeitung der Message abgebrochen. Deshalb vermute ich, dass es so klappt. Es müsste dann halt nur irgendwie funktionieren. :nixweiss: |
Wobei Lazarus' Implementierung des Form-Designers ja auch nicht so perfekt ist, wenn man immernoch eine TComboBox ausklappen kann (es kann natürlich sein, dass das so gewollt ist). Und irgendwie hat jeder Designer, den ich bis jetzt gesehen habe, solche Macken (auch Delphi und Glade oder der wxSmith von Code::Blocks).
Ich danke euch für die Hilfe!
jaenicke - So 12.12.10 11:17
Jakob_Ullmann hat folgendes geschrieben : |
Wobei Lazarus' Implementierung des Form-Designers ja auch nicht so perfekt ist, wenn man immernoch eine TComboBox ausklappen kann (es kann natürlich sein, dass das so gewollt ist). |
Das könnte der Plattformunabhängigkeit geschuldet sein. Das lässt sich vielleicht nicht so einfach machen. Ich weiß, dass es da unter Windows auch ein paar Probleme gibt, wenn man wie üblich für so etwas die vordefinierten Controls benutzt.
Wie dem auch sei, irgendwie kann man die WndProc ja wahrscheinlich schon überschreiben. Da müsstest du eben mal schauen, ob du das hinbekommst. Und ansonsten bleibt wohl nur im Quelltext der Komponenten selbst zu fummeln.
Jakob_Ullmann hat folgendes geschrieben : |
Und irgendwie hat jeder Designer, den ich bis jetzt gesehen habe, solche Macken (auch Delphi und Glade oder der wxSmith von Code::Blocks). |
Bei Delphi habe ich keine in der Hinsicht gesehen, jedenfalls ab Delphi 2006 nicht mehr.
Jakob_Ullmann hat folgendes geschrieben : |
Ich glaube, Lazarus setzt einfach auf den falschen Compiler. |
Naja, und auf eine schlechte Oberfläche. Anstatt da mal etwas ordentliches zu erfinden wird der Schrott von Delphi 7 weiterentwickelt. Ich reg mich jedesmal wieder auf, wenn ich wieder mal ein Fenster suche, das irgendwo versteckt unter einem anderen liegt. Vom Projektmanager schon angefangen...
Von den ganzen unübersichtlichen Optionsfenstern einmal ganz abgesehen. Von den ganzen automatischen Hilfen, die Delphi hat, kann man ja ohnehin nur träumen. Naja, was solls. Wenn Delphi nicht so viel kosten würde, hätte Lazarus wohl mit XE3 (Linux und Mac Support) sehr sehr schlechte Karten (ok, bei der Zielgruppe von Lazarus müsste Delphi dafür ganz kostenlos sein^^).
Jakob_Ullmann - So 12.12.10 14:50
jaenicke hat folgendes geschrieben : |
Naja, und auf eine schlechte Oberfläche. Anstatt da mal etwas ordentliches zu erfinden wird der Schrott von Delphi 7 weiterentwickelt. Ich reg mich jedesmal wieder auf, wenn ich wieder mal ein Fenster suche, das irgendwo versteckt unter einem anderen liegt. Vom Projektmanager schon angefangen... |
Unter Ubuntu ist das erst Schrott: da bekommt jedes Fenster einen eigenen Eintrag in der Taskleiste. Blöd, wenn man einen kleinen Bildschirm hat. *grr*
Lazarus ist mit Abstand das Programm, was ich am meisten killen muss, unter anderem, weil der OI ständig Aktionen abfängt, obwohl er gar nicht mehr aktiv ist (so wird beim Versuch, Lazarus normal zu schließen, nur die oberste Property markiert). Da ist es nur gut, dass Ubuntu's kill-Funktion auch wirklich funktioniert. Bei Windows XP hat das immer ewig gedauert, bis dann ein Programm wirklich gekillt war.
jaenicke - So 12.12.10 14:53
Jakob_Ullmann hat folgendes geschrieben : |
Bei Windows XP hat das immer ewig gedauert, bis dann ein Programm wirklich gekillt war. |
Aber nur, wenn du die "bitte bitte beende dich" Funktion benutzt hast. Wenn du das im Taskmanager unter Prozesse direkt machst (also nicht unter Anwendungen), ist das Programm auch in der Regel instant beendet. ;-)
Jakob_Ullmann - So 12.12.10 15:02
jaenicke hat folgendes geschrieben : |
Jakob_Ullmann hat folgendes geschrieben : | Bei Windows XP hat das immer ewig gedauert, bis dann ein Programm wirklich gekillt war. | Aber nur, wenn du die "bitte bitte beende dich" Funktion benutzt hast. Wenn du das im Taskmanager unter Prozesse direkt machst (also nicht unter Anwendungen), ist das Programm auch in der Regel instant beendet. ;-) |
Da eben auch nicht. Das Problem konnte ich auch noch bei Windows Vista oder Windows 7 64-bit nachvollziehen (nicht mehr ganz sicher, welches es war), z. B. wenn du im Explorer eine CD brennst. Du wirfst sie aus, aber irgendwie hängt sich der Explorer dabei auf. Du wartest 3min und dann hast du nicht mehr viel von deinem Desktop.
Toll ist bei Windows auch immer der Total-Crash, wenn auf Maus und Tastatur nicht mehr reagiert wird. ;-)
jaenicke - So 12.12.10 15:23
Ja, so einen Totalhänger hatte ich bei Linux nur öfter mal beim Winen. :D
Unter Windows passiert das immer, wenn ein Programm mit nem Treiber kommuniziert. Aber wir schweifen ab. ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!