Autor |
Beitrag |
flaavia
      
Beiträge: 105
WinXp Vista
D6 Ent, D2007 Ent
|
Verfasst: So 04.01.04 16:44
Hallo
Aus mir nicht ganz klaren Gründen funktionieren meine ShowMessage-MessageBoxes seit einiger Zeit nur noch modal, d.h. ich muss erst den ok-Butten anklicken, damit das Program weitergeht (bis vor einiger Zeit war dies nicht so, da lief das Program weiter, obwohl die MessageBox angezeigt wurde, die verschwand dann in den Hintergrund und konnte später weggeklickt werden - vielleicht weiss jemand auch woran dieses neue Verhalten liegen kann)
Jetzt würde ich diesen ok-Button gerne direkt anprechen, nach dem Motto:
MessageBox.okButtonClick
da ich nicht an der Tastatur sitze, sondern dies mit den Buttons eines Gamepads auslösen möchte.
Weis jemand wie man so etwas macht und wie der hypothetische Aufruf: MessageBox.okButtonClick wirklich geht??
Vielen Dank im voraus für alle Tips
|
|
Alexander F
      
Beiträge: 149
Win XP, Win 2000
D6 PE, D7 Prof, D8 Prof
|
Verfasst: So 04.01.04 16:59
Probier folgendes mal:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| var handle : HWND; begin ShowMEssage(Application.Title); handle := FindWindow('TMessageForm', PCHar(Application.Title)); SendMessage(handle, WM_Close, 0,0); |
(ist nciht getestet)
|
|
flaavia 
      
Beiträge: 105
WinXp Vista
D6 Ent, D2007 Ent
|
Verfasst: So 04.01.04 21:23
Hallo Alexander F
Vielen Dank für die Antwort.
Leider werde ich trotz längerem Herumprobiern nicht schlauer.
Was muss ich denn in
Delphi-Quelltext 1:
| handle := FindWindow('TMessageForm', PCHar(Application.Title)); |
wodurch ersetzen ? oder muss dies so wörtlich stehen bleiben (bloß damit funktioniert es nicht) (muss für Application.Title dieser eingesetzt werden oder Application.Title wortwörtlich so stehen bleiben? -- TMessageForm finde ich in meiner Hilfe und F1 nicht, muß ich dies durch irgendetwas ersetzen?? und muss dies nicht auch ein Pointer sein ?
vielen Dank im voraus
|
|
Alexander F
      
Beiträge: 149
Win XP, Win 2000
D6 PE, D7 Prof, D8 Prof
|
Verfasst: Mo 05.01.04 11:51
Füg mal ein Application.ProcessMessages; davor...
Ich schätze mal das der Code gar nicht ausgeführt wird, weil es eine Modale Message-Form ist,.
'TMessageForm' müsste richtig sein...
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 05.01.04 14:08
Titel: Genau!
Hallo!
Also ShowMessage zeigt ein modales Fenster an, deshalb kannst Du derweil keinen anderen Code ausführen, es sei denn Du benutzt Threads. Mit Threads müsste es gehen!
Ein Tutorial zu Threads von Luckie findest Du unter
www.delphi-forum.de/...amp;highlight=thread
Und um festzustellen, was ShowMessage macht, klick doch einfach mal auf ShowMessage während Du Strg festhälst...
(Ich machs auch mal...)
MfG,
S.J.
|
|
Alexander F
      
Beiträge: 149
Win XP, Win 2000
D6 PE, D7 Prof, D8 Prof
|
Verfasst: Mo 05.01.04 19:31
Oder du müsstest einen Timer nutzen, der allerdings mehr Resourcen verbraucht, allerdings wenn du den nur kurz vorhér enablest und dann wieder beendest, ist das wohl nicht so schlimm.
Das Prinzip (das ich gepostet habe), müsste aber das gleiche bleiben...
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 05.01.04 21:13
Titel: Re: modale ShowMessage-MessageBox -wie den ok-Button anprech
flaavia hat folgendes geschrieben: |
Aus mir nicht ganz klaren Gründen funktionieren meine ShowMessage-MessageBoxes seit einiger Zeit nur noch modal,
|
Kann nicht sein. Die waren schon immer modal.
Zitat: |
d.h. ich muss erst den ok-Butten anklicken, damit das Program weitergeht (bis vor einiger Zeit war dies nicht so, da lief das Program weiter, obwohl die MessageBox angezeigt wurde, die verschwand dann in den Hintergrund und konnte später weggeklickt werden - vielleicht weiss jemand auch woran dieses neue Verhalten liegen kann) |
Dass sie in den Hintergrund verschwanden kann ich mir gar nicht vorstellen.
Aber wenn du sie nicht haben willst, was nützen Messageboxen die einen Benutzer benachrichtigen sollen, wenn sie aber dann doch im Hintergrund verschwinden, dann zeig sie doch gar nicht erst an. 
|
|
flaavia 
      
Beiträge: 105
WinXp Vista
D6 Ent, D2007 Ent
|
Verfasst: Di 06.01.04 18:16
hallo
Vielen Dank für die Antworten.
@Luckie: ja Du hast natürlich recht, die MessageBoxes nutzen nur wenn man sie sieht. Ich habe mein Program im Programmierverlauf um eine Fernsteuermöglichkeit erweitert, so daß ich dann ohne den Monitor zu sehen mit Knopfdruck die normalen Funktionen durchführen kann. Gleichzeitig habe ich aber auch einige Meldungen mit eingebaut (schon vor der Fernsteuerzeit), die mir anzeigen, daß etwas suboptimal läuft. Ohne Fernsteuerung kann man die natürlich einfach zur Kenntnis nehmen und wegklicken. Jetzt mit Fernsteuerung kann ich eben den ok-Button nicht erreichen, da kein Code mehr ausgeführt wird (und muss doch wieder zum Monitor und dann dort klicken). Komischerweise ging es vor einigen Wochen so, daß ich die ganzen angesammelten MessageBoxes nacheinander wegklicken konnte, wenn sich diese angesammelt hatten - warum das so ist insbesondere warum es jetzt nicht mehr so ist weiß ich nicht - bzw. wenn MessageBox modal ist, dann ist klar warum es jetzt nicht geht, aber rätselhaft, warum es dann davor ging
@ Alexander F: Danke für die Tips. Ja ich glaube auch, das der code gar nicht ausgeführt wird, da die Abarbeitung an der modalen Zeile von ShowMessage stehen bleibt. Wenn man das MessageFenster dann wegklickt, ist es natürlich weg, der Code läuft weiter und FindWindow kann das Fensterhandle nicht mehr zuordnen, weil das Fenster ja schon weggeklickt ist ...
Oder habe ich vieleicht doch etwas falsch verstanden. Application.ProcessMessages ändert doch eigentlich daran nichts oder ? modal bleibt doch modal, oder
Die Idee mit dem Timer ist gut, vielen Dank
@jaenicke: Danke für die Tips. Ich werde mich über Threads mal belesen. Kann man da viel falsch machen? Eigentlich möchte ich meine Programme möglichst einfach halten - klar ist alles einfach, was man versteht, so wahrscheinlich auch Threads wenn man richtig durchblickt
Eventuell definiere ich mir einfach ein MyShowMessage, das dann nicht modal ist und die Message einfach nur in eine Stringliste einträgt.
Vielen Dank nochmal für all die netten Vorschläge
Mit freundlichen Grüssen
|
|
Alexander F
      
Beiträge: 149
Win XP, Win 2000
D6 PE, D7 Prof, D8 Prof
|
Verfasst: Di 06.01.04 21:10
Hi,
das die Message Modal ist hat ja schon einen Sinn
Naja schau mal auf Luckies Seite der hat da glaube ich was über Threads stehen.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 07.01.04 13:19
Titel: Also, mal erweiterte ShowMessage
Hallo!
Also ich hab jetzt mal den ShowMessage Quelltext so abgeändert, dass festgelegt werden kann, ob es modal sein soll oder nicht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function ShowMessageExt(Msg: String; Modal, OnTop: Boolean): TForm; begin Result:=CreateMessageDialog(Msg, mtCustom, [mbOk]); with Result do begin HelpContext := 0; HelpFile := ''; Position := poScreenCenter; If onTop then FormStyle:=fsStayOnTop; If Modal then begin ShowModal; Result:=nil; end Else Show; end; end; |
Die Benutzung geht dann so:
Ich habe auf Form1 jetzt drei Buttons: Button1, Button2 und Button3.
Der erste zeigt ein modales ShowMessage an, der zweite ein nicht modales
und der dritte schließt das angezeigte nicht modale ShowMessage-Fenster.
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: 28: 29: 30:
| var Dialogfenster: TForm;
procedure TfrmMain.OkButtonClick(Sender: TObject); begin Dialogfenster.Close; end;
procedure TfrmMain.Button1Click(Sender: TObject); begin ShowMessageExt('Test',True,False); end;
procedure TfrmMain.Button2Click(Sender: TObject); begin Dialogfenster:=ShowMessageExt('Test',False,True); TButton(DialogFenster.FindComponent('OK')).OnClick:=OkButtonClick; end;
procedure TfrmMain.Button3Click(Sender: TObject); begin If Dialogfenster<>nil then Dialogfenster.Free; end; |
MfG,
S.J.
|
|
flaavia 
      
Beiträge: 105
WinXp Vista
D6 Ent, D2007 Ent
|
Verfasst: Fr 16.01.04 20:56
Vielen Dank für Deine Hilfe 
|
|
|