Frage zu QuestionDlg [gelöst]

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
six1
Beiträge: 498
Registriert: Do 1. Jul 2010, 19:01

Re: Frage zu QuestionDlg [gelöst]

Beitrag von six1 »

Ok, den aktiven BitBtn habe ich jetzt gleich im Arraydurchlauf gesetzt.

Das Array QButton habe ich sofort auf die richtige Länge gesetzt.

Das Flackern entsteht vielleicht, weil ich QForm sichtbar und unsichtbar schalten muss, da sonst die Berechnungen zur width und height nicht funktionieren.
Ich weiß nicht, wie man das umgehen könnte.

Edit: Ich habe das sichtbar schalten jetzt "optimiert". Bei mir ist ein Flackern nicht mehr wahrnehmbar.

Download: viewtopic.php?p=124829#p124829
Gruß, Michael

Sieben
Beiträge: 127
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: i386

Re: Frage zu QuestionDlg [gelöst]

Beitrag von Sieben »

Mir ist noch aufgefallen, dass das Mapping von AX auf TPosition nicht ganz stimmt, da wäre noch 1 abzuziehen:

Code: Alles auswählen

  QForm.Position := TPosition(-AX-1);
und dass poOwnerFormCenter ohne OwnerForm auch nicht recht will. Deshalb vielleicht:

Code: Alles auswählen

  QForm:=TForm.Create(Screen.ActiveCustomForm);

Benutzeravatar
six1
Beiträge: 498
Registriert: Do 1. Jul 2010, 19:01

Re: Frage zu QuestionDlg [gelöst]

Beitrag von six1 »

Erledigt, Danke!
Gruß, Michael

wp_xyz
Beiträge: 4016
Registriert: Fr 8. Apr 2011, 09:01

Re: Frage zu QuestionDlg [gelöst]

Beitrag von wp_xyz »

six1 hat geschrieben:
Sa 20. Nov 2021, 16:28
Edit: Ich habe das sichtbar schalten jetzt "optimiert". Bei mir ist ein Flackern nicht mehr wahrnehmbar.
Wenn ich mich auf die Titelzeile des Hauptformulars konzentriere, das den QuestionDlg anzeigt, dann sehe ich immer noch, dass sie von dunkelblau auf hellgrau, wieder auf dunkelblau und schließendlich nochmal auf hellgrau wechselt. Das wird von der folgenden Code-Stelle verursacht:

Code: Alles auswählen

  QForm.Visible:=true;
  rawTextWidth := GetWidthOfCaptionText(QMsg);
  QForm.Visible:=false;
Das Umschalten von QForm.Visible kannst du entfernen, denn ich habe für die Längenmessung des Label-Textes ein Hilfs-Bitmap verwendet, so dass das auch funktioniert, wenn QForm noch nicht soweit ist. Zumindest bei mir ist das Flackern der Titelzeile damit weg.

Wenn du das änderst, dann ergänze doch bitte noch die Initialiserung von PreButton und QButtonArray mit nil, damit die entsprechende Hinweismeldung verschwindet. Und die Funktion getHeightOfCaptionText kannst du löschen, sie wird nach dem Autosizing nicht mehr benötigt.

Benutzeravatar
six1
Beiträge: 498
Registriert: Do 1. Jul 2010, 19:01

Re: Frage zu QuestionDlg [gelöst]

Beitrag von six1 »

Hast du mal mit vielen Buttons und kurzem Message Text probiert?

Bei mir sieht es so aus mit Qform.visible:=true/false;

QForm.Visible:=true;
QButtonPanel.AutoSize := true;
QBottomPanel.AutoSize := true;
QForm.Visible:=false;
Image6.jpg
Image6.jpg (8.67 KiB) 245 mal betrachtet

QButtonPanel.AutoSize := true;
QBottomPanel.AutoSize := true;
Image7.jpg
Image7.jpg (6.99 KiB) 245 mal betrachtet
Gruß, Michael

wp_xyz
Beiträge: 4016
Registriert: Fr 8. Apr 2011, 09:01

Re: Frage zu QuestionDlg [gelöst]

Beitrag von wp_xyz »

Ich habe nun die Unit kräftig überarbeitet und auch ein Test-Projekt angehängt. Für mich funktioniert nun alles richtig. Auch kein Flackern mehr.

Grob die Änderungen:
  • QForm ist nun doch eine eigene Fensterklasse. Damit kann man die große, unhandliche InternalCreateQuestionDlgEx-Prozedur vermeiden, und auch die HelpClickHandler-Klasse ist nun nicht mehr nötig. Die Klasse TQForm ist von außen nicht zugänglich, denn Positionierungsberechnungen sind davon abhängig, wie z.B. die Anker der Controls gesetzt sind, also vom Zeitpunkt des Aufrufs, und ich wollte keine weitere Arbeit reinstecken, das allgemeingültiger zu machen. Damit die weiter oben geäußerte Idee, evtl eine Checkbox für "Nicht mehr anzeigen", für den User schwieriger zu realisieren...
  • Die HelpCtx/HelpKeyword-Angaben setze ich wieder in der direkt aufrufenden Routine. Damit ist das Überladen von CreateQuestionDlgEx und das InternalCreateQuestionDlgEx nicht mehr nötig.
  • Ich habe einige globale Variablen vorbereitet, mit denen man den Dialog verändern kann. Alle haben "QuestionDlgEx_" als Vorsilbe zur Unterscheidung von ähnlichen Variablen. (Ja, globale Variablen sind sch...) Nun kann man die Buttons rechtsbündig setzen, oder den Text zentrieren. Oder man kann auch die Icons der Buttons ausschalten. Die Änderung der Fontgröße funktioniert, das Layout passt sich an. ist nur dann aktiv, wenn die gesamte Buttonbreite kleiner ist als die Textbreite, so dass Buttons nie abgeschnitten werden.
  • Den Stellvertreter-Wert für nicht verwendetes X und Y habe ich von -1 auf MaxInt geändert. Damit entfällt der Konflikt mit der negativen ord(poXXXX) Einstellung. Hier ist auch nun kein Offset um 1 mehr nötig. Allerdings verhalten sich die poDefault* nicht so wie erwartet, aber ich denke, das ist kein Problem, weil eigentlich nur die poXXXCenter Werte von Interesse sind. poDesigned interpretiere ich so wie sich die Dialogbox verhält, wenn kein X/Y angegeben ist.
Dateianhänge
QuestionDlgEx.zip
(9.42 KiB) 9-mal heruntergeladen

Benutzeravatar
six1
Beiträge: 498
Registriert: Do 1. Jul 2010, 19:01

Re: Frage zu QuestionDlg [gelöst]

Beitrag von six1 »

Da hast du dir aber eine Menge Arbeit gemacht!
Das Ergebnis hat mit meiner "primitiven Arbeit" nichts mehr zu tun. 8) (Du kannst meinen Namen gerne aus dem © rausnehmen! )
Funktioniert 1a.

Danke!
Zuletzt geändert von six1 am Mo 22. Nov 2021, 13:20, insgesamt 1-mal geändert.
Gruß, Michael

Benutzeravatar
Ally
Beiträge: 186
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Frage zu QuestionDlg [gelöst]

Beitrag von Ally »

Hallo wp_xyz

ich kann mich six1 nur anschließen: Toll gemacht!!

Eine Frage hätte ich noch: Durch die Verwendung von BorderIcons := []; verschwindet das Schließen-Kreuzchen, das sonst bei Dialogen vorhanden ist.
Muss das so oder kann das weg? :?

Gruß Roland

Sieben
Beiträge: 127
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: i386

Re: Frage zu QuestionDlg [gelöst]

Beitrag von Sieben »

Nun kann man die Buttons rechtsbündig setzen, oder den Text zentrieren.
Und schon kommt der nächste Wusch, bzw die nächste Anregung um die Ecke - wie wäre es auch noch mit QuestionDlgEx_GnomeButtonOrder...? Bezüglich rechtsbündiger Buttons finde ich es übrigens erstaunlich, dass Windows sich bei seinem MessageDialog bis heute nicht an die eigenen Style Guides zu halten scheint.

Aber wirklich sehr schön jetzt, und sehr sauber gegliedert. Wenn ich das einfach mal so sagen darf...

Benutzeravatar
Winni
Beiträge: 980
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Frage zu QuestionDlg [gelöst]

Beitrag von Winni »

Sieben hat geschrieben:
Mo 22. Nov 2021, 13:50
Bezüglich rechtsbündiger Buttons finde ich es übrigens erstaunlich, dass Windows sich bei seinem MessageDialog bis heute nicht an die eigenen Style Guides zu halten scheint.
Hi!

Windows hat sich noch nie an seine eigenen Style Guides gehalten.
Bei KDE ist das allerdings die Bibel.

Winni

wp_xyz
Beiträge: 4016
Registriert: Fr 8. Apr 2011, 09:01

Re: Frage zu QuestionDlg [gelöst]

Beitrag von wp_xyz »

Habe die angepasste Unit inkl. Demo-Projekt nun auf CCR in Package ExCtrls hochgeladen (https://sourceforge.net/p/lazarus-ccr/s ... s/exctrls/), wobei ich den Unit-Namen nun an die allgemeine Namensgebung in diesem Package angepasst habe (--> ExQuestionDlg). Die Unit ist autark. Wenn man also das ganze ExCtrls-Package nicht installieren will, so kann man sich die Datei einfach ins eigene Projekt kopieren.
Ally hat geschrieben:
Mo 22. Nov 2021, 13:08
Durch die Verwendung von BorderIcons := []; verschwindet das Schließen-Kreuzchen, das sonst bei Dialogen vorhanden ist.
Ist mir gar nicht aufgefallen. Musste eine Zeit lang suchen, bis ich das beheben konnte, weil die Liste der biXXXX Werte kein "biClose" enthält...
Sieben hat geschrieben:
Mo 22. Nov 2021, 13:50
Nun kann man die Buttons rechtsbündig setzen, oder den Text zentrieren.
Und schon kommt der nächste Wusch, bzw die nächste Anregung um die Ecke - wie wäre es auch noch mit QuestionDlgEx_GnomeButtonOrder...? Bezüglich rechtsbündiger Buttons finde ich es übrigens erstaunlich, dass Windows sich bei seinem MessageDialog bis heute nicht an die eigenen Style Guides zu halten scheint.
Das war nur ein Beispiel. QuestionDlgEx_ButtonAlignment und QuestionDlgEx_TextAlignment, die für die Ausrichtung von Buttons und Text zuständig sind, sind vom Typ TAligment, erlauben also links- und rechtsbündige, sowie zentrierte Ausrichtung.

Unter Gnome_ButtonOrder verstehst du wahrscheinlich die Linux-Konvention, den Cancel-Button links vom OK-Button zu zeigen, im Gegensatz zu Windows, wo Cancel rechts ist. Das spielt bei dieser Funktion keine Rolle, denn die Reihenfolge der Buttons wird durch die Reihenfolge der Parameter in dem AButtons-Array bestimmt. Diese vom Original QuestionDlg übernommene Konstruktion ist ein "Array of const", kann also verschiedene Typen enthalten, wobei natürlich bestimmte Konventionen einzuhalten sind:
- Zuerst kommt der mbXXXX Wert für den Button, z.B. mbYes
- Dann optional der auf dem Button anzuzeigende Text, hier z.B.: "Ja" (Wenn man das weglässt, wird die interne Button-Beschriftung verwendet).
- Dann optional der Zusatz "IsDefault" bzw. "IsCancel", um für diesen so definierten Button die Default- bzw. Cancel-Property zu aktivieren.
- Dann wird dasselbe mit dem nächsten Button wiederholt.

Für die Abfolge "Ja"-"Nein"-"Abbrechen" würde man damit für AButtons angeben:

Code: Alles auswählen

  [mbYes, 'Ja', 'IsDefault', mbNo, 'Nein', mbCancel, 'Abbrechen', 'IsCancel']
// oder einfacher mit der eingebauten Beschriftung und ohne Default/Cancel-Festlegung
  [mbYes, mbNo, mbCancel]
Wenn du unter Linux eine andere Reihenfolge willst, nur zu. Du musst die Einträge nur in der betreffenden Reihenfolge angeben.
Zuletzt geändert von wp_xyz am Mo 22. Nov 2021, 21:54, insgesamt 1-mal geändert.

Sieben
Beiträge: 127
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: i386

Re: Frage zu QuestionDlg [gelöst]

Beitrag von Sieben »

Stimmt, das hatte ich jetzt grad wieder nicht parat...

Benutzeravatar
Ally
Beiträge: 186
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Frage zu QuestionDlg [gelöst]

Beitrag von Ally »

wp_xyz hat geschrieben:
Mo 22. Nov 2021, 18:05
Ist mir gar nicht aufgefallen. Musste eine Zeit lang suchen, bis ich das beheben konnte, weil die Liste der biXXXX Werte kein "biClose" enthält...
Oh, ich glaube da liegt ein Missverständnis vor. Eigentlich war mein Vorschlag die Zeile, "BorderIcons := [];" jetzt "BorderIcons := [biSystemMenu];", ganz zu entfernen.
So wie es aussieht wird durch setzen von BorderStyle := bsDialog; das Schließen-Kreuzchen automatisch angezeigt.

Gruß Roland

wp_xyz
Beiträge: 4016
Registriert: Fr 8. Apr 2011, 09:01

Re: Frage zu QuestionDlg [gelöst]

Beitrag von wp_xyz »

Ich hatte (habe) da ein Problem unter Linux/gtk2, genauer: Ubuntu 21. Wenn BorderStyle = bsDialog ist, "klebt" das aufrufende Formular am Dialog, und wenn man den Dialog verschiebt, dann zieht er das Formular mit. Seltsam. Mit bsSingle ist das nicht der Fall, aber da kommen alle BorderIcons --> nur noch biSystem zulassen. Aber nachdem das auf meiner Mint-VM nicht auftritt, bin ich wieder zu bsDialog zurückgegangen.

wp_xyz
Beiträge: 4016
Registriert: Fr 8. Apr 2011, 09:01

Re: Frage zu QuestionDlg [gelöst]

Beitrag von wp_xyz »

Jetzt habe ich noch etwas eingebaut, was kein anderer der Standard-Dialoge kann: Wenn man als DialogTyp mtCustom auswählt kann man dem Dialog über QuestionDlgEx_CustomIcon ein fremdes Bild als Icon unterschieben.
Dateianhänge
QuestionDlgEx.png
QuestionDlgEx.png (12.09 KiB) 43 mal betrachtet

Antworten