![]() |
MessageDlg in Thread aufrufen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!
Ich habe ein Problem mit "MessageDlg". Ich führe in einem Thread eine Funktion aus. Geht was schief, wird direkt in der Funktion eine Meldung mit "MessageDlg" ausgegeben. Leider ist es jetzt so, dass die Meldung nicht korrekt angezeigt wird (falsche Größe, Button fehlt usw.). Zusätzlich treten Zugriffsverletzungen auf. :wall: Rufe ich die Funktion direkt auf (nicht in einem separaten Thread), dann klappt alles. Darf ich "MessageDlg" nicht aus einem Thread aufrufen :?: Ich hoffe, dass mir jemand einen Hinweis geben kann.... Gruß, StTüff Anbei ein Bild, wie die Meldung aussieht. |
Re: MessageDlg in Thread aufrufen?
Alles was mit der GUI zu tun hat muss innerhalb von Threads über Synchronize aufgerufen werden. Du schreibst dir also am besten eine Routine, die den Fehler ausgibt, und übergibst diese an Synchronize.
|
Re: MessageDlg in Thread aufrufen?
... und versuch nicht, der Prozedur Parameter mitzugeben, z.B. so:
Delphi-Quellcode:
Das geht meines Wissens (und Erfahrung ;)) nach leider nicht. Diese Sachen müsstest du dir in dem Thread-Object merken und dann muss sich die Prozedur die benötigten Werte "rauslutschen"
Synchronize(MeineProzedur(IchBinEinParameter))
|
Re: MessageDlg in Thread aufrufen?
OK! Vielen Dank. Das beantwortet meine Frage. Ich muss also unterscheiden, ob ich die Funktion aus eine Thread aufrufe, oder eben nicht. Am besten mache ich die Funktion zur Memberfunktion der Thread-Klasse (ist diese im Moment noch nicht).
Mir scheint, ich muss das ganze Konzept noch mal überdenken. Gruß, StTüff |
Re: MessageDlg in Thread aufrufen?
Synchronize selbst ist ja eine Methode von TThread (siehe
![]() |
Re: MessageDlg in Thread aufrufen?
Ich möchte meine Lösung kurz vorstellen:
Meine Klasse sieht jetzt so aus:
Delphi-Quellcode:
Die Funktionen:
TTestThread = class(TThread)
private { Private-Deklarationen } protected Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint; DlgResult: Integer; procedure ThreadDlg(); procedure Execute; override; public function ThreadDlgExecute(const InMsg: string; InDlgType: TMsgDlgType; InButtons: TMsgDlgButtons; InHelpCtx: Longint):integer; end;
Delphi-Quellcode:
Das schöne daran ist, dass ich nur den Funktionsaufruf geringfügig ändern muss:
procedure TTestThread.ThreadDlg();
begin DlgResult:=MessageDlg(Msg, DlgType, Buttons, HelpCtx); end; function TTestThread.ThreadDlgExecute(const InMsg: string; InDlgType: TMsgDlgType; InButtons: TMsgDlgButtons; InHelpCtx: Longint):integer; begin Msg:=InMsg; DlgType:=InDlgType; Buttons:=InButtons; HelpCtx:=InHelpCtx; Synchronize(ThreadDlg); result:=DlgResult; end;
Delphi-Quellcode:
in
MessageDlg('Fehlfunktion!',mtError ,[mbOK],0);
Delphi-Quellcode:
:thumb: und :thumb: ich kann die Funktion auch von außerhalb des Threads aufrufen und es geht trotzdem.
form1.Thread.ThreadDlgExecute('Fehlfunktion!',mtError ,[mbOK],0);
Was meint Ihr :?: Kann man das so machen, oder ist das "unsauber" :?: Gruß und besten Dank schon mal für die konstruktive Kritik.... StTüff |
Re: MessageDlg in Thread aufrufen?
Zitat:
Außerhalb des Threads solltest du sie nicht aufrufen Zitat:
|
Re: MessageDlg in Thread aufrufen?
:P Danke! :P
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz