Autor |
Beitrag |
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Sa 11.12.10 18:19
Hi!
Ich möchte einen visuellen Form-Designer programmieren (ist bis jetzt soweit, dass ein Grid gezeichnet wird  ). 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: Jakob_Ullmann
|
|
Jakob_Ullmann 
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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:
www.google.com/codes...s%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:
www.google.com/codes...s%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
      
Beiträge: 91
Erhaltene Danke: 9
Win2k, WinXP, Win7, Win8
Delphi 3 Pro, Delphi 5, Delphi 7, Turbo Delphi, BC1
|
Verfasst: 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 ?
Für diesen Beitrag haben gedankt: Jakob_Ullmann
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 / ...).
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...
Ich kann ja wohl in Lazarus nicht nur eine Methode überschreiben, die in der direkten Oberklasse ist.
In TControl.WndProc habe ich jedenfalls ganz oben diesen Kommentar gefunden: Delphi-Quelltext In dem Fall wird die Bearbeitung der Message abgebrochen. Deshalb vermute ich, dass es so klappt. Es müsste dann halt nur irgendwie funktionieren. 
Für diesen Beitrag haben gedankt: Jakob_Ullmann
|
|
Jakob_Ullmann 
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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 / ...).  |
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...
Ich kann ja wohl in Lazarus nicht nur eine Methode überschreiben, die in der direkten Oberklasse ist.  |
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: Delphi-Quelltext In dem Fall wird die Bearbeitung der Message abgebrochen. Deshalb vermute ich, dass es so klappt. Es müsste dann halt nur irgendwie funktionieren.  |
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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 12.12.10 14:53
|
|
Jakob_Ullmann 
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: So 12.12.10 15:02
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 12.12.10 15:23
Ja, so einen Totalhänger hatte ich bei Linux nur öfter mal beim Winen.
Unter Windows passiert das immer, wenn ein Programm mit nem Treiber kommuniziert. Aber wir schweifen ab. 
|
|
|