Erledigt: Mehrfacher Aufruf showmodal -> Fehler Ubuntu 12.04

Rund um die LCL und andere Komponenten
Antworten
Eb
Lazarusforum e. V.
Beiträge: 240
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Erledigt: Mehrfacher Aufruf showmodal -> Fehler Ubuntu 12.04

Beitrag von Eb »

Hallo,

habe versucht, ein Programm, das unter Windows und verschiedenen OpenSuse-Versionen fehlerfrei läuft, unter Ubuntu 12.04 auszuführen.
Dabei ist mir aufgefallen, dass ein mehrfacher direkt aufeinanderfolgender Aufruf von showmodal nicht funktioniert.

Hab das Problem reduziert und in ein Testprojekt gepackt:
Das Projekt hat zwei forms.
aus dem ersten Formular wird mit einem Button das zweite Formular modal aufgerufen.
Wenn das zweite geschlossen wird, wird es sofort wieder aufgerufen:

Code: Alles auswählen

 
procedure TForm1.Button1Click(Sender: TObject);
begin
 
  form2.Label1.Caption := 'Aufruf 1';
  form2.Showmodal;
 
  form2.Label1.Caption := 'Aufruf 2';
  form2.Showmodal;
 
  form2.Label1.Caption := 'Aufruf 3';
  form2.Showmodal;
 
  form2.Label1.Caption := 'Aufruf 4';
  form2.Showmodal;
 
  form2.Label1.Caption := 'Aufruf 5';
  form2.Showmodal;
end;   
 
Dieses wird klaglos ausgeführt unter Windows7 64-Bit, OpenSuse 11.3,OpenSuse 12.1, KUbuntu 11.04.

Unter Ubuntu 12.04 ist es so, dass - mal nach dem zweiten - mal nach dem dritten Aufruf- sich das zweite Form schliessen lässt, es aber nicht wieder erneut aufgerufen wird.
Klickt man erneut auf den Button kommt folgende Fehlermeldung:
TCustomForm.ShowModal for Form2:TForm2 impossible because already visible (hint for designer forms: set Visible property to false) already modal.

Soll wohl heißen, dass das Form schon visible ist, das stimmt aber nicht ...

Ich vermute, dass es an Gnome liegt, da 3 verschiedene KDE-Systeme das Problem nicht haben.

Hat jemand eine Idee, wie ich das Problem lösen könnte?

Ich weiss schon, dass es auch mit einem einzigen showmodal möglich wäre, das würde aber einiges an Änderungen
im Code bedeuten und ihr wisst ja: never touch a running system ...

Eingesetzte Version: Lazarus 1.0. fpc 2.6.0

Gruß
Eberhard
Dateianhänge
show_modal.zip
(127.13 KiB) 97-mal heruntergeladen
Zuletzt geändert von Eb am Fr 14. Feb 2014, 22:51, insgesamt 1-mal geändert.

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Mehrfacher Aufruf von showmodal -> Fehler unter Ubuntu 1

Beitrag von baumina »

Vielleicht hilft eine Schleife so in der Art:

Code: Alles auswählen

 
form2.Label1.Caption := 'Aufruf 1';  
form2.Showmodal;   
while Form2.Visible do
begin
  Application.ProcessMessages;
  Form2.Visible := False;
end;
form2.Label1.Caption := 'Aufruf 2';  
form2.Showmodal;
 
EDIT : Evtl. reicht auch nur das Visible auf False zu setzen, oder nur ein Processmessage. Musst mal ausprobieren mit/ohne Schleife.
.

Eb
Lazarusforum e. V.
Beiträge: 240
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: Mehrfacher Aufruf von showmodal -> Fehler unter Ubuntu 1

Beitrag von Eb »

Gute Idee.
Hat aber leider nicht geholfen.
Hab folgende Varianten probierte (Fehler bleibt):

Code: Alles auswählen

 
// ---------- Variante 1 -----------------
 form2.Label1.Caption := 'Aufruf 1';
  form2.Showmodal;
 
  while Form2.Visible do
  begin
    Application.ProcessMessages;
    Form2.Visible := False;
  end;
 
 
// ---------- Variante 2 -----------------
  form2.Label1.Caption := 'Aufruf 1';
  form2.Showmodal;
  Application.ProcessMessages;
  Form2.Visible := False;
 
 
// ---------- Variante 3 -----------------
  form2.Label1.Caption := 'Aufruf 1';
  form2.Showmodal;
//  Application.ProcessMessages;
  Form2.Visible := False;            
 
 
// ---------- Variante 4 -----------------
  form2.Label1.Caption := 'Aufruf 1';
  form2.Showmodal;
  Application.ProcessMessages;
//  Form2.Visible := False;             
 
Eb

Eb
Lazarusforum e. V.
Beiträge: 240
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: Mehrfacher Aufruf von showmodal -> Fehler unter Ubuntu 1

Beitrag von Eb »

Kann jemand mit Ubuntu 12.04 oder einem Gnome-System das Verhalten bestätigen?

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: Mehrfacher Aufruf von showmodal -> Fehler unter Ubuntu 1

Beitrag von creed steiger »

scheint ein GTK Problem zu sein.

Leider kann ich es mangels Gnome/Ubuntu und so ;) nicht nachstellen ....

Erstell ein Minimalbeispiel und dann Bug melden,oder?

Edit
ldd bei mir (Opensuse 12.3)
Beispiel funktioniert richtig
linux-gate.so.1 (0xb7734000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb76f5000)
libX11.so.6 => /usr/lib/libX11.so.6 (0xb75bb000)
libgdk_pixbuf-2.0.so.0 => /usr/lib/libgdk_pixbuf-2.0.so.0 (0xb7599000)
libgtk-x11-2.0.so.0 => /usr/lib/libgtk-x11-2.0.so.0 (0xb712e000)
libgdk-x11-2.0.so.0 => /usr/lib/libgdk-x11-2.0.so.0 (0xb707c000)
libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0xb702d000)
libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb6f2f000)
libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb6f2c000)
libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0xb6f27000)
libpango-1.0.so.0 => /usr/lib/libpango-1.0.so.0 (0xb6eda000)
libcairo.so.2 => /usr/lib/libcairo.so.2 (0xb6dc6000)
libatk-1.0.so.0 => /usr/lib/libatk-1.0.so.0 (0xb6da4000)
libdl.so.2 => /lib/libdl.so.2 (0xb6d9f000)
libc.so.6 => /lib/libc.so.6 (0xb6c25000)
/lib/ld-linux.so.2 (0xb7735000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb6c02000)
libgio-2.0.so.0 => /usr/lib/libgio-2.0.so.0 (0xb6a9f000)
libm.so.6 => /lib/libm.so.6 (0xb6a5d000)
libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0xb6a50000)
libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0xb6a4a000)
libpangoft2-1.0.so.0 => /usr/lib/libpangoft2-1.0.so.0 (0xb6a35000)
libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb69fa000)
libXrender.so.1 => /usr/lib/libXrender.so.1 (0xb69ef000)
libXinerama.so.1 => /usr/lib/libXinerama.so.1 (0xb69eb000)
libXi.so.6 => /usr/lib/libXi.so.6 (0xb69db000)
libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0xb69d0000)
libXcursor.so.1 => /usr/lib/libXcursor.so.1 (0xb69c4000)
libXcomposite.so.1 => /usr/lib/libXcomposite.so.1 (0xb69c0000)
libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0xb69bc000)
libXext.so.6 => /usr/lib/libXext.so.6 (0xb69a9000)
libffi.so.4 => /usr/lib/libffi.so.4 (0xb69a2000)
libpcre.so.1 => /usr/lib/libpcre.so.1 (0xb693e000)
libpixman-1.so.0 => /usr/lib/libpixman-1.so.0 (0xb689f000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb6814000)
libpng15.so.15 => /usr/lib/libpng15.so.15 (0xb67e4000)
libxcb-shm.so.0 => /usr/lib/libxcb-shm.so.0 (0xb67e0000)
libxcb-render.so.0 => /usr/lib/libxcb-render.so.0 (0xb67d4000)
libz.so.1 => /lib/libz.so.1 (0xb67bd000)
librt.so.1 => /lib/librt.so.1 (0xb67b4000)
libXau.so.6 => /usr/lib/libXau.so.6 (0xb67b0000)
libselinux.so.1 => /lib/libselinux.so.1 (0xb6790000)
libresolv.so.2 => /lib/libresolv.so.2 (0xb6777000)
libharfbuzz.so.0 => /usr/lib/libharfbuzz.so.0 (0xb66de000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb66b5000)
libicule.so.49 => /usr/lib/libicule.so.49 (0xb6673000)
libicuuc.so.49 => /usr/lib/libicuuc.so.49 (0xb64fb000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb640f000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb63f1000)
libicudata.so.49 => /usr/lib/libicudata.so.49 (0xb52d0000)

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

Re: Mehrfacher Aufruf von showmodal -> Fehler unter Ubuntu 1

Beitrag von wp_xyz »

Unter meinem Ubuntu 12.04 tritt dasselbe Problem auf, auf Windows läuft das Programm einwandfrei.

Wenn du aber die Form2 zur Laufzeit neu erzeugst und nach jedem ShowModal zerstörst, läuft die Demo auch auf Ubuntu:

Code: Alles auswählen

 
procedure TForm1.Button1Click(Sender: TObject);
var
  f: TForm2;
begin
  f := TForm2.Create(nil);
  try
    f.Label1.Caption := 'Aufruf 1';
    f.ShowModal;
  finally
    f.Free;
  end;
 
  f := TForm2.Create(nil);
  try
    f.Label1.Caption := 'Aufruf 2';
    f.ShowModal;
  finally
    f.Free;
  end;
 
  f := TForm2.Create(nil);
  try
    f.Label1.Caption := 'Aufruf 3';
    f.ShowModal;
  finally
    f.Free;
  end;
 
  f := TForm2.Create(nil);
  try
    f.Label1.Caption := 'Aufruf 4';
    f.ShowModal;
  finally
    f.Free;
  end;
 
  f := TForm2.Create(nil);
  try
    f.Label1.Caption := 'Aufruf 5';
    f.ShowModal;
  finally
    f.Free;
  end;
end;

Eb
Lazarusforum e. V.
Beiträge: 240
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: Mehrfacher Aufruf von showmodal -> Fehler unter Ubuntu 1

Beitrag von Eb »

Super!
Das reicht mir als Workaround völlig. Ich denke ich werde es trotzdem als Bug melden.
Vielen Dank
Eb

Antworten