| |
| 17 Optionen für korrosionsbeständige Teile: Metalle und Nachbearbeitungen, ein Fachartikel
|
Autor
|
Thema: OpenFileDialog- Position und Größe merken (4811 mal gelesen)
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 05. Okt. 2011 13:57 <-- editieren / zitieren --> Unities abgeben:
Hallo Experten, ich bin mal wieder mit dem Standarddialog zum Öffnen und Speichern unzufrieden (OpenFileDialog, SaveFileDialog). Da diese Dialoge ja nicht nur verschiebbar, sondern auch in der Größe änderbar sind, möchte ich mir diese Eigenschaften (Größe und Position) auch merken und beim nächsten Öffnen eines solchen Dialogs wieder verwenden. Kann man diese Eigenschaften irgendwie auslesen und wieder verwenden? Eventuell auch für andere Standarddialoge? Ich hab leider dazu nix gefunden (genausowenig wie zu meiner alten Frage nach den Favoriten ) Die Alternative wäre, diesen kompletten Dialog neu zu erfinden- aber dazu habe ich nur wirklich keine Lust.
------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Ehrenmitglied V.I.P. h.c. Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2700 Registriert: 18.10.2005
|
erstellt am: 05. Okt. 2011 18:46 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
[QUOTE]Original erstellt von KMassler: Da diese Dialoge ja nicht nur verschiebbar, sondern auch in der Größe änderbar sind ---Hallo Klaus, meinst Du die .NET- Dialoge unter System.Windows.Forms ? Bei denen gibt's m.W. diese Eigenschaften nicht, oder ich steh' absolut auf dem Schlauch. Bei einer ähnlichen Fragestellung (Ist der Dialog noch offen?) hat vor einiger Zeit die Windows API geholfen. Gruß, Michael Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 06. Okt. 2011 08:01 <-- editieren / zitieren --> Unities abgeben:
|
mseufert Ehrenmitglied V.I.P. h.c. Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2700 Registriert: 18.10.2005
|
erstellt am: 06. Okt. 2011 08:41 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Hallo Klaus, eine Alternative ist das nach meinem Verständnis nicht, eher eine Erweiterung/Ergänzung des Funktionsumfangs von .NET. Es werden keine anderen Dialoge verwendet, stattdessen wird über die WIN API auf das Fenster zugegriffen. Schau' Dir mal das Beispiel an, das sollte ausführlich genug sein. Gruß, Michael Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 06. Okt. 2011 14:38 <-- editieren / zitieren --> Unities abgeben:
|
Patrick Weber Mitglied Konstruktionstechniker, Admin
Beiträge: 659 Registriert: 20.11.2006
|
erstellt am: 06. Okt. 2011 14:43 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Eine gute Lösung gibt es nicht. An den Standarddialogen kannst du nicht einfach etwas ändern. Wenn eine Eigenschaft nicht abgerufen oder gesetzt werden kann, dann ist das so. Da eigentlich die Fenstergröße und Position des Dialoges gespeichert wird (bei mir mit Win7-32 und .net4 ist das so!), ist mir nicht so recht klar, für was du die extra noch speichern willst. Auch stellt sich eine Lösung mit selbst gebautem Dialog nicht einfach dar, will man nicht alles von Grund auf neu programmieren. Ein Beispiel gibt dir da z.B. http://www.codeproject.com/KB/dialog/OpenFileDialogEx.aspx. Ist aber auch nichts für "Anfänger". Die Lösung über die Windows API ist machbar. Da es sich aber um Dialoge handelt, wirst du diese API-Calls in einen Thread auslagern müssen. Im Folgenden habe ich die Sache an einem einfachen Beispiel dargelegt. Einfach ein neues Projekt machen mit Form1, darin dann eine Textbox1, zwei Buttons (Button1, Button2) und zwei OpenFileDialog (1 und 2). Kannst ja etwas damit "rumspielen". ------------------ Grüße aus Sachsen pw Karl Marx ist tot, Einstein ist tot, und mir ist auch schon ganz schlecht! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 06. Okt. 2011 15:12 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Patrick Weber: ...Da eigentlich die Fenstergröße und Position des Dialoges gespeichert wird (bei mir mit Win7-32 und .net4 ist das so!), ist mir nicht so recht klar, für was du die extra noch speichern willst...
Naja, es wird ja nur zur Laufzeit gespeichert. Wenn das Programm beendet und neu gestartet wird, ist das wieder weg. Und da ich die Koordinaten eben nicht lesen und schreiben kann, kann ich sie auch nicht speichern und nach einem Neustart wieder verwenden. Zitat: Original erstellt von Patrick Weber: ...Auch stellt sich eine Lösung mit selbst gebautem Dialog nicht einfach dar, will man nicht alles von Grund auf neu programmieren. Ein Beispiel gibt dir da z.B. http://www.codeproject.com/KB/dialog/OpenFileDialogEx.aspx. Ist aber auch nichts für "Anfänger".Die Lösung über die Windows API ist machbar. Da es sich aber um Dialoge handelt, wirst du diese API-Calls in einen Thread auslagern müssen. Im Folgenden habe ich die Sache an einem einfachen Beispiel dargelegt. Einfach ein neues Projekt machen mit Form1, darin dann eine Textbox1, zwei Buttons (Button1, Button2) und zwei OpenFileDialog (1 und 2). Kannst ja etwas damit "rumspielen".
Cooles Beispiel ich glaube, damit kann ich etwas anfangen Ist zwar recht groß im Verhältnis zur Aufgabenstellung (mein ganzes aktuelles Programm ist bisher nicht viel größer ), aber wenn's funktioniert, werd ich das so nach und nach auch anderswo verwenden. Den Link kannte ich schon, aber ehrlich gesagt...da bin ich sehr früh wieder ausgestiegen. ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Patrick Weber Mitglied Konstruktionstechniker, Admin
Beiträge: 659 Registriert: 20.11.2006
|
erstellt am: 07. Okt. 2011 13:57 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Du könntest die Variable StoreLoadDialogRect in geeigneter Form in die Registry schreiben, eine XML oder auch in eine schlichte Textdatei in einen temporären Ordner. Beim nächsten Programmstart holst du die dir dann wieder. ------------------ Grüße aus Sachsen pw Karl Marx ist tot, Einstein ist tot, und mir ist auch schon ganz schlecht! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Ehrenmitglied V.I.P. h.c. Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2700 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 07. Okt. 2011 14:28 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Hallo zusammen, zwei alternative, evtl. einfachere Ideen fallen mir noch ein: Anstatt des Threads einen Timer verwenden (nicht getestet) Die ausgelesenen Werte in den Settings ablegen. Gruß, Michael Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Patrick Weber Mitglied Konstruktionstechniker, Admin
Beiträge: 659 Registriert: 20.11.2006
|
erstellt am: 07. Okt. 2011 18:37 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Die while-Schleifen zusammen mit den Threading.Thread.Sleep()-Anweisungen blockieren den Hauptthread, damit scheidet ein Timer aus mit dem bestehenden Code aus. ------------------ Grüße aus Sachsen pw Karl Marx ist tot, Einstein ist tot, und mir ist auch schon ganz schlecht! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 10. Okt. 2011 08:10 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Patrick Weber: Du könntest die Variable StoreLoadDialogRect in geeigneter Form in die Registry schreiben, eine XML oder auch in eine schlichte Textdatei in einen temporären Ordner. Beim nächsten Programmstart holst du die dir dann wieder.
Hallo Patrick, das habe ich inzwischen schon verstanden Ich habs schon eingebaut, umgebaut und für meinen Zweck gesundgeschrumpft :) Das funktioniert prima und ich bin happy damit, herzlichen Dank!! Zitat: Original erstellt von mseufert: ...Die ausgelesenen Werte in den Settings ablegen...
Hi Michael, das war genau der Sinn der Sache Also, meine Frage zum Thema Koordinaten von Dialogen auslesen bzw. wiederverwenden ist damit beantwortet. Auch wenn ich mir das als wiederverwendbare Eigenschaften der entsprechenden Dialoge gewünscht hätte. Genauso wie den Direktzugriff auf die Favoriten. Und und und ... Hätte ich die Dialoge entwickelt, dann wäre alles viel besser ... ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim [Diese Nachricht wurde von KMassler am 10. Okt. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Ehrenmitglied V.I.P. h.c. Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2700 Registriert: 18.10.2005
|
erstellt am: 10. Okt. 2011 10:45 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Hallo zusammen, habt ihr es geschafft, daß der Dialog nach einem erneuten Start des Programms sofort mit der gewünschten Position/Größe erscheint ? Da hab' ich noch ein kleines Schönheitsproblem: Der Dialog wird kurz mit Default- Position und Größe angezeigt und erst dann auf die gespeicherte Position/Größe gebracht. Auf vbfun gibt's ein Beispiel zum Positionieren einer MessageBox, allerdings in VB5. Das Beispiel gibt die Position vor, anstatt den offenen Dialog zu ändern. Es verwendet SetWindowsHookEx, funktioniert nach der Konvertierung nach .NET leider nicht mehr. Gruß, Michael [Diese Nachricht wurde von mseufert am 10. Okt. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 10. Okt. 2011 11:15 <-- editieren / zitieren --> Unities abgeben:
Hallo Michael, der Dialog wird tatsächlich erst in Original-Größe an den Original-Koordinaten geöffnet und anschließend verschoben und vergrößert/verkleinert. Aber das passiert so schnell- und nur beim 1. Mal zur Programmlaufzeit, dass es niemand mitbekommt. Für mich völlig ausreichend. [Edit]Habe dein Beispiel kurz getestet:
- Es funktioniert bei mir (vb.net 2010 Express)
- Es läuft im Prinzip ab wie der Vorschlag von Patrick- nur eben mit Timer.
- Auch hier wird der Dialog erst auf Standardposition und mit Standardgröße gesetzt und erst anschließend verschoben- aber sichtbar langsamer- das mag aber an den timer-Werten liegen.
[/Edit] ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim [Diese Nachricht wurde von KMassler am 10. Okt. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Patrick Weber Mitglied Konstruktionstechniker, Admin
Beiträge: 659 Registriert: 20.11.2006
|
erstellt am: 10. Okt. 2011 12:40 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Sofort geht nicht, da erst das Fenster gezeichnet werden muss, um die Position auszulesen. Im ersten Block kann man die Threading.Thread.Sleep(100) verkleinern und gleichzeitig die Anzahl der Iterationen vergrößern, um die Reaktionszeit zu verkürzen. Dabei sollte man aber bei schwachen Rechnern die CPU-Auslastung im Auge behalten. 100*100ms = ca. 10s Timeout:
Code: While hWnd.Equals(IntPtr.Zero) And i < 100 Try Threading.Thread.Sleep(100) ...
200*50ms = ca. 10s Timeout:
Code: While hWnd.Equals(IntPtr.Zero) And i < 200 Try Threading.Thread.Sleep(50) ...
usw. nach Bedarf.------------------ Grüße aus Sachsen pw Karl Marx ist tot, Einstein ist tot, und mir ist auch schon ganz schlecht! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 10. Okt. 2011 12:48 <-- editieren / zitieren --> Unities abgeben:
|
mseufert Ehrenmitglied V.I.P. h.c. Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2700 Registriert: 18.10.2005
|
erstellt am: 10. Okt. 2011 13:38 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Zitat: Original erstellt von Patrick Weber: Sofort geht nicht, da erst das Fenster gezeichnet werden muss, um die Position auszulesen.
Hallo Klaus, hallo Patrick, ohne Kenntniss des o.g. Beispiels würde ich sofort zustimmen. Es muss ja erst das WindowHandle ermittelt werden, um das Fenster darüber anzusprechen. Soweit o.k. In dem Beipiel wird nun, soweit ich das verstanden hab', eine Windows Message mit SetWindowsHookEx abgefangen und modifiziert. Ergebnis: Die Messagebox erscheint sofort mit gewünschter Größe und Position. Ist mir allerdings (noch) unklar, wie das im Detail funktioniert. Das ist die letzte verbliebene Nuss, die noch geknackt werden will. Und wenn's mit VB5 und einer Messagebox geht, warum dann nicht mit .NET und einem FileDialog ? Gruß, Michael
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RSchulz Ehrenmitglied V.I.P. h.c. Head of CAD, Content & Collaboration / IT-Manager
Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 10. Okt. 2011 14:23 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Zitat: Original erstellt von mseufert: Ist mir allerdings (noch) unklar, wie das im Detail funktioniert.Das ist die letzte verbliebene Nuss, die noch geknackt werden will. Und wenn's mit VB5 und einer Messagebox geht, warum dann nicht mit .NET und einem FileDialog ?
Hallo Michael, fakt ist, dass es mit der Standard MSGBOX nicht geht bzw. diese die nötigen Einstellungen nicht mitbringt. Wie heist es so schön "Nicht alles was neu ist, ist auch besser. Aber alles was besser ist, ist neu." ... Für dich als Erklärung.... Du musst auf das Fenster warten. Das kannst du nur mit einem sleep-Befehl. Dieser legt aber den gesamten Thread schlafen und damit eben auch die msgbox. Also musst du den sleep-Befehl in eine Schleife packen und am Besten mit einem DoEvents-Befehl den anderen Programmen die Möglichkeit zur Berechnung geben. Sobald dieses dann aufgebaut ist, kannst du es eben verändern. Richtig programmiert fällt dieser "Umweg" dem Anwender garnicht auf und es gibt auch keine erkennbare Verzögerung. Jedes Fenster hat einen Handler oder Kenner wie auch immer Dieser Kenner ist allerdings immer ein anderer, da Windows eben irgend einen freien zur Verfügung stellt. Also musst du mit z.B. der Caption das Fenster fangen und kannst dann den Handler auslesen/übergeben. Das was du vorhast, würde ich in einen Timer stecken, den man vor dem Aufruf der MSGBOX oder anderer Fenster aktiviert und der wartet, bis das Fenster offen ist. Sobald das oder ein gewünschtes Fenster offen ist, muss man mit dem HOOK und dem Handler das Fenster fangen und kann es positionieren und in seiner Größe ändern. Danach würde ich dann noch innerhalb des Timers den Timer beenden. Allerdings musst du hierfür eine If-Abfrage definieren, da es sich ansonsten direkt nach dem Ersten mal beendet.
------------------ MFG Rick Schulz Nettiquette (CAD.de) - Was ist die Systeminfo? - Wie man Fragen richtig stellt. - Unities Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |