Autor |
Beitrag |
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: 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
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
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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'); end;
procedure TForm1.OpenDialog1Show(Sender: TObject); begin Memo1.Lines.Add('OnShow'); Timer1.Enabled := true; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enabled := false; MoveWindow(GetParent(OpenDialog1.Handle), 60, 80, 500, 400, True); 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'); end;
procedure TForm1.OpenDialog1Show(Sender: TObject); begin Memo1.Lines.Add('OnShow');
if Timer1.Enabled then begin SetWindowPos(GetParent(OpenDialog1.Handle), HWND_TOPMOST, 100, 500, 0, 0, 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
|
Verfasst: Di 28.11.17 17:42
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: 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
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 29.11.17 19:07
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: 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
|
Verfasst: Do 30.11.17 20:53
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Fr 01.12.17 13:12
Hallo Frühlingsrolle,
Vielleicht solltest Du noch einmal nachlesen um was es geht! (Siehe oben)
Frühlingsrolle hat folgendes geschrieben : | 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
|
Verfasst: Fr 01.12.17 14:15
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|