MessageDlg: Automatisch OK drücken?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

MessageDlg: Automatisch OK drücken?

Beitrag von catweasel »

Moin

Ich habe hier ein Problem wo ich nicht recht weiterkomme.
Mögliche Fehler fange ich mit einem try-except Block ab, wobei ich im Fehlerfall einen Text mit MessageDlg ausgebe und die procedure verlasse. Das funktioniert auch soweit.

Problem: Wenn ich die Dialogbox nicht mit OK wegdrücke, stürzt das Programm das nächste mal ab wenn es an diese Programmstelle kommt.

Frage: Gibt es eine möglichkeit den OK-Button automatisch per Befehl zu drücken bevor ich an den try-except Block komme?

Code: Alles auswählen

try
  o := SO(Str.DataString).o['status'].o['service_status'];
except
  {todo:Hier Absturz wenn nicht OK gedrückt wird bis zum nächsten refresh}
  MessageDlg('Fehler'+chr(13)+Str.DataString,mtError, [mbOK], 0);
  exit;
end;
Gruß
Michael

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: MessageDlg: Automatisch OK drücken?

Beitrag von Socke »

catweasel hat geschrieben:Problem: Wenn ich die Dialogbox nicht mit OK wegdrücke, stürzt das Programm das nächste mal ab wenn es an diese Programmstelle kommt.
Welche anderen Möglichkeiten hast du denn sonst noch, damit dein Programm wieder an diese Programmstelle kommen kann, ohne dass du auf "OK" drückst? Soweit ich das sehe ist das nur das "X" im Fensterrahmen und das sollte (da du nur einen Button hast) mit "OK" identisch sein.

Die Fehlerursache ist also wahrscheinlich nicht der Dialog sondern liegt an irgendeiner anderen Stelle.
catweasel hat geschrieben:Frage: Gibt es eine möglichkeit den OK-Button automatisch per Befehl zu drücken bevor ich an den try-except Block komme?
Da der Message-Dialog in deinem Code-Beispiel in dem try-except-Block liegt ... Nein. Du kannst den OK-Button erst drücken, wenn er da ist -- und selbst das wäre vermutlich zu aufwendig.

Versuch's mal hiermit:

Code: Alles auswählen

try
  o := SO(Str.DataString).o['status'].o['service_status'];
except
  on Exception do
  begin
    MessageDlg('Fehler'+chr(13)+Str.DataString,mtError, [mbOK], 0);
    exit;
  end;
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: MessageDlg: Automatisch OK drücken?

Beitrag von catweasel »

Danke für die Hinweise

Gruß und einen schönen Sonntag
Michael

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: MessageDlg: Automatisch OK drücken?

Beitrag von Antrepolit »

catweasel hat geschrieben: (...)

Code: Alles auswählen

try
  o := SO(Str.DataString).o['status'].o['service_status'];
except
  {todo:Hier Absturz wenn nicht OK gedrückt wird bis zum nächsten refresh}
  MessageDlg('Fehler'+chr(13)+Str.DataString,mtError, [mbOK], 0);
  exit;
end;
(...)
Du greifcst in deinem Except statt auf die Message der korrekten Exception (Sub-Typ) auf das (vermutlich) Fehlerverursachende Element Str zu. Was soll das?
Grüße, Antrepolit

care only if your os is really burning

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: MessageDlg: Automatisch OK drücken?

Beitrag von catweasel »

Antrepolit hat geschrieben:Du greifcst in deinem Except statt auf die Message der korrekten Exception (Sub-Typ) auf das (vermutlich) Fehlerverursachende Element Str zu. Was soll das?
Entschuldigung, ich verstehe nicht was Du meinst...
Kannst Du das noch genauer erleutern?

Gruß
Michael

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: MessageDlg: Automatisch OK drücken?

Beitrag von Hitman »

Angenommen str wäre nil, dann würde ein Zugriff auf str.DataString zu ner Exception führen. Du landest also im except Block deines try-except. Dort greifst du nun wieder auf das verursachende Element zu ... was soll da noch passieren? Es geht wieder schief.

Also nochmal gesagt: du solltest im except Teil NIE auf potenziell fehleranfällige Objekte/Variablen zurückgreifen. Vorzugsweise sollte dort nur aufgeräumt und Details ausgegeben werden ... aber wie gesagt: VORSICHT!

Wobei ich den Fehler trotzdem woanders vermuten würde, da du ja von "refresh" sprichst. Möglicherweise machst du irgendwas mit Fokus oder aktiven Controls, was während einem modalen Dialogaufruf (--> MessageBox) eventuell gegen die Wand läuft.

Edit: Das bringt mich drauf ... wie kann das Programm denn überhaupt ein zweites Mal an diese Stelle kommen, wenn das erste noch gar nicht wegegklickt wurde? Das klingt sehr nach einem Aufruf aus einem Thread heraus. Und das wiederum sollte und darf man nicht tun, denn die LCL ist nicht thread-sicher!

Antworten