Seite 2 von 3

Re: wie kann ich SaveFileRequester an Pos x,y

Verfasst: 29.01.2012 13:19
von ts-soft
Dann kannst Du ja auch gleich eine x y Angabe als parameter implementieren.

Re: wie kann ich SaveFileRequester an Pos x,y

Verfasst: 29.01.2012 13:31
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

Re: wie kann ich SaveFileRequester an Pos x,y

Verfasst: 29.01.2012 13:55
von ts-soft
Schönes Beispiel. Jetzt hab ich auch endlich die Semaphore besser verstanden :D

Re: wie kann ich SaveFileRequester an Pos x,y

Verfasst: 29.01.2012 14:30
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

Re: wie kann ich SaveFileRequester an Pos x,y

Verfasst: 29.01.2012 15:09
von ts-soft
Sollte ich dann nicht besser das LockMutex() in den Thread packen?
Würde auch den einen Else Block unnötig machen.

Re: wie kann ich SaveFileRequester an Pos x,y

Verfasst: 29.01.2012 15:43
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

Re: wie kann ich SaveFileRequester an Pos x,y

Verfasst: 29.01.2012 15:56
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?

Re: wie kann ich SaveFileRequester an Pos x,y

Verfasst: 29.01.2012 16:17
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?

Re: wie kann ich SaveFileRequester an Pos x,y

Verfasst: 29.01.2012 16:22
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:

Re: wie kann ich SaveFileRequester an Pos x,y

Verfasst: 29.01.2012 16:27
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.