Announcement

Collapse
No announcement yet.

kann ich die erscheinungsposition von einem opendialog verändern?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • kann ich die erscheinungsposition von einem opendialog verändern?

    in meinem visitenkartenprogramm gibt es einen opendialog der schön in der mitte des bildschirms kommt. ich hätte ihn aber gerne mehr rechts.
    kann ich die position beeinflußen???

    mfg

    markus
    Herzliche Grüße

    Markus Lemcke
    barrierefreies Webdesign

  • #2
    Hallo,

    in der VCL wird die Funktion <b>MessageDlgPos</b> bereitgestellt, mit deren Hilfe die Position des eigenen Dialogformulars definiert werden kann. Falls der Standard-Dialog "Datei öffnen" von Win32 verwendet werden soll, gibt es zur Positionierung die Möglichkeit, über den Aufruf von <b>SetWindowPos</b> die Position nachträglich zu ändern. Dazu muss über <b>FindWindow</b> das Fensterhandle dieses Dialogs gesucht werden

    Comment


    • #3
      herr kosch,

      setwindowspos wäre wohl richtig, aber wie sage ich es meinem kinde!!!
      einen opendialog ruft man ja auf mit

      if opendialog1.execute then....

      und wie füge ich jetzt da die positionierung ein???

      mfg

      marku
      Herzliche Grüße

      Markus Lemcke
      barrierefreies Webdesign

      Comment


      • #4
        Hallo Markus,

        falls der Standard-Dialog "Datei öffnen" von Win32 verwendet werden soll, gibt es zur Positionierung die Möglichkeit, über den Aufruf von SetWindowPos die Position nachträglich zu ändern. Dazu muss über FindWindow das Fensterhandle dieses Dialogs gesucht werden. Das Problem dabei ist nur, das die OpenDialog-Methode <b>Execute</b> einen <b>modalen</b> Dialog aufruft. Somit muss das eigene Programm die Positionierung in einen separaten Thread auslagern:

        Aufruf im Programm:
        <pre>
        uses OpenDlgPos_Thread;

        procedure TForm1.Button1Click(Sender: TObject);
        begin
        with OpenDlgPosThrd.Create(False) do
        FreeOnTerminate := True;
        if OpenDialog1.Execute then
        StatusBar1.SimpleText := OpenDialog1.FileName;
        end;
        </pre>

        Implementierung des Threads:
        <pre>
        unit OpenDlgPos_Thread;

        interface

        uses
        Classes;

        type
        OpenDlgPosThrd = class(TThread)
        private
        { Private-Deklarationen }
        protected
        procedure Execute; override;
        end;

        implementation

        { OpenDlgPosThrd }

        uses Windows;

        procedure OpenDlgPosThrd.Execute;
        var
        bFound : Boolean;
        hDlg : HWND;
        begin
        { Thread-Code hier plazieren }
        bFound := False;
        while not bFound do
        begin
        hDlg := FindWindow(nil, 'Öffnen');
        if hDlg <> 0 then
        begin
        SetWindowPos(hDlg, 0, 10, 10, 0, 0,
        SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOZORDER);
        bFound := True;
        MessageBeep($FFFFFFFF);
        end;
        Sleep(50);
        end;
        end;

        end.
        </pre>

        Zur Kontrolle gibt der Thread eine MessageBeep aus, um sein eigenes Ende akustisch bekanntzumachen. Der Aufruf von <b>Sleep</b> sorgt dafür, das der zweite Thread nicht unnötig Rechenzeit verbrät.

        P.S: Man kann natürlich auch einen Nachfahren von TOpenDialog ableiten, der die Positionierung über Eigenschaften unterstützt. Allerdings ist dann der Implementierungsaufwand höher.

        Comment

        Working...
        X