Seite 1 von 2

Startfenster Textgadget Farbe nicht änderbar???

Verfasst: 31.05.2009 12:31
von AddMe
Hallo Zusammen,

ich habe mal folgende Frage, da ich nicht verstehe, warum das nicht funktioniert:

Bevor ich das Hauptfenster start, öffne ich ein Hinweisfenster (s. Procedure: Procedure OpenStartWindow() )

Die Hintergrundfarbe des Hinweisfensters habe ich geändert bekommen, jedoch die TextGadget Hintergrundfarbe krieg ich einfach nicht geändert auf die gleiche Hintergrundfarbe wie das Hinweisfenster.

Wäre toll, wenn mir hier jemand helfen könnte, da ich einfach nicht mehr weiter weis.

Hier der Code:

Code: Alles auswählen

;{ Constants
;*************************************
Enumeration     ;Windows
  #main
  #StartHinw
  #benutzhinw
EndEnumeration
;*************************************
Enumeration     ;Gadgets
  #ExplorerTree0
  #HinwTxt1
  #HinwTxt2
  #HinwTxt3
  #HinwTxt4
  #HinwTxt5
  #HinwTxt6
  #Frame1
  #Frame2
  #ListIconGad1
EndEnumeration
;*************************************
;} Constants
Procedure OpenStartWindow()

   OpenWindow(#StartHinw, 200, 200, 300, 125,"", #PB_Window_BorderLess| #PB_Window_ScreenCentered)
         SetWindowColor(#StartHinw,RGB($00,$66,$CC)) 
         TextGadget(#HinwTxt4,40,30,220,20,"Achtung: Statistik wird aufbereitet!", #PB_Text_Center)
         SetGadgetColor(#HinwTxt4,#PB_Gadget_BackColor,RGB($00,$66,$CC)) 
         TextGadget(#HinwTxt5,40,50,220,20,"Bitte etwas Geduld ...",#PB_Text_Center)
         SetGadgetColor(#HinwTxt5,#PB_Gadget_BackColor,RGB($00,$66,$CC)) 
         TextGadget(#HinwTxt6,40,70,220,20,"",#PB_Text_Center)
         SetGadgetColor(#HinwTxt6,#PB_Gadget_BackColor,RGB($00,$66,$CC)) 
            
EndProcedure
Procedure OpenHinw()

   OpenWindow(#benutzhinw, 200, 200, 300, 100,"", #PB_Window_BorderLess| #PB_Window_ScreenCentered)
         SetWindowColor(#benutzhinw,RGB($00,$66,$CC)) 
         TextGadget(#HinwTxt1,40,30,220,20,"Achtung: Tabellen werden verglichen!", #PB_Text_Center)
         TextGadget(#HinwTxt2,40,50,220,20,"Bitte etwas Geduld ...",#PB_Text_Center)
         SetGadgetColor(#HinwTxt1,#PB_Gadget_BackColor,RGB($00,$66,$CC))
   
EndProcedure
Procedure Open_main()

  OpenWindow(#main, 216, 0, 600, 450, "StartFenster",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
      SetWindowColor(#main,RGB(235,234,219)) 
      
EndProcedure
OpenStartWindow()
Delay(10000)
CloseWindow(#StartHinw)
Open_main()

;{  Start of the event loop
Repeat ; Start of the event loop
  
  Event = WaitWindowEvent() 
  WindowID = EventWindow()
  Select EventWindow()
;*********************************************************
;{ Window Main
    Case   #main
      Select Event
        Case #PB_Event_Gadget
    ;*************************************
    ;** Gadget Events
          Select EventGadget()
            Case #ExplorerTree0
              Select EventType()
                Case #PB_EventType_LeftDoubleClick
              EndSelect
          EndSelect
    ;*************************************
    ;** Other Events
        Case #PB_Event_CloseWindow
          EXIT = 1
      EndSelect
;} Window Main
;*********************************************************
;{ Window Benutzerhinweis
    Case #benutzhinw
      Select Event
        Case #PB_Event_Gadget
    ;*************************************
    ;** Gadget Events
          Select EventGadget()
            ;Case #Sub1_But_TestBeep
              ;Beep_( 500,300)
          EndSelect
    ;*************************************
    ;** Other Events
        Case #PB_Event_CloseWindow
          CloseWindow(#benutzhinw)
      EndSelect
;} Window Benutzerhinweis      
;*********************************************************
;*** End of Window List
;*********************************************************
  EndSelect
Until EXIT = 1
End
;}  End of the event loop
Gruß
Michael

Verfasst: 31.05.2009 13:16
von HeX0R
Ein typischer Fehler.

Du kannst nicht ein Fenster aufmachen und dich nicht um die anstehenden Events kümmern.
(O.k., können kannst du natürlich, aber du siehst ja, was passiert)
Ändere mal dein Delay(10000) in etwas vernünftigeres wie:

Code: Alles auswählen

T = ElapsedMilliseconds() + 10000
Repeat
	WaitWindowEvent(5)
Until T < ElapsedMilliseconds()

Verfasst: 31.05.2009 13:29
von Kaeru Gaman
schon witzig...

da nimmst du das Grundgerüst von meinem Beispielcode für mehrere Fenster, aber benutzt es nicht... :lol:

Verfasst: 31.05.2009 13:29
von AddMe
Hallo HeXOR,

vielen Dank für Deine Antwort.
HeX0R hat geschrieben:Ein typischer Fehler.
Du kannst nicht ein Fenster aufmachen und dich nicht um die anstehenden Events kümmern.
Dieses Delay habe ich nur eingebaut, damit man sehen kann, was mein Problem ist, ansonsten benutze ich es nicht.

Nachdem dieses Hinweisfenster geöffnet ist, rufe ich eine weitere Procedure auf. In dieser Procedure werden Daten aus einer Excel Tabelle ausgelesen und in eine Sqlite Datenbank gespeichert.
Doch wie geschrieben, die Hintergrundfarbe der TextGadget ist nicht änderbar.

Während die Procedure durchläuft, verändere ich folgendes TextGadget:

Code: Alles auswählen

SetGadgetText(#HinwTxt6, "Verarbeite Datensatz-Nr.: " + Str(intRow) + "")
Ich zeige an, welcher Datensatz gerade eingelesen und verarbeitet wird.

Nun weis ich leider nicht, wie ich Deinen Hinweis weiter verwenden kann, damit die Hintergrundfarbe des TextGadget geändert wird.

Wäre toll, wenn Du noch mal Hilfestellung geben könntest.

Vielen Dank

Gruß
Michael

Verfasst: 31.05.2009 13:32
von AddMe
Hallo Kaeru Gaman,

vielen Dank für Deine Antwort.
Kaeru Gaman hat geschrieben:schon witzig...

da nimmst du das Grundgerüst von meinem Beispielcode für mehrere Fenster, aber benutzt es nicht... :lol:
Vielen Dank für Dein Beispiel. Habe versucht es zu verstehen. Ist halt schwierig für mich.

Ja, sorry, bin doch leider Anfänger. Der noch viele Probleme hat mit der Umsetztung und dem Verstehen des Codes... :oops:

Wäre toll, wenn Du mir hier helfen könntest. :)

Gruß
Michael

Verfasst: 31.05.2009 13:40
von HeX0R
AddMe hat geschrieben: Nachdem dieses Hinweisfenster geöffnet ist, rufe ich eine weitere Procedure auf. In dieser Procedure werden Daten aus einer Excel Tabelle ausgelesen und in eine Sqlite Datenbank gespeichert.
Doch wie geschrieben, die Hintergrundfarbe der TextGadget ist nicht änderbar.
...und in genau dieser Prozedur musst du auch Events aus der "Schlange" zuzzeln (via WindowEvent()).
Dann wird wie von Geisterhand, das Textgadget eingefärbt.

Verfasst: 31.05.2009 13:47
von Kaeru Gaman
> Nachdem dieses Hinweisfenster geöffnet ist, rufe ich eine weitere Procedure auf. In dieser Procedure werden Daten aus einer Excel Tabelle ausgelesen und in eine Sqlite Datenbank gespeichert.
> Doch wie geschrieben, die Hintergrundfarbe der TextGadget ist nicht änderbar.

die Textfarbe ist dort ebenso änderbar wie mit der korrekt gemachten wartezeit.

wenn du eine Verarbeitungsschleife ohne Eventverarbeitung erstellst, kommt das aufs selbe raus wie das Delay.


du kannst alle diese Verarbeitungen in die Hauptschleife aus meinem Beispiel integrieren,
aber immer nur einen schritt pro durchlauf, damit der rest der Haupt-Ereignisschleife auch abgearbeitet wird.

Verfasst: 31.05.2009 14:03
von AddMe
Hallo Kaeru Gaman,
hallo HeXOR,

vielen Dank für Eure Antworten.

Ich verstehe, denke ich, warum es bei mir nicht funktioniert. Anhand des Beispieles von HeXOR wird es etwas klarer.
Doch, sorry, ich verstehe nicht, wie ich das in meinen Code umsetzen kann. Hab da irgendwie einen Aussetzer.

Wie bringe ich das ganze den in die WindwosEvent() Schleife???

Code: Alles auswählen

OpenStartWindow()
Directory$ = GetExePath()
FileArchiv$ = Directory$ + "AP.xls"

StartVerz$ = Directory$

  DBAnlegen()
  If OpenDatabase(0, DB$, "", "")
    If DatabaseUpdate(0, "INSERT INTO DatVerzeichn (DatTreeNr, DatTree) VALUES (1,'" + Directory$+ "')")
;      Else
;       MessageRequester("Fehler", "Kann die folgende Abfrage nicht ausführen: "+DatabaseError())
    EndIf
    CloseDatabase(0)
  EndIf
  StatistikAnz()
  CloseWindow(#StartHinw)
Open_main()
Das ist der Code, den ich benutze, bevor ich in das Repeat und Windows Event reingehe. Also müsste ich dieses in die Event Schleife integrieren?
Verstehe ich es richtig, wenn ich den Inhalt des TextGadget ändere (Verarbeite Datensatz...) muss ich auch irgendwie über diese Eventschleife aus der Procedure raus?

Sorry, verstehe das einfach noch nicht.

Nochmals vielen Dank für Eure Geduld.

Verfasst: 31.05.2009 14:21
von Kaeru Gaman
nun, du solltest IMMER irgendwelche verarbeitungen in die Hauptschleife integrieren oder in einem thread nebenher laufen lassen.

wenn dein Programm im Ablauf NICHT an einem (Wait)WindowEvent vorbeikommt,
dann erscheint über ihm die Sanduhr, nach einer gewissen zeit kommt auch die Meldung von Windows "reagiert nicht".

probiers mal aus:
mach einfach mal ein fenster auf und danach ein großes delay.
wenn du in den Taskmanager schaust, steht da neben dem Task von deinem Fenster "keine Rückmeldung",
und wenn du lange genug wartest, bekommst du auch die passende Popup-Meldung.

Verfasst: 31.05.2009 14:45
von Regenduft
Kann sein, dass ich jetzt etwas erkläre was Du evtl. schon weißt, aber im Zweifelsfall freut sich vielleicht ein anderer Leser...

WindowEvent() und WaitWindowEvent() lesen nicht nur Event aus der Queue aus sondern "verarbeiten" diese auch.

Wenn Du z.B. ein Fenster erstellst, dann die Gadgets erstellst, munter an den Gadgets "rumschraubst" und kein einziges mal WaitWindowEvent() oder WindowEvent() aufrufst, so wirst Du ein leeres Fenster sehen.

Wenn Du eh keine Event-Abfrage benötigst, sondern nur ein "Fenster-Refresh" dann kannst Du auch alle Eingabe-Gadgets mit DisableGadget() sperren und anschließend nach jeder Fenster- bzw. Gadget-Manipulation den (gewöhnlich als böse und hinterlistig bezeichneten) Event-Fresser einsetzen:
While WindowEvent() : Wend