Dialoge auf Desktop

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 623
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal
Kontaktdaten:

Dialoge auf Desktop

Beitrag von Muecke »

Hallo,

ich hab

Code: Alles auswählen

SetTimerEvent(30000, {|| zeitVomPlan() } ) 
verwendet um Termine einzublenden. Jetzt kann es sein, dass die gleichen Dialoge 4,5,6 mal aufgehen.
Mein Problem ist , dass ich nur der lezte Dialog schliessen kann.
Gibt es eine Function, wie ich alle Dialoge auf dem Desktop abfragen kann.

Gruss Thomas
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1931
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hallo Thomas,

möchtest du an der Stelle das komplette Programm schliessen? dann geht das mit Quit. Oder du mußt die Dialoge an die Funtkionen mit übergeben.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 623
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal
Kontaktdaten:

Beitrag von Muecke »

Wie soll ich das verstehen.
Ich gebe jeden geöffneten Dialog an den neu zu öffneten Dialog weiter? Und dann?

Gruss Thomas
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14659
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Thomas,

für mich hört sich das so an, als ob jeder neue Dialog ein Child des vorigen ist. Und das ganze modal. Denn dann kannst Du auf die Parents nicht mehr zugreifen, bis das Child geschlossen ist.

Jan
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 623
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal
Kontaktdaten:

Beitrag von Muecke »

Jan,
Wie kann ich dies umgehen.Könnte es gehen, wenn ich für jeden Dialog ein Thread starte?

Gruss Thomas
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14659
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Thomas,

man muß das nicht immer so kompliziert machen wie ich das in dem hier allseits immer wieder gerne diskutierten Fall machen 8)

Was möchtest Du denn erreichen? Oder wie funktioniert das im Moment? So spontan, ohne Codebeispiel von Dir, würde ich sagen: Mach das ganze Nichtmodal. Also kein oDialog:showModal() oder oDlg:setModalState(XBP_DISP_APPMODAL) oder so ähnliche Sachen.

Kann aber auch andere Ursachen haben. Kannst Du den Dialogaufruf unde den Dialog mal posten?

Jan
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 623
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal
Kontaktdaten:

Beitrag von Muecke »

Hallo Jan,

Irgend was mache ich falsch mit

Code: Alles auswählen

SetTimerEvent
Wenn ich die Dialoge ohne

Code: Alles auswählen

SetTimerEvent
öffne, hab ich kein Problem.
Wie soll oder wan kann ich den Thread schliessen.

Code: Alles auswählen


SetTimerEvent(1000, {|| { zeitVomPlan(oBesKu) } )



************************************
***  Erinnerungszeit von Plan   ****
************************************
FUNCTION zeitVomPlan(oBesKu )

  
  &oBesKu->( dbGoTop() )
  DO WHILE !oBesKu->( eof() )
           IF date() >= oBesKu->von
               ...............
               ...............

               oDialog:=ErTermin():New(,,,,,,aDatErin):create():run()
                    
               inkey(4)   // Zeit lassen für Aufbau der Dialoge

    oBesKu->( dbSkip() )
  ENDDO
    
RETURN .T.
Gruss Thomas
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

entweder durch einen Druck auf einen Close Button oder sowas in dem geöffneten Fenster dieses Threads, oder indem du eine Statusvariable einbaust, auf die du von außen Zugriff hast.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12911
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
Muecke hat geschrieben:

Code: Alles auswählen

SetTimerEvent(1000, {|| { zeitVomPlan(oBesKu) } )
************************************
***  Erinnerungszeit von Plan   ****
************************************
FUNCTION zeitVomPlan(oBesKu )
  &oBesKu->( dbGoTop() )
  DO WHILE !oBesKu->( eof() )
           IF date() >= oBesKu->von
               ...............
               ...............

               oDialog:=ErTermin():New(,,,,,,aDatErin):create():run()
             
               inkey(4)   // Zeit lassen für Aufbau der Dialoge
    oBesKu->( dbSkip() )
  ENDDO
 
RETURN .T.
d.) ein INKEY(4) hat nichts in einer GUI Anwendung zu suchen.
hier nimmt man ein(e) AppEvent (Schleife).

c.) ErTermin() wird ohne Parent erstelllt, somit findest du es nicht unter
Desktop. Vielmehr wird "das letzte" SetAppFocus() verwandt sodas du
auch nur das schliessen kannst.

b.) es ist die Frage ob man wirklich SetTimerEvent() so einsetzten sollte.

SetTimerEvent(nTime) startet nach fester nTime den Thread nochmal
unabhängig davon ob was notwendig ist oder nicht. Willst du aber ständig
etwas "überprüfen" so solltest dann keine Code ausführen sondern nur
einen Event generieren damit du weiterhin "überprüfen" kannst. Der
Event wiederum veranlasst dein Programm die Anzeige auszulösen und
entsprechende Aktionen (Procedure/Function) durchzuführen.

a.) du überprüfst nicht ob die Anzeige Procedure gerade läuft.
verwende dafür eine STATIC isRun := .T. / .F. damit du bei einem
2st. Aufruf überprüfen kannst und somit nicht mehrfach ausgeführt wird.

Im Grunde bräuchtest du also ein "überprüfungs" Thread und für jedes
"Fenster" eine eigenen Thread mit einem AppEvent()

gruss by OHR
Jimmy
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1931
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hallo Thomas,

wenn ich einen Dialog an eine Funktion weitergebe, so mache ich erst ein
oParent:disable(). Dann gibt es in der 2.ten maske 2 buttons mit zurück
und speichern.

bei beiden buttons muß ich ja zurück auf die erste Maske. also:

oParent:enable()
oDlg:destroy()
SetAppFocus(oParent)
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

AUGE_OHR hat geschrieben:d.) ein INKEY(4) hat nichts in einer GUI Anwendung zu suchen.
hier nimmt man ein(e) AppEvent (Schleife).
In diesem Fall sollte der INKEY(4) nur eine Zeitverzögerung bewirken,
da wäre SLEEP(400) angesagt. (Die Zeitangabe sind 400/100 Sekunden.)
Gruß
Hubert
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 623
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal
Kontaktdaten:

Beitrag von Muecke »

Hi,

Ich möchte mich für Eure Hilfe noch bedanken.

Die Function zeitVomPlan kontr. ich in einer Eventschlaufe. Funct jetzt recht gut.

Auch das mit dem inkey und sleep hab ich nochmals angeschaut.
Wenn soll man aber mit sleep und mit inkey arbeiten? Gibt es da eine Regel?

Gruss Thomas :roll:
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

SLEEP() stoppt ohne auf eine Eingabe zu reagieren, wenn dein Programm eh nix zu tun hat oder auf den Refresh des Dateisystems wartet, kann z.B. ein 1/10 Sekunden Sleep für den Anwender keine Nachteile haben, der Rechner erledigt aber dabei viele viele Aufgaben.

inkey() verwendet man NUR noch in CRT oder VIO Fenstern, wenn man möchte dass ein Tastendruck den Wartezustand beendet.

GUI Programme machen das in der Eventschleife !

Ein Beispiel für SLEEP ...

Code: Alles auswählen

do while .t.
     if LEnde
        exit
     endif
enddo
So mancher denkt, toll der Rechner hat nix zu tun ... tatsächlich ist diese Schleife DER Performancekiller, denn der Prozess rennt in einer Endlosschleife und verbraucht bei jedem Vergleich Rechenzeit.

Code: Alles auswählen

do while .t.
     if LEnde
        exit
     endif
     sleep(10)
enddo
hier wird die Schleife in jeder Sekunde nur 10 Mal durchlaufen.
Der Rechner vergeudet keine Zeit für diesen Thread, und hat Zeit für andere. Immer auch beachten, die GUI Anzeige ist ein eigener Thread. Wenn ein Monsterprogramm den Rechner beschäftigt, kann es passieren dass der Bildschirm nicht mehr korrekt aufbaut bis zur nächsten Wartezeit. Sleep(10) wirkt hier Wunder.
Gruß
Hubert
Antworten