Autor Beitrag
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Sa 11.12.10 18:19 
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:

ausblenden 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
  { Define the Widget classes }
  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
  // Simply do nothing
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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:

ausblenden 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
  { Define the Widget classes }
  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
  // Simply do nothing
  IsSelected := not IsSelected;
end;
HeftCD
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 91
Erhaltene Danke: 9

Win2k, WinXP, Win7, Win8
Delphi 3 Pro, Delphi 5, Delphi 7, Turbo Delphi, BC1
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
// redirect messages to designer					
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:

Für diesen Beitrag haben gedankt: Jakob_Ullmann
Jakob_Ullmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: So 12.12.10 10:49 
user profile iconHeftCD hat folgendes geschrieben Zum zitierten Posting springen:
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.



user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden Delphi-Quelltext
1:
// redirect messages to designer					
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 12.12.10 11:17 
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: So 12.12.10 14:50 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 12.12.10 14:53 
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: So 12.12.10 15:02 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. ;-)