Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Di 28.11.17 12:29 
Ein freundliches Hallo an alle,

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

Mit
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Di 28.11.17 17:09 
Schau mal hier
Vielleicht kannst du damit die Position des Dialogs anpassen sodass er auf dem 1. Bildschirm erscheint.

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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:

ausblenden 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)

ausblenden 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

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)


Zuletzt bearbeitet von Symbroson am Di 28.11.17 17:46, insgesamt 2-mal bearbeitet
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 28.11.17 17:42 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mi 29.11.17 15:44 
Hallo Symbroson,

dank Dir für Deine Antwort.

Mit
ausblenden 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
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 29.11.17 19:07 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 30.11.17 20:53 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 01.12.17 14:15 
- Nachträglich durch die Entwickler-Ecke gelöscht -