Seite 1 von 1

Gadgets verschwinden

Verfasst: 18.05.2005 19:34
von Peter aus der Nordheide
Hallo zusammen,

ich habe ein kleines? Problemchen. Ich habe das als Kommentar ins Listing geschrieben :


Code: Alles auswählen


; Permutationen k aus n,  mit k = 2 bis 6    und    n = 8 bis 12

If OpenWindow(0,100,100,1000,400,#PB_Window_Systemmenu|#PB_Window_screencentered|#PB_Window_SizeGadget,"Vollsysteme Peters Versuch 0.01") 
EndIf 

If CreateGadgetList(WindowID()) ; ermittelt die eindeutige WindowID 
                                ; und erstelltauf diesem Fenster 
                                ; die neue Gadgetliste


OptionGadget(2, 30, 100, 80, 20, "  k = 2  ")
OptionGadget(3, 30, 140, 80, 20, "  k = 3  ")
OptionGadget(4, 30, 180, 80, 20, "  k = 4  ")
OptionGadget(5, 30, 220, 80, 20, "  k = 5  ")
OptionGadget(6, 30, 260, 80, 20, "  k = 6  ")

Frame3DGadget(7, 20, 80, 95, 210, " k - Wert ", 0)

OptionGadget(8, 135, 120, 80, 20, "  n =  8  ")
OptionGadget(9, 135, 140, 80, 20, "  n =  9  ")
OptionGadget(10, 135, 160, 80, 20, "  n = 10  ")
OptionGadget(11, 135, 180, 80, 20, "  n = 11  ")
OptionGadget(12, 135, 200, 80, 20, "  n = 12  ")

Frame3DGadget(13, 125, 80, 415, 210, " n - Wert ", 0)

SpinGadget(0, 550, 85, 40, 30, 2, 6)
SetGadgetState (0,2)  
    

ListIconGadget(1, 600, 85, 400, 200, "# = i", 42 ,#PB_ListIcon_GridLines|#PB_ListIcon_AlwaysShowSelection )


;Goto Ende
;
;Wenn ich von hier ans Ende springe, werden die Gadgets korrekt dargestellt.
;
;Laufe ich weiter durch die Permutation, erscheint nur das Hauptfenster. 
;
;Und vom ListIconGadget lediglich das rechte Scrollband. 
;
;Am Ende der Hauptroutine erscheinen dann alle Gadgets im Hauptfenster, 
;einschließlich der Daten im ListIconGadget. 
;Eigentlich sollte es so während der Abarbeitung der Hauptroutine aussehen, 
;inkl. der "Auffüllung" des ListIconGadget

;
;
; Hinweis : Hier werden später einmal die OptionGadgets abgefragt
;
;
Minzahl = 1
Hoechstzahl = 20
K = 5

If K = 6 : Goto 6_aus_n : Else:
If K = 5 : Goto 5_aus_n : Else:
If K = 4 : Goto 4_aus_n : Else:
If K = 3 : Goto 3_aus_n : Else:
If K = 2 : Goto 2_aus_n : Else: Goto Ende


6_aus_n :
4_aus_n :
3_aus_n :
2_aus_n :
;
;
;

5_aus_n :

AddGadgetColumn(1,1,"Zahl 1",42)      ;AddGadgetColumn(#Gadget, Position, Titel$, Breite)
AddGadgetColumn(1,2,"Zahl 2",42)    
AddGadgetColumn(1,3,"Zahl 3",42)
AddGadgetColumn(1,4,"Zahl 4",42)
AddGadgetColumn(1,5,"Zahl 5",42)

ActivateGadget(7)

For Zahl1= Minzahl To Hoechstzahl - 4 
For Zahl2=Zahl1+1 To Hoechstzahl - 3 
For Zahl3=Zahl2+1 To Hoechstzahl - 2 
For Zahl4=Zahl3+1 To Hoechstzahl - 1
For Zahl5=Zahl4+1 To Hoechstzahl



i = i + 1 : AddGadgetItem(1,-1,Str(i) +Chr(10)+ Str(Zahl1) +Chr(10)+ Str(Zahl2) +Chr(10)+ Str(Zahl3) +Chr(10)+ Str(Zahl4) +Chr(10)+ Str(Zahl5))

          ; ActivateGadget(1) ; wird der scharf gemacht, sieht es noch blöder aus.

Next 
Next 
Next 
Next 
Next 


EndIf
EndIf
EndIf
EndIf
EndIf
EndIf


Repeat

Ende :
  EventId.l = WaitWindowEvent()
    If EventID = #PB_Event_closeWindow
      Ende = 1
    EndIf

Until Ende = 1

End
Für Eure Nachsicht und Hilfe meinen herzlichsten Dank

Gruß Peter

Verfasst: 18.05.2005 19:48
von ts-soft
Füge mal ein paar:

Code: Alles auswählen

While WindowEvent() : Wend
in Deinen Code ein, vor allem in der innersten For:Next schleife, dann werden auch wieder Windows-Nachrichten verarbeitet.

Verfasst: 18.05.2005 20:03
von DarkDragon
Hmm?!?

Code: Alles auswählen

Repeat

Ende :
  EventId.l = WaitWindowEvent()
    If EventID = #PB_Event_closeWindow
      Ende = 1
    EndIf

Until Ende = 1 
Ende ist also eine Variable UND eine Sprungmarkierung.
So gehts:

Code: Alles auswählen


; Permutationen k aus n,  mit k = 2 bis 6    und    n = 8 bis 12

If OpenWindow(0,100,100,1000,400,#PB_Window_Invisible|#PB_Window_Systemmenu|#PB_Window_screencentered|#PB_Window_SizeGadget,"Vollsysteme Peters Versuch 0.01")
EndIf

If CreateGadgetList(WindowID()) ; ermittelt die eindeutige WindowID
                                ; und erstelltauf diesem Fenster
                                ; die neue Gadgetliste


OptionGadget(2, 30, 100, 80, 20, "  k = 2  ")
OptionGadget(3, 30, 140, 80, 20, "  k = 3  ")
OptionGadget(4, 30, 180, 80, 20, "  k = 4  ")
OptionGadget(5, 30, 220, 80, 20, "  k = 5  ")
OptionGadget(6, 30, 260, 80, 20, "  k = 6  ")

Frame3DGadget(7, 20, 80, 95, 210, " k - Wert ", 0)

OptionGadget(8, 135, 120, 80, 20, "  n =  8  ")
OptionGadget(9, 135, 140, 80, 20, "  n =  9  ")
OptionGadget(10, 135, 160, 80, 20, "  n = 10  ")
OptionGadget(11, 135, 180, 80, 20, "  n = 11  ")
OptionGadget(12, 135, 200, 80, 20, "  n = 12  ")

Frame3DGadget(13, 125, 80, 415, 210, " n - Wert ", 0)

SpinGadget(0, 550, 85, 40, 30, 2, 6)
SetGadgetState (0,2) 
   

ListIconGadget(1, 600, 85, 400, 200, "# = i", 42 ,#PB_ListIcon_GridLines|#PB_ListIcon_AlwaysShowSelection )


;Goto Ende
;
;Wenn ich von hier ans Ende springe, werden die Gadgets korrekt dargestellt.
;
;Laufe ich weiter durch die Permutation, erscheint nur das Hauptfenster.
;
;Und vom ListIconGadget lediglich das rechte Scrollband.
;
;Am Ende der Hauptroutine erscheinen dann alle Gadgets im Hauptfenster,
;einschließlich der Daten im ListIconGadget.
;Eigentlich sollte es so während der Abarbeitung der Hauptroutine aussehen,
;inkl. der "Auffüllung" des ListIconGadget

;
;
; Hinweis : Hier werden später einmal die OptionGadgets abgefragt
;
;
Minzahl = 1
Hoechstzahl = 20
K = 5

If K = 6 : Goto 6_aus_n : Else:
If K = 5 : Goto 5_aus_n : Else:
If K = 4 : Goto 4_aus_n : Else:
If K = 3 : Goto 3_aus_n : Else:
If K = 2 : Goto 2_aus_n : Else: Goto _Ende


6_aus_n :
4_aus_n :
3_aus_n :
2_aus_n :
;
;
;

5_aus_n :

AddGadgetColumn(1,1,"Zahl 1",42)      ;AddGadgetColumn(#Gadget, Position, Titel$, Breite)
AddGadgetColumn(1,2,"Zahl 2",42)   
AddGadgetColumn(1,3,"Zahl 3",42)
AddGadgetColumn(1,4,"Zahl 4",42)
AddGadgetColumn(1,5,"Zahl 5",42)

ActivateGadget(7)

For Zahl1= Minzahl To Hoechstzahl - 4
For Zahl2=Zahl1+1 To Hoechstzahl - 3
For Zahl3=Zahl2+1 To Hoechstzahl - 2
For Zahl4=Zahl3+1 To Hoechstzahl - 1
For Zahl5=Zahl4+1 To Hoechstzahl


WindowEvent()
i = i + 1 : AddGadgetItem(1,-1,Str(i) +Chr(10)+ Str(Zahl1) +Chr(10)+ Str(Zahl2) +Chr(10)+ Str(Zahl3) +Chr(10)+ Str(Zahl4) +Chr(10)+ Str(Zahl5))

          ; ActivateGadget(1) ; wird der scharf gemacht, sieht es noch blöder aus.

Next
Next
Next
Next
Next


EndIf
EndIf
EndIf
EndIf
EndIf
EndIf


_Ende:

HideWindow(0, 0)

Repeat
  
  EventID.l = WaitWindowEvent()
    If EventID = #PB_Event_closeWindow
      Ende = 1
    EndIf

Until Ende = 1

End 

Gadgets verschwinden

Verfasst: 18.05.2005 22:23
von Peter aus der Nordheide
Hi Daniel,
Ende ist also eine Variable UND eine Sprungmarkierung
Da hast Du recht, so geht's nun wirklich nicht.
HideWindow(0, 0)
Ist das nochmal ein zusätzliches Netz zur Sicherheit ?
Aber damit ist dann auf jeden Fall sichergestellt, daß die Schlußanzeige wenigstens erscheint.

Hi Thomas,

das mit der Ereignisabfrage der Fenster war natürlich der Knackpunkt.
War ich bei meiner Suche nach einer Lösung auch drauf, wußte aber nicht, ob denn das/die Ereignisse auch zu Fuß abgearbeitet werden müssen und habe es dann sein gelassen.

Fehlt vielleicht in der Hilfe ein Hinweis, daß die Fensterereignisse selbständig abgearbeitet werden !?

Euch beiden meinen herzlichen Dank für die schnelle Hilfe.

Ich denke, ich werde zum Anfang noch öfter hier erscheinen.

Gruß Peter

Re: Gadgets verschwinden

Verfasst: 19.05.2005 09:11
von freedimension
Peter aus der Nordheide hat geschrieben: Ich denke, ich werde zum Anfang noch öfter hier erscheinen.
Oh, wenn es dir hier gefällt kannst du auch gerne länger bleiben ;) :allright:

Verfasst: 19.05.2005 10:04
von Peter aus der Nordheide
Hallo,
Oh, wenn es dir hier gefällt kannst du auch gerne länger bleiben
Na klar doch, mach ich.

Nachgefragt :

Dank Eurer Hilfe ist das Problemchen gelöst.
Aber ich habe da noch eine grundsätzliche Verständnisfrage.

Das die Aktualisierung der Anzeige des ListIconGadgets ohne Abarbeitung der Fensterereignisse nicht läuft, habe ich kapiert.

Aber warum werden die (inaktiven) OptionGadgets während der Abarbeitung der Hauptschleife nicht angezeigt ?

Und auch beim ListIconGadget hätte ich dann erwartet, daß es in dem Initialisierungszustand erhalten bleibt ?!

Wäre sogar von Vorteil, weil dann das "Flackern" im ListIconGadet durch das Schreiben der Datensätze nicht in Erscheinung träte.
Stattdessen wäre ja eine Fortschrittsanzeige möglich, aber die kommt etwas später dran.

Die schnelle Lösung hilft mir Hier und Heute, aber das auf den Punkt bringen und das Verstehen der Zusammenhänge, das ist es.

Gruß Peter

Verfasst: 19.05.2005 10:24
von ts-soft
Die aktualisierung von Gadgets erfolgt nur, wenn die Ereignisse abgearbeitet werden. Das heißt es muß mindestens eine Ereignis-Schleife in mit WaitWindowEvent() bzw. WindowEvent() vorhanden sein. Wenn durch das eintreffen eines Ereignisses, ein CodeTeil abgearbeitet wird, der ziemlich lange braucht, werden die von Windows gesendeten Botschaften zum Neuzeichnen usw. nicht mehr verarbeitet. Dieses Problem kannste auch vielen Wegen vermeiden.
1. Längeren Code in einem extra Thread abarbeiten (nicht für Einsteiger geeignet)
2. Fensterelemente vorübergehend deaktivieren, Fortschrittsanzeige davor setzen. Fenster jetzt noch mal aktualisieren mittels: While WindowEvent():Wend, und jetzt den langen Code ausführen

In der Forensuche oder im CodeArchiv findest Du bestimmt noch mehr Hinweise, Stichwörter: WindowCallback usw.

Verfasst: 19.05.2005 10:40
von Peter aus der Nordheide
Hi Thomas,

das ging ja wieder einmal ganz fix.

Dann werde ich mal mit der 2.Lösung etwas rumspielen und auf die Suche gehen.

Danke und Gruß
Peter