ShowModal: eigenartiges Verhalten

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

ShowModal: eigenartiges Verhalten

Beitrag von Aliobaba »

Hallo,

ich bin auf ein eigenartiges Verhalten gestoßen, das ich mir nicht erklären kann und das mir keine rechte Ruhe lässt:

Für ein Verschlüsselungsprogramm habe ich drei Eingabemasken entwickelt, die ich "universell" in mehreren Programmen einsetzen möchte. Dazu bildete ich eine Form und plazierte auf drei Panels die Eingabemasken: Eine Maske für die Vergabe von einem Passwort mit zwei Eingabefeldern (Doppelte Eingabe zur Vermeidung von Fehleingaben), eine Maske mit nur einem Feld zum Entschlüsseln mit nur einem Eingabefeld und eine dritte Maske, mit der man per Maus eine PIN aus Zahlen eingeben kann. Diese drei Panels sind verschieden groß und sollen modal per ".showmodal" von einer anderen Form aus aufgerufen werden. Die Größen der der Panels und der Form werden jeweils übergeben, je nach Bedarf.

Tagelang probierte ich alles möglich aus, weil sich die Größen des Passwort-Eingabefeldes nicht anpassen ließen; egal, was ich an Parametern und wie ich die Parameter der zweiten Form übergeben habe: Die Größe ließ sich einfach nicht ändern.

Erst, nachdem ich die Form zunächst NICHT modal geöffnet, dann gleich wieder geschlossen habe, um sie dann sofort erneut modal zu öffnen, wurden die Größenänderungen akzeptiert und ausgeführt.

Code: Alles auswählen

F_PWEingabe.Parameter_Uebernahme( 1 , 0 , 5  , 'Schlüsseldatei neu anlegen:');
      // hier wird u.a. festgelegt, mit welchen Größen die Form und das Panel sich ändert
 
       F_PWEingabe.Show;            // 2. Zeile  (erstmal "normales "show")
       F_PWEingabe.Visible:=false;  // 3. Zeile  (dann gleich wieder unsichtbar machen)
       F_PWEingabe.ShowModal;     // (dann erst funktioniert "ShowModal" wie erwartet 
 
       if F_PWEingabe.PassWd = ....;
Wenn ich die 2. und die 3. Zeile weglasse, dann öffnet das Eingabefenster immer mit derselben Größe.
MIT der zweiten und dritten Zeile werden die Größenänderungen korrekt ausgeführt.

Entsprechend der Übergabeparameter wird hier nun die Größe der Form und des Panels festgelegt:

Code: Alles auswählen

if F_PWEingabe.cry_decry = 1 then
    begin
      F_PWEingabe.Height:=185;  // ohne obigen Umweg werden diese Angaben ignoriert! ??
      F_PWEingabe.Width:=330;
      F_PWEingabe.Pn_Decry.Height:=152;
      F_PWEingabe.Pn_Decry.Width:=288;   
.....
Woran liegt das?
Könnte das ein Bug sein? (Version 1.2.6 FPC-Version 2.6.4)

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ShowModal: eigenartiges Verhalten

Beitrag von Michl »

In welchem Event rufst du denn den geposteten Code auf:

Code: Alles auswählen

if F_PWEingabe.cry_decry = 1 then
    begin
...
?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: ShowModal: eigenartiges Verhalten

Beitrag von Aliobaba »

Code: Alles auswählen

procedure TF_PWEingabe.FormShow(Sender: TObject);
begin
  .....
    WEingabe.Felder_leeren_und_loeschen;
    if F_PWEingabe.cry_decry = 1 then   // verschlüsseln  cry_decry ist öffentlich sichtbar! steuert, welche Maske erscheint
    begin
      F_PWEingabe.Height:=323;
      F_PWEingabe.Width:=330;
      F_PWEingabe.Pn_cry.Height:=168;
      F_PWEingabe.Pn_cry.Width:=288;
   ...
    end;
 
    if F_PWEingabe.cry_decry = 2 then
    begin
      F_PWEingabe.Height:=185;
      F_PWEingabe.Width:=330;
      F_PWEingabe.Pn_Decry.Height:=152;
      F_PWEingabe.Pn_Decry.Width:=288;
...
   end;
....
end;                                        
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Bitschubser
Beiträge: 61
Registriert: Mo 27. Aug 2012, 15:43

Re: ShowModal: eigenartiges Verhalten

Beitrag von Bitschubser »

Wenn du in FormShow einen Breakpoint setzt - wird der bei ShowModal angelaufen?

Ansonsten: In der Methode FormShow des Typs TF_PWEingabe greifst du nicht auf (self.)Height/Width sondern auf Height/Width der Instanz F_PWEingabe.Height - ist da beabsichtigt oder könnte das mit dem Problem zu tun haben?

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: ShowModal: eigenartiges Verhalten

Beitrag von Aliobaba »

Ich poste mal die gesamte Procedure (auch wenn das evtl bei Euch Profis ein müdes Lächeln auslösen wird) :

Code: Alles auswählen

procedure TF_PWEingabe.FormShow(Sender: TObject);
begin
  F_PWEingabe.Width:=302;
  F_PWEingabe.Top:=F_MyPW.Top + 150;
  F_PWEingabe.Left:=F_MyPW.Left + 80;
  F_PWEingabe.Bt_PW_cry_ok.Enabled:=false;
  F_PWEingabe.Bt_PW_decry_ok.Enabled:=false;
  F_PWEingabe.PassWd := '';
  F_PWEingabe.Felder_leeren_und_loeschen;
 
    if F_PWEingabe.cry_decry = 1 then  // verschlüsseln  cry_decry ist öffentlich sichtbar! steuert, welche Maske erscheint
    begin
      F_PWEingabe.Height:=323;
      F_PWEingabe.Width:=330;
      F_PWEingabe.Pn_cry.Height:=168;
      F_PWEingabe.Pn_cry.Width:=288;
 
      F_PWEingabe.Height:= 187;
      F_PWEingabe.Pn_Decry.Left:=5600;
      F_PWEingabe.Pn_Zahleingabe.Left:= 5500;
      F_PWEingabe.Pn_cry.Left:=8;
      Lb_PW_neu.Caption:= Bezeichnung;
 
      Lb_Eingabezahl_1.Caption := inttostr(F_PWEingabe.min_Zahl_bei_Eingabe);
      F_PWEingabe.Ed_PW1.SetFocus;      // geht im Funktionsaufruf noch nicht!?
    end;
 
    if F_PWEingabe.cry_decry = 2 then
    begin
      F_PWEingabe.Height:=185;
      F_PWEingabe.Width:=330;
      F_PWEingabe.Pn_Decry.Height:=152;
      F_PWEingabe.Pn_Decry.Width:=288;
 
 
      F_PWEingabe.Height:= 187;
      F_PWEingabe.Pn_cry.Left:=5600;
      F_PWEingabe.Pn_Zahleingabe.Left:= 5500;
      F_PWEingabe.Pn_Decry.Left:=8;
      Lb_PW_eingeben.Caption:= Bezeichnung;
 
      Lb_Eingabezahl_2.Caption := inttostr(F_PWEingabe.min_Zahl_bei_Eingabe);
      F_PWEingabe.Ed_PW_decry.SetFocus;
    end;
 
    if F_PWEingabe.cry_decry = 3 then   // Zahleneingabe
    Begin
      F_PWEingabe.Height:=361;
      F_PWEingabe.Width:=330;
      F_PWEingabe.Pn_Zahleingabe.Height:=328;
      F_PWEingabe.Pn_Zahleingabe.Width:=296;
 
      F_PWEingabe.Pn_cry.Left:=5600;
      F_PWEingabe.Pn_Decry.Left:=5500;
      F_PWEingabe.Pn_Zahleingabe.Left:= 8;
      Lb_PIN_Eingabe.Caption:= Bezeichnung;
 
      Zahl_Eingabe_init;   // Zahlenanzeige wird "gemischt"
      Lb_Eingabezahl_3.Caption := inttostr(F_PWEingabe.min_Zahl_bei_Eingabe);
      Ed_ZahlZeigen.SetFocus;
    end;
end;                              
Hier werden also die einzelnen Panels (mit den oben beschriebenen verschiedenen Arten der Passwort-Eingabe) aufgerufen.
Das funktioniert!!! ... wird also angesprungen, auch wenn man ohne den beschriebenen Umweg "ShowModal" aufruft!!
Nur die Größen der Form und der drei verschiedenen Panels bleiben bei verschiedenen Aufrufen immer gleich.

Auch an anderer Stelle bereitete mir das "ShowModal" schon Kopfschmerzen. Die aufgerufene Form verhält sich unterschiedlich wenn VOR dem Aufruf von xx.ShowModal ein "ShowMessage ('xy')" steht oder nicht. (ist aber erstmla ein "Nebenkriegsschauplatz)

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ShowModal: eigenartiges Verhalten

Beitrag von Michl »

Anbei mal ein kleines Testprog.

Mit Button 1 wird ein neues Formular mit 100 x 100 Pixel geöffnet.
Mit Button 2 wird ein neues Formular mit 200 x 200 Pixel geöffnet.
Mit Button 3 wird ein neues Formular mit 300 x 300 Pixel geöffnet.

Funktioniert bei mir tadellos, bei dir auch?
Dateianhänge
MinimalShowmodal.zip
(2.54 KiB) 60-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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

Re: ShowModal: eigenartiges Verhalten

Beitrag von wp_xyz »

Ach Michl, warum bist du so schnell? Hier trotzdem mein eigenes Programm, das eigentlich dasselbe macht, es vergleicht auch noch den fall eines zur Laufzeit erzeugten (Button1 und Button2) mit dem eines automatisch generierten Formulars (Button3 und Button4). Beide Fälle funktionieren, wie bei Michl. Ein Bug ist es schon mal nicht.

Aliobaba, erzeugst du das Formular zur Laufzeit? Dann wird dein Code nicht funktioneren, weil du die Formularinstanz im Code der Klasse verwendest. Alle F_PWEingabe müssen weg, sonst funktioniert das ganze nur mit der Instanz, die diesen namen hat.
Dateianhänge
showModal.zip
(2.66 KiB) 54-mal heruntergeladen

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: ShowModal: eigenartiges Verhalten

Beitrag von Aliobaba »

Hallo,

Danke für die Beispielprogramme. Es ist schon etwas spät heute und werde es mir morgen nochmal genauer ansehen.

zum MinimalShow - Programm von Michl:
Button 1 und Button 2 funktionieren;
Bei Button 3 tut sich gar nichts.
Ich muss das Programm entweder über Lazarus (rotes Viereck) beenden. Wenn ich das kompilierte Programm direkt starte, dann friert das Programm nach Betätigen des Button3 total ein; es hilft nur noch ein "Abschießen" mit KSysGuard. (Ach ja: Ich arbeite unter Linux/Kubuntu)

zum showModal - Programm von wp_xyz:
Da passiert schon wieder Seltsames: Das Programm funktioniert: Aber nur Einmal. :( Wenn das Programm kompiliert worden ist (mit dem "grünen Dreieck") dann erscheint beim Versuch, es nochmal zu kompilieren das:
ShowModal1.png
Wenn man dann das kompilierte Programm project1 (nicht .exe, da Linux) löscht, dann kann man es neu kompilieren und es funktioniert - aber eben wieder nur einmal.
@ wp_xyz: Nein, das Formular erzeuge ich nicht zur Laufzeit.
Allerdings muss ich das Programm vollständig laden/starten, um dann "mit einem Button weiter zu machen". Bei sofortigem Aufruf des ".showmodal" unter "oncreate" oder "onpaint" oder "onshow" usw. funktioniert der Aufruf nicht richtig; wahrscheinlich, weil das zweite Formular noch nicht richtig "created" ist.

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: ShowModal: eigenartiges Verhalten

Beitrag von Aliobaba »

Soo, neuer Tag - neues Glück...

Mit Eurer Hilfe bin ich ein Stück weiter gekommen.

Ich habe das Programm modifiziert:
MyShowmodal.zip
(50.86 KiB) 61-mal heruntergeladen
Und in der Tat werden die Größen der Form2 nicht neu eingelesen (unter Linux)

Button 5 und Button 6 -> Aufruf von "ShowModal" "direkt"
Button 7 und Button 8 -> Aufruf von "ShowModal" nach vorher "Show" -> und dann -> "visible:false"

Je nachdem, was vorher unter Button 7 oder Button 8 aufgerufen wird sind die Größen in Form2 unterschiedlich.

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

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

Re: ShowModal: eigenartiges Verhalten

Beitrag von wp_xyz »

Warum setzst du die Formulargrößen etc eigentlich nicht gleich in deiner Routine "ParameterUebergabe"? Damit ersparst du dir das Zwischenspeichern dieser Größen.

Code: Alles auswählen

Procedure TForm2.Parameteruebergabe ( fh , fw , ph , pw : integer ; txt : string);
begin
  Height := fh;
  Width := fw;
  Panel1.Height := ph;
  Panel1.Width := pw;
  EdText.Text := txt;
end; 

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: ShowModal: eigenartiges Verhalten

Beitrag von Aliobaba »

... ich habe mal gelernt, dass man möglichst wenige "öffentliche" Variable verwenden sollte.
Außerdem, wenn ich diese Form bei verschiedenen Anwendungen verwenden will, habe ich immer die gleiche Procedure und brauche mich nicht um die Namen der öffentlichen Variablen kümmern.
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Antworten