![]() |
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Erstmal ist MessageBox im Gegensatz zu ShowMessage eine Funktion und keine Prozedur.
Das MessageBox in TApplication ist nur ein Wrapper für die WinAPI Funktion MessageBox. Das bei MessageBox gewartet wird, bis der Benutzer eine Eingabe macht, resultiert wohl daraus, das erst nach dem Klicken auf eine der Schaltflächen (bei dir mbOK - was auch Standard ist und somit gar nicht übergeben werden müsste) die Funktion zum Programm zurückkehrt. Im Gegensatz dazu ist ShowMessage ein einfaches Anzeigefenster. |
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Zitat:
![]() Aber wirklich die Windows-API-Funktion verwenden und nicht die VCL-Version Application.Messagebox() Du brauchst übrigens keine Variable im Konstruktor des Threads, du kannst einfach true reinschreiben ;) |
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Zitat:
was könntest Du damit meinen? Dem Constructor übergebe ich nur den Text welcher angezeit werden soll. Aber vermutlich meinst Du etwas anderes. Gruß Kostas |
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Delphi-Quellcode:
Das da meine ich - ist aber nicht so wichtig ;)
ThreadMB := TMessageBoxThread.Create(true);
|
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Zitat:
zu übergeben. Du meinst, es währe besser eine public property zu erzeugen und nach dem Create über das property den Text zuweisen? [edit] ach jetzt sehe ich das gerade. Ich mache das eigentlich so:
Delphi-Quellcode:
und nicht so:
ThreadMB := TMessageBoxThread.Create(s);
ThreadMB.Priority := tpLower; ThreadMB.Resume; ThreadMB := TMessageBoxThread.Create(s); ThreadMB.Priority := tpLower; ThreadMB.Resume; Wie das Create umgestellt wurde ist mir ein Rätsel.
Delphi-Quellcode:
Gruß Kostas
ThreadMB := TMessageBoxThread.Create(true);
ThreadMB.Priority := tpLower; ThreadMB.Resume; ThreadMB := TMessageBoxThread.Create(true); ThreadMB.Priority := tpLower; ThreadMB.Resume; |
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Ok, hab mich vertan :oops:
Ich hatte nicht gesehen, dass du den Konstruktor überschrieben hast ... Aber wenn ich mich recht errinere, ist der Orginal-Parameter CreateSuspended - d.h. insb. dass du den Thread sofort nach dem Kontruktor startest weil du ja false übergibst - danach darfst du eigenlich keine Propertys mehr ändern, weil der Thread schon beendet sein könnte ! Da du ja sowiso am Ende ein Resume machst, kannst du also auch true übergeben. Generell solltest du dich für einen Weg entscheiden: Alles im Konstruktor mitgeben und sofort loslegen oder den Thread schlafend erstellen und dann Properties belegen ;) |
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Zitat:
Ich würde gerne dem Constructor den Text übergeben und danach kann er auch sofort losgehen. Und noch eine Kleinigkeit wenn ich darf: Den Buffer habe ich großzügig mit 500 byte angelegt. Eigentlich würde ich gerne der Buffer zur Laufzeit ermitteln und setzen. So geht es leider nicht, hast Du eine Idee? Buffer: array of char; SetLength(Buffer, Length(s));
Delphi-Quellcode:
Gruß Kostas
procedure TMessageBoxThread.Execute;
const MAX_BUFFER = 500; var Buffer: array [0..MAX_BUFFER] of char; begin StrLCopy(Buffer, PChar(text), MAX_BUFFER); windows.MessageBox(handle, Buffer, 'Fingerabdruck gefunden', MB_OK); end; |
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Das tut er doch bereits :gruebel:
Delphi-Quellcode:
Nur darfst du dann keine Properties mehr setzten nachdem du den kOnstruktor aufgerufen hast ...
constructor TMessageBoxThread.Create(msg:String);
begin inherited Create(false); text := msg; Priority := tpLower; end; Zu dem Char-Array-Pronblem: Schonmal versucht, den String einfach nach PChar zu casten? |
Re: Einfacher thread der nur ein MessageDlg anzeigt erzeugen
Zitat:
Das mit PChar war das erste was ich probiert hatte. Zu dem Zeitpunkt hat es jedoch Fehlermeldungen geregnet, allerding nicht wegen cast auf PChar wie ich soeben gemerkt habe. Auch das geht also. So gefehlt mir das. Tausend Dank Julius Du warst mir eine große Hilfe. Gruß Kostas
Delphi-Quellcode:
Aus dem Aufruf ist jetzt nur noch das übrichgeblieben. :-)
unit MessageBoxThread;
interface uses Classes, Dialogs, Forms, Sysutils, Windows; type TMessageBoxThread = class(TThread) private { Private-Deklarationen } protected text: string; procedure Execute; override; public constructor Create(msg:string); end; implementation { TMessageBoxThread } constructor TMessageBoxThread.Create(msg:String); begin inherited Create(false); text := msg; Priority := tpLower; end; procedure TMessageBoxThread.Execute; begin windows.MessageBox(handle, Pchar(text), 'Fingerabdruck gefunden!', MB_OK); end; end.
Delphi-Quellcode:
ThreadMB := TMessageBoxThread.Create(s);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 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