wie kann ich SaveFileRequester an Pos x,y

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
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

Beitrag von ts-soft »

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.
Bild
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

Beitrag von DarkDragon »

ts-soft hat geschrieben:Hast ja recht :wink:
Vielleicht sollte man doch noch ein TimeOut einbauen, damit ich dann wieder recht habe :mrgreen:
Wieso Timeout, wenn das Ende doch bestimmt ist ;-) :

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
EndIf
Angenommen 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.
Benutzeravatar
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

Beitrag von ts-soft »

Schönes Beispiel. Jetzt hab ich auch endlich die Semaphore besser verstanden :D
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.
Bild
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

Beitrag von DarkDragon »

ts-soft hat geschrieben:Schönes Beispiel. Jetzt hab ich auch endlich die Semaphore besser verstanden :D
Naja, da ist es eigentlich schon etwas overkilled eine Semaphore zu nutzen. Mit einem Mutex könnte man das auch machen:

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
EndIf
Angenommen 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.
Benutzeravatar
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

Beitrag von ts-soft »

Sollte ich dann nicht besser das LockMutex() in den Thread packen?
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.
Bild
Benutzeravatar
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

Beitrag von kapege »

ts-soft hat geschrieben:Schönes Beispiel. Jetzt hab ich auch endlich die Semaphore besser verstanden :D
ich nich, verstehe nur Bahnhof.

Dient das der Thread Sicherheit?

Gruß Peter
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: wie kann ich SaveFileRequester an Pos x,y

Beitrag von rolaf »

kapege hat geschrieben:ich nich, verstehe nur Bahnhof.

Dient das der Thread Sicherheit?

Gruß Peter
Nee, die Jungs bauen gerade Türme zu Babel. :lol:

Warum kompliziert wenn es auch ganz simpel geht?
Ohne Api, ohne Threads, ohne Gerümpel. :mrgreen:

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

EndIf
Thanks RSBasic für die kleine Korrektur (oben übernommen). :allright:
Warum 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) ::::
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: wie kann ich SaveFileRequester an Pos x,y

Beitrag von RSBasic »

@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:
Bild

Erst wenn ich im Code die Position ändere, dann wird das Requester-Fenster wieder am "Hilfsfenster" erstellt. Ist es nur bei mir so?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: wie kann ich SaveFileRequester an Pos x,y

Beitrag von rolaf »

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. :mrgreen:
Zuletzt geändert von rolaf am 29.01.2012 16:31, insgesamt 1-mal geändert.
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: wie kann ich SaveFileRequester an Pos x,y

Beitrag von RSBasic »

@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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten