Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#25

AW: MessageDlg über den Default-Button automatisch schließen (MeinCustomDialog.Close;

  Alt 19. Aug 2016, 15:57
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

Geändert von EWeiss (19. Aug 2016 um 16:51 Uhr)
  Mit Zitat antworten Zitat