So wie mir bekannt ist hat ein Dialog seine eigene Message Queue.
nJAin
VCL-Dialoge haben standardmäßig niemals eine eigene Message-Queue, schon alleine deswegen, da die
VCL nicht thread-save ist.
Da läuft alles im Hauptthread und in dessen Queue.
Das scheint mir aber die (beste) einfachste Lösung..
Example:
Delphi-Quellcode:
function TSkinBrowseForFolder.ShowBrowseFolderDialog: TBrowseFolderDialogConstant;
var
Msg: TMsg;
begin
MoveWindow(
Handle, x, y, rc.Right + 1, rc.Bottom + 1, True);
SkinEngine.ShowMainWindow(
Handle, 0);
EnableWindow(HParent, False);
// Windows Messagen verarbeiten
while GetMessage(Msg, 0, 0, 0)
do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
EnableWindow(HParent, true);
Result := DlgConstant;
end;
Wird dann einfach so aufgerufen..
Ausschnitt..
Delphi-Quellcode:
IDM_AddFolder:
begin
if not Assigned(BrowseForFolder) then
AddBrowseForFolderControls(MainHandle);
BrowseFolderDialogConstant := BrowseForFolder.ShowBrowseFolderDialog;
if not (BrowseFolderDialogConstant = bffdcCancel) then
begin
dir := BrowseForFolder.OutPutDir;
Der Dialog beendet sich dann selbst nach einem Click als Beispiel auf "Cancel"
Delphi-Quellcode:
ID_BTN_CANCEL:
begin
SkinEngine.SetCTLText(edInput.Handle, '');
BrowseForFolder.DlgConstant := bffdcCancel;
SendMessage(WinHandle, WM_DESTROY, 0, 0);
DriveList.DestroyWindow;
DriveList := nil;
BroForFolderHandle := 0;
end;
Ok hat jetzt weniger mit seinem Problem zu tun..
Daher bin ich raus
gruss