Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TOpenDialog


Peter18 - Di 28.11.17 12:29
Titel: TOpenDialog
Ein freundliches Hallo an alle,

in einem kleinen Anzeigeprogramm, das mir bestimmte Datenformate anzeigt, verwende ich "TOpenDialog" um eine Datei auszuwählen.

Mit

Delphi-Quelltext
1:
if OpenDialog1.Execute then                    

öffne ich das Fenster. Es erscheint auf dem 2. Bildschirm. Wenn ich es auf den 1. Bildschirm ziehe, erscheint es bei erneutem Aufruf wieder auf dem 2..

Kann ich das irgendwie beeinflussen?

Grüße von der momentan sonnigen Nordsee

Peter


Symbroson - Di 28.11.17 17:09

Schau mal hier [http://www.delphipraxis.net/54866-topendialog-positionieren.html]
Vielleicht kannst du damit die Position des Dialogs anpassen sodass er auf dem 1. Bildschirm erscheint.


Symbroson - Di 28.11.17 17:38

Ich hab das jetzt einfach mal ausprobiert und habe festgestellt, dass ich den Dialog nur durch nen Timer verzögert verschieben/skalieren kann. Das ist mein Ergebnis:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Add('Loading');
  if OpenDialog1.Execute then Memo1.Lines.Add('Loaded');    //never called so unnessecary?
end;

procedure TForm1.OpenDialog1Show(Sender: TObject);
begin
  Memo1.Lines.Add('OnShow');
  Timer1.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;
    //x, y, w, h
  MoveWindow(GetParent(OpenDialog1.Handle), 6080500400, True);
    //x, y
  //SetWindowPos(GetParent(OpenDialog1.Handle), HWND_TOPMOST, 100, 500, 0, 0, SWP_NOSIZE);
end;

das kann man zusammenfassen - mag dir gefallen oder nicht - wie du willst: (Setzt voraus dass der Timer-Callback auf OpenDialog1Show gesetzt wird)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Add('Loading');
  if OpenDialog1.Execute then Memo1.Lines.Add('Loaded');    //never called so unnessecary?
end;

procedure TForm1.OpenDialog1Show(Sender: TObject);
begin
  Memo1.Lines.Add('OnShow');

  if Timer1.Enabled then begin
      //x, y, w, h
    //MoveWindow(GetParent(OpenDialog1.Handle), 60, 80, 500, 400, True);
      //x, y
    SetWindowPos(GetParent(OpenDialog1.Handle), HWND_TOPMOST, 10050000, SWP_NOSIZE);
  end;
  Timer1.Enabled := not Timer1.Enabled;
end;


die eine auskommentierte Codezeile ist eine Alternative - probier mit beiden bisschen rum und schau was am besten Funktioniert ;)
hoffe das hilft etwas weiter - probier es auch mal ohne den Timer - vielleicht geht das bei dir ja

edit: die Memologs sind nur Debug - die kannst du auch weglassen


Delete - Di 28.11.17 17:42

- Nachträglich durch die Entwickler-Ecke gelöscht -


Peter18 - Mi 29.11.17 15:44

Hallo Symbroson,

dank Dir für Deine Antwort.

Mit

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.OpenDialog1Show(Sender: TObject);
begin
  SetWindowPos(GetParent(OpenDialog1.Handle), HWND_TOPMOST,100,100,0,0,SWP_NOSIZE);
  Abort;
end;

funktioniert es. Läst man "Abort" weg, funktioniert es nicht mehr. Die Positionierung findet anscheinend nach dem Aufruf von "OnShow" statt. "Abort" ist natürlich unschön, die Lösung mit dem Timer dagegen eleganter.

Grüße von der Wolkigen Nordsee

Peter


Delete - Mi 29.11.17 19:07

- Nachträglich durch die Entwickler-Ecke gelöscht -


Peter18 - Do 30.11.17 19:03

Hallo Frühlingsrolle,

Anweisungen wie "Abort" und "Exit" springen aus einem Ablauf heraus. Wenn man hier nicht sehr sorgfältig ist und alle Eventualitäten berücksichtigt, kommt es leicht zu Fehlern, die selten auftreten und daher schwer zu finden sind.

Statt "Exit" bevorzuge ich entsprechende Dinge in der Schleifenbedingung zu regeln. Bei "Abort" wird der Prozess abgebrochen. In diesem Fall weiß ich nicht einmal, was nach OnShow noch alles abläuft (keine Quelle). Daher ist die Lösung mit dem Timer eleganter, weil hier alles abgearbeitet wird und durch den Timer ein Ablauf nur unterbrochen wird. So kann es keine (oder nur selten) unschönen Überraschungen geben.

Grüße von der Nordsee

Peter


Delete - Do 30.11.17 20:53

- Nachträglich durch die Entwickler-Ecke gelöscht -


Peter18 - Fr 01.12.17 13:12

Hallo Frühlingsrolle,

Vielleicht solltest Du noch einmal nachlesen um was es geht! (Siehe oben)

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Ich weiss ehrlich gesagt nicht, warum an dieser Stelle überhaupt Abort() aufgerufen wird. ]Ich weiss ehrlich gesagt nicht, warum an dieser Stelle überhaupt Abort() aufgerufen wird.

Unter dem Link von Symbroson wird eine Lösung beschrieben, die nur mit Abort funktioniert. Symbroson hat dann noch eine Lösung mit Timer angeboten.

Wenn Du eine weitere, bessere Lösung anbieten kannst, gerne!

Wie bereits bemerkt, ich habe nicht den Quelltext, kann also auch nicht nachvollziehen, was in "TOpenDialog" alles geschieht und welche Nachrichten ausgetauscht werden! Daher auch meine Frage!

Grüße von der Nordsee

Peter


Delete - Fr 01.12.17 14:15

- Nachträglich durch die Entwickler-Ecke gelöscht -