Autor Beitrag
flaavia
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

WinXp Vista
D6 Ent, D2007 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 149

Win XP, Win 2000
D6 PE, D7 Prof, D8 Prof
BeitragVerfasst: So 04.01.04 16:59 
Probier folgendes mal:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

WinXp Vista
D6 Ent, D2007 Ent
BeitragVerfasst: 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
ausblenden 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 ?
:?: :?: :nixweiss:

vielen Dank im voraus
Alexander F
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 149

Win XP, Win 2000
D6 PE, D7 Prof, D8 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 149

Win XP, Win 2000
D6 PE, D7 Prof, D8 Prof
BeitragVerfasst: 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



BeitragVerfasst: 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. :roll:
flaavia Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

WinXp Vista
D6 Ent, D2007 Ent
BeitragVerfasst: 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 :D

@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 :D


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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 149

Win XP, Win 2000
D6 PE, D7 Prof, D8 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:

ausblenden 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.

ausblenden 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;
//Form-Objekt Variable für erzeugtes Dialog-Formular

procedure TfrmMain.OkButtonClick(Sender: TObject);
begin
  Dialogfenster.Close;
  //Free gibt hier Schutzverletzung -> keine Zeit für Überprüfung
  //Evtl. das mit Sender machen
end;

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  ShowMessageExt('Test',True,False);
  //Anzeigen mit Modal (StayOnTop hätte keine Auswirkungen)
end;

procedure TfrmMain.Button2Click(Sender: TObject);
begin
  Dialogfenster:=ShowMessageExt('Test',False,True);
  //Nicht modales Fenster - StayOnTop
  TButton(DialogFenster.FindComponent('OK')).OnClick:=OkButtonClick;
  //Buttonklick zuordnen
end;

procedure TfrmMain.Button3Click(Sender: TObject);
begin
  If Dialogfenster<>nil then
  //Abfrage optional
    Dialogfenster.Free;
end;


MfG,
S.J.
flaavia Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

WinXp Vista
D6 Ent, D2007 Ent
BeitragVerfasst: Fr 16.01.04 20:56 
Vielen Dank für Deine Hilfe :D