wie kann ich SaveFileRequester an Pos x,y
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: wie kann ich SaveFileRequester an Pos x,y
Dann kannst Du ja auch gleich eine x y Angabe als parameter implementieren.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

-
DarkDragon
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: wie kann ich SaveFileRequester an Pos x,y
Wieso Timeout, wenn das Ende doch bestimmt istts-soft hat geschrieben:Hast ja recht![]()
Vielleicht sollte man doch noch ein TimeOut einbauen, damit ich dann wieder recht habe
Code: Alles auswählen
EnableExplicit
Define EventID.i
Define File.s
Define Thread.i
Global Semaphore.i = CreateSemaphore()
; Gefällt mir besser für so kurzlebige Daemon-Threads als ein Delay:
Procedure Yield()
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
SwitchToThread_()
CompilerElse
pthread_yield_()
CompilerEndIf
EndProcedure
Procedure MoveRequesterThread(a)
Protected hWnd
Repeat
hWnd = FindWindow_("#32770", "Hallo die Enten")
Yield()
Until hWnd <> 0 Or TrySemaphore(Semaphore) <> 0
If hWnd <> 0
MoveWindow_(hWnd, 500, 500, 500, 500, 0)
EndIf
EndProcedure
If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
Thread = CreateThread(@MoveRequesterThread(), 0)
If Thread
File = SaveFileRequester("Hallo die Enten", "", "", 0)
SignalSemaphore(Semaphore)
WaitThread(Thread)
; sicherstellen, dass Ampel wieder auf 0
TrySemaphore(Semaphore)
EndIf
Repeat
EventID=WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
End
EndIf
ForEver
EndIfAngenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: wie kann ich SaveFileRequester an Pos x,y
Schönes Beispiel. Jetzt hab ich auch endlich die Semaphore besser verstanden 
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

-
DarkDragon
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: wie kann ich SaveFileRequester an Pos x,y
Naja, da ist es eigentlich schon etwas overkilled eine Semaphore zu nutzen. Mit einem Mutex könnte man das auch machen:ts-soft hat geschrieben:Schönes Beispiel. Jetzt hab ich auch endlich die Semaphore besser verstanden
Code: Alles auswählen
EnableExplicit
Define EventID.i
Define File.s
Define Thread.i
Global Mutex.i = CreateMutex()
; Gefällt mir besser für so kurzlebige Daemon-Threads als ein Delay:
Procedure Yield()
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
SwitchToThread_()
CompilerElse
pthread_yield_()
CompilerEndIf
EndProcedure
Procedure MoveRequesterThread(a)
Protected hWnd
Repeat
hWnd = FindWindow_("#32770", "Hallo die Enten")
Yield()
Until hWnd <> 0 Or TryLockMutex(Mutex) <> 0
UnlockMutex(Mutex)
If hWnd <> 0
MoveWindow_(hWnd, 500, 500, 500, 500, 0)
EndIf
EndProcedure
If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
LockMutex(Mutex)
Thread = CreateThread(@MoveRequesterThread(), 0)
If Thread
File = SaveFileRequester("Hallo die Enten", "", "", 0)
UnlockMutex(Mutex)
WaitThread(Thread)
Else
UnlockMutex(Mutex)
EndIf
Repeat
EventID=WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
End
EndIf
ForEver
EndIfAngenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: wie kann ich SaveFileRequester an Pos x,y
Sollte ich dann nicht besser das LockMutex() in den Thread packen?
Würde auch den einen Else Block unnötig machen.
Würde auch den einen Else Block unnötig machen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- kapege
- Beiträge: 39
- Registriert: 28.12.2004 17:35
- Computerausstattung: AMD Ryzen 7 3700X 8-Core Processor 3.60 GHz
Windows 10 Pro 64bit
14 GB Ram
PureBasic 6.00 LTS (Windows - x64) - Wohnort: Trostberg
Re: wie kann ich SaveFileRequester an Pos x,y
ich nich, verstehe nur Bahnhof.ts-soft hat geschrieben:Schönes Beispiel. Jetzt hab ich auch endlich die Semaphore besser verstanden
Dient das der Thread Sicherheit?
Gruß Peter
Re: wie kann ich SaveFileRequester an Pos x,y
Nee, die Jungs bauen gerade Türme zu Babel.kapege hat geschrieben:ich nich, verstehe nur Bahnhof.
Dient das der Thread Sicherheit?
Gruß Peter
Warum kompliziert wenn es auch ganz simpel geht?
Ohne Api, ohne Threads, ohne Gerümpel.
Code: Alles auswählen
If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
Ente.i = OpenWindow(#PB_Any,500,500,0,0,"",#PB_Window_BorderLess,WindowID(0))
Keule.s = SaveFileRequester("Hallo die Enten", "", "", 0)
CloseWindow(Ente)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIfWarum auch immer du sie wieder gelöscht hast?
Das das Requester am unteren bzw. rechten Rand zurück geschoben wird bis es komplett sichtbar ist halte ich sogar für vorteilhaft. Wer will schon Requester außerhalb des Bildschirms?
Zuletzt geändert von rolaf am 29.01.2012 16:18, insgesamt 1-mal geändert.
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Re: wie kann ich SaveFileRequester an Pos x,y
@rolaf
Sorry, dass ich mein Beitrag wieder entfernt habe. Dein Code ist zwar echt super und sogar ohne API und Thread, aber ich habe einen merkwürdigen Fehler beim Testen festgestellt.
Wenn ich folgendes tue:
1. Code ausführen
2. Das Requester-Fenster manuell mit der Maus verschieben
3. Requester und das Hauptfenster schließen.
4. Code erneut ausführen, dann nimmt er aber die selbst geänderte Position und ist nicht mehr am "Hilfsfenster", jedenfalls bei mir:

Erst wenn ich im Code die Position ändere, dann wird das Requester-Fenster wieder am "Hilfsfenster" erstellt. Ist es nur bei mir so?
Sorry, dass ich mein Beitrag wieder entfernt habe. Dein Code ist zwar echt super und sogar ohne API und Thread, aber ich habe einen merkwürdigen Fehler beim Testen festgestellt.
Wenn ich folgendes tue:
1. Code ausführen
2. Das Requester-Fenster manuell mit der Maus verschieben
3. Requester und das Hauptfenster schließen.
4. Code erneut ausführen, dann nimmt er aber die selbst geänderte Position und ist nicht mehr am "Hilfsfenster", jedenfalls bei mir:

Erst wenn ich im Code die Position ändere, dann wird das Requester-Fenster wieder am "Hilfsfenster" erstellt. Ist es nur bei mir so?
Re: wie kann ich SaveFileRequester an Pos x,y
Kann ich nicht bestätigen RSBasic (WinXP, PB 4.60).
Auch wenn ich den Requester verschiebe, ist er beim nächsten Start wieder an der im Code positionierten Stelle.
Die Idee ist ja eigendlich ganz simpel. Man erstellt ein Pseudo-Fenster an dem sich das Requester orientiert und kann dieses danach einfach wieder schließen. Diese Idee schwirte mir noch im Kopf, weil sie irgendwer hier im Forum schon mal angewandt hatte und sowas bleibt auch bei mir machmal hängen.
Auch wenn ich den Requester verschiebe, ist er beim nächsten Start wieder an der im Code positionierten Stelle.
Die Idee ist ja eigendlich ganz simpel. Man erstellt ein Pseudo-Fenster an dem sich das Requester orientiert und kann dieses danach einfach wieder schließen. Diese Idee schwirte mir noch im Kopf, weil sie irgendwer hier im Forum schon mal angewandt hatte und sowas bleibt auch bei mir machmal hängen.
Zuletzt geändert von rolaf am 29.01.2012 16:31, insgesamt 1-mal geändert.
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Re: wie kann ich SaveFileRequester an Pos x,y
@rolaf
Ich habs jetzt unter VirtualBox\WinXP ebenfalls getestet. Da tritt das Problem nicht auf, hast Recht, aber hier bei mir unter Windows 7 leider schon.
Ich habs jetzt unter VirtualBox\WinXP ebenfalls getestet. Da tritt das Problem nicht auf, hast Recht, aber hier bei mir unter Windows 7 leider schon.

