Seite 1 von 2

Window-Refresh bzw. fehlender Fensteraufbau

Verfasst: 13.09.2004 13:01
von Agent
Hallöchen.

Ich habe mein Problem bereits im "ehemaligen" Forum mal angesprochen und div. Antworten erhalten, die mein Problem leider nicht lösten.
Mich wundert nur, das nur ich das Problem habe....*kopf-schüttel*

Folgendes:
Ich habe ein Fenster mit diversen Gadgets. Ich öffne ein weiteres Fenster, was mein Hauptfenster überlappt bzw. mittig drüber liegt - dies könnte auch ein openfilereq sein.Alles ohne Threats, macht das Hauptprogramm. Sobald ich das obere (als 2.geöffnete) Fenster schliesse, wird das untere (Hauptfenster) nicht neu aufgebaut, d.h. es fehlen einige Gadgets oder der "überlapp-Bereich" bleibt grau.

Ich würde gerne den Code einfügen, aber der ist 30,1kb groß (wird nen Email Programm), aber ich denke, jeder weiß was gemeint ist.

Thx schomma im voraus.

Verfasst: 13.09.2004 13:30
von Agent
So. Hab mich entschlossen doch mal nen Auszug aus dem Progy zu posten. Hier die Proc die vom Hauptfenster aus per Menü aufgerufen wird....

Code: Alles auswählen

Procedure createnewmail(accountnr)
  OpenWindow(#createmailwin, 0, 0, 560, 500,#PB_Window_ScreenCentered, "Neue Email")
  If CreateGadgetList(WindowID())
    TextGadget(#send_text_1, 10, 40, 90, 20, "Empfänger")
    TextGadget(#send_text_2, 10, 70, 90, 20, "Kopie")
    TextGadget(#send_text_3, 10, 100, 90, 20, "Betreff")
    StringGadget(#send_receiver, 100, 40, 320, 20, "", #PB_String_BorderLess)
    StringGadget(#send_copy, 100, 70, 320, 20, "", #PB_String_BorderLess)
    StringGadget(#send_subject, 100, 100, 320, 20, "", #PB_String_BorderLess)
    ComboBoxGadget(#priority, 490, 40, 60, 100)
    AddGadgetItem(#priority,-1,"-1")
    AddGadgetItem(#priority,-1,"0")
    AddGadgetItem(#priority,-1,"1")
    TextGadget(#send_text_5, 440, 40, 50, 20, "Priorität")
    TextGadget(#send_text_0, 10, 10, 80, 20, "Absender")
    EditorGadget(#mailtext, 10, 160, 540, 300)
    ButtonGadget(#send_send, 10, 470, 150, 20, "Senden", #PB_Button_Default)
    ButtonGadget(#send_abort, 440, 470, 110, 20, "Abbrechen")
    
    ComboBoxGadget(#send_sender,100, 10, 160, 100)
    ;StringGadget(#send_sender, 100, 10, 160, 20, "", #PB_String_ReadOnly | #PB_String_BorderLess)
    For i=1 To anz_account
      AddGadgetItem(#send_sender,-1,account(i)\accountname$)
    Next i
    
    TextGadget(#send_text_4, 10, 130, 90, 20, "Anhang")
    StringGadget(#send_attachment, 100, 130, 320, 20, "", #PB_String_BorderLess)
    ButtonGadget(#send_choose_attachment, 430, 130, 120, 20, "Datei anhängen")
    
    ;SetGadgetText(#send_sender,account(accountnr)\username$)
  EndIf
  exit=#False
  Repeat
    WinEvent=WindowEvent()
    If WinEvent=#PB_Event_Gadget
      Select EventGadgetID()
        Case #priority
          ;
        Case #send_send
          edit(MailText$)
          sendmail=sendmail(GetGadgetItemState(#send_sender,0),GetGadgetText(#send_sender),GetGadgetText(#send_receiver),GetGadgetText(#send_copy),GetGadgetText(#send_subject),Val(GetGadgetText(#priority)),GetGadgetText(#mailtext))
          exit=#True
        Case #send_choose_attachment
          ;
        Case #send_abort
          exit=#True
        Default
          ;
      EndSelect
    EndIf
    Delay(10)
  Until exit=#True
  CloseWindow(#createmailwin)
  UseWindow(#mainwin)
  ActivateWindow()
  ProcedureReturn sendmail
EndProcedure
Ich hoffe mir kann mit diesem grundsätzlichen Problem geholfen werden, da ich das gleiche Prob auch in anderen Proggys hab.

Verfasst: 13.09.2004 14:56
von RolandIV
hab ich noch nie so dran gedacht. Ich arbeite immer mit SetWindowCallback, da hab cih solche Probleme nicht.

Ansonten verwende mal #PB_EVENT_REPAINT, oder so heißt das, wenn der Fensterinhaltzerstört worde ist und neu gezeichnet werden muss.

Verfasst: 13.09.2004 16:27
von Agent
Hi RolandIV.

Hast du denn das Problem mal nachvollzogen?

Die Konstante mit dem Repaint kenn ich gar nicht *grübel*
SetWindowCallback...ich weiß. Aber davon ist mir abgeraten worden. Zudem löst dies nicht das "refresh" problem.

Ich glaube, dass passiert auch erst bei etwas komplexeren Gadgets, von der Menge her. Wenn nur 2-3 Gadgets da sind ist mir das auch noch nicht aufgefallen.

Naja, vielleicht hat ja jemand noch ne Idee oder nen Code-Schnipsel.

Verfasst: 13.09.2004 18:19
von Lars
Sorry, dein Code ist so nicht ausführbar, es fehlen sämtliche
Konstantendeklarationen etc.
Vielleicht fügst du die noch schnell hinzu, ich vermute aber jetzt schon,
dass dein Problem ist, dass du WindowEvent() nicht mehr aufrufst.

Verfasst: 13.09.2004 18:28
von RolandIV
also wenn du ein requester öffnest, und ihn wieder sclhießt, ist da ein grauer kasten im fenster drin oder wie??

Also ichhatte das Problem noch nie!
Vielleicht hilft dir das:

Code: Alles auswählen

hWNd=OpenWindow(0,0,0,200,150,#PB_WINDOW_SYSTEMMENU|#PB_WINDOW_SCREENCENTERED,"Test")
CreateGadgetList(WindowID())
ButtonGadget(0,20,20,100,20,"OpenRequester")
ButtonGadget(1,20,50,100,20,"Child-Window")
ButtonGadget(2,20,90,100,20,"Ende")
Repeat
  Select WaitWindowEvent()
    Case #PB_EVENT_CLOSEWINDOW
      If EventWindowID()=0 : End : EndIf
      If EventWindowID()=1 : CloseWindow(1) : EndIf
    Case #PB_EVENT_GADGET
      Select EventGadgetID()
        Case 0
          OpenFileRequester("","","",0)
        Case 1
          OpenWindow(1,0,0,100,100,#PB_WINDOW_SYSTEMMENU|#PB_WINDOW_WINDOWCENTERED,"Child",hWnd)
        Case 2
          End
      EndSelect
  EndSelect
ForEver
[/code]

Verfasst: 14.09.2004 10:46
von Agent
Ok. Ich seh schon, wir kommen so nicht weiter.

Hier also ein Auzug, den ich fürs Board mod. habe. Aber der Fehler tritt hier definitiv auf! Stört euch jetzt aber nicht so am coding, ist ne test-geschichte...


thx, hier der code:

Code: Alles auswählen

#mainwin=0
#fehler="FEHLER"
#createmailwin=1
Enumeration ; hauptfenster
  #Frame3D_0
  #Frame3D_1
  #Text_0
  #Text_1
  #ProgressBar_0
  #prozent
  #Tree_0
  #ListIcon_0
  #Panel_0
  #Editor_0
  #Editor_1
  #Editor_2
  #Web_0
  #ToolBar_0
  #ToolBar_New 
  #ToolBar_Open 
  #ToolBar_Save 
  #ToolBar_Print 
  #ToolBar_Find 
  #ToolBar_Properties 
  #ToolBar_Help  
  #ListIcon_1
  #Menu_0
EndEnumeration
Enumeration ; neue email fenster
  #send_text_1
  #send_text_2
  #send_text_3
  #send_receiver
  #send_copy
  #send_subject
  #priority
  #send_text_5
  #send_text_0
  #mailtext
  #send_send
  #send_abort
  #send_sender
  #send_text_4
  #send_attachment
  #send_choose_attachment
EndEnumeration

Procedure MainWindow()
  If OpenWindow(#mainwin, 0, 0, 800, 620,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered , "windowtest")
    If CreateGadgetList(WindowID())
      Frame3DGadget(#Frame3D_0, 10, 40, 200, 350, "Account(s)")
      Frame3DGadget(#Frame3D_1, 10, 400, 200, 170, "Attachment(s)")
      TextGadget(#Text_0, 10, 580, 420, 20, "", #PB_Text_Border)
      
      ProgressBarGadget(#ProgressBar_0, 440, 580, 180, 20, 0, 100,#PB_ProgressBar_Smooth)
      TextGadget(#prozent,640,585,40,20,"")
      TextGadget(#Text_1, 685, 580, 105, 20, "Der Author", #PB_Text_Border)
      
      TreeGadget(#Tree_0, 20, 60, 180, 320)
      
      ListIconGadget(#ListIcon_0, 20, 420, 180, 140, "Dateiname", 125)
      AddGadgetColumn(#ListIcon_0, 2, "kb", 50)
      
      ListIconGadget(#ListIcon_1, 220, 50, 570, 190, "!", 15, #PB_ListIcon_MultiSelect | #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
      AddGadgetColumn(#ListIcon_1, 2, "Absender", 140)
      AddGadgetColumn(#ListIcon_1, 3, "Betreff", 220)
      AddGadgetColumn(#ListIcon_1, 4, "Datum", 140)
      AddGadgetColumn(#ListIcon_1, 5, "Größe", 50)
      
      PanelGadget(#Panel_0, 220, 250, 570, 320)
      AddGadgetItem(#Panel_0, -1, "Email-Text")
      EditorGadget(#Editor_0, 8, 8, 550, 280)
      AddGadgetItem(#Panel_0, -1, "HTML")
      WebGadget(#Web_0, 8, 8, 550, 280, "about:blank")
      AddGadgetItem(#Panel_0, -1, "Header")
      EditorGadget(#Editor_1, 8, 8, 550, 280)
      AddGadgetItem(#Panel_0, -1, "RAW")
      EditorGadget(#Editor_2, 8, 8, 550, 280)      
      
      CreateMenu(#Menu_0,WindowID())
      MenuTitle("Aktion")
      MenuItem(1,"Neue Email")
      MenuItem(2,"Emails downloaden")
      MenuTitle("Einstellungen")
      MenuItem(10,"Accounts")
      MenuTitle("About")
      MenuItem(99,"Pure-Board-Test")
      
      CloseGadgetList()
      ProcedureReturn -1
    EndIf
  EndIf
  ProcedureReturn 0
EndProcedure

Procedure createnewmail(accountnr)
  OpenWindow(#createmailwin, 0, 0, 560, 500,#PB_Window_ScreenCentered, "Neue Email")
  If CreateGadgetList(WindowID())
    TextGadget(#send_text_1, 10, 40, 90, 20, "Empfänger")
    TextGadget(#send_text_2, 10, 70, 90, 20, "Kopie")
    TextGadget(#send_text_3, 10, 100, 90, 20, "Betreff")
    StringGadget(#send_receiver, 100, 40, 320, 20, "", #PB_String_BorderLess)
    StringGadget(#send_copy, 100, 70, 320, 20, "", #PB_String_BorderLess)
    StringGadget(#send_subject, 100, 100, 320, 20, "", #PB_String_BorderLess)
    ComboBoxGadget(#priority, 490, 40, 60, 100)
    AddGadgetItem(#priority,-1,"-1")
    AddGadgetItem(#priority,-1,"0")
    AddGadgetItem(#priority,-1,"1")
    TextGadget(#send_text_5, 440, 40, 50, 20, "Priorität")
    TextGadget(#send_text_0, 10, 10, 80, 20, "Absender")
    EditorGadget(#mailtext, 10, 160, 540, 300)
    ButtonGadget(#send_send, 10, 470, 150, 20, "Senden", #PB_Button_Default)
    ButtonGadget(#send_abort, 440, 470, 110, 20, "Abbrechen")
    
    ComboBoxGadget(#send_sender,100, 10, 160, 100)
    ;StringGadget(#send_sender, 100, 10, 160, 20, "", #PB_String_ReadOnly | #PB_String_BorderLess)
    For i=1 To anz_account
      AddGadgetItem(#send_sender,-1,"Pure-Board-Test")
    Next i
    
    TextGadget(#send_text_4, 10, 130, 90, 20, "Anhang")
    StringGadget(#send_attachment, 100, 130, 320, 20, "", #PB_String_BorderLess)
    ButtonGadget(#send_choose_attachment, 430, 130, 120, 20, "Datei anhängen")
    
    ;SetGadgetText(#send_sender,account(accountnr)\username$)
  EndIf
  exit=#False
  Repeat
    winevent=WindowEvent()
    If winevent=#PB_Event_Gadget
      Select EventGadgetID()
        Case #priority
          ;
        Case #send_send
          ;edit(MailText$)
          ;sendmail=sendmail(GetGadgetItemState(#send_sender,0),GetGadgetText(#send_sender),GetGadgetText(#send_receiver),GetGadgetText(#send_copy),GetGadgetText(#send_subject),Val(GetGadgetText(#priority)),GetGadgetText(#mailtext))
          exit=#True
        Case #send_choose_attachment
          ;
        Case #send_abort
          exit=#True
        Default
          ;
      EndSelect
    EndIf
    Delay(10)
  Until exit=#True
  CloseWindow(#createmailwin)
  UseWindow(#mainwin)
  ActivateWindow()
  ProcedureReturn sendmail
EndProcedure


MainWindow()

Repeat
  winevent=WindowEvent()
  If winevent=#PB_Event_Menu
    Select EventMenuID() ; MENÜ abfragen
      Case 1 ; Neue Email
        ;HideWindow(#mainwin,1)
        If createnewmail(1)
          MessageRequester("Email wurde versendet","",0)
        Else
          MessageRequester(#fehler,"Email konnte nicht versendet werden",#MB_ICONERROR)
        EndIf 
        ;HideWindow(#mainwin,0)
      Case 2 ; Emails downloaden
        For i=1 To anz_account
          ;receivemail(i)
        Next i
      Case 99
        ;about()
      Default
        ;infowin(Str(EventMenuID())+" wurde gewählt",1)
    EndSelect
  EndIf 
  If winevent=#PB_Event_Gadget
    Select EventGadgetID()
      Case #ListIcon_1
        If EventType() = #PB_EventType_LeftDoubleClick
          eintragnr=GetGadgetState(#ListIcon_1)+1
          ;MailText$=loadmail(eintragnr)
          ;SetGadgetText(#Editor_1,loadmailheader(eintragnr))
          ;SetGadgetText(#Editor_0,convertmailtext(loadmailtext(eintragnr)))
          ;SetGadgetText(#Editor_2,MailText$)
          ;MessageRequester("",getcurrentdir(),0)
          ;If Len(getmailhtmltext(MailText$))>0
          ;  tempfile.s=getcurrentdir()+#maildir+Str(Date())+".html" 
          ;  OpenFile(12,tempfile)
          ;  WriteStringN(convertmailtext(getmailhtmltext(MailText$)))
          ;  CloseFile(12) 
          ;  Delay(250)
          ;  SetGadgetText(#Web_0,tempfile)
          ;Else 
          ;  SetGadgetText(#Web_0,getcurrentdir()+#maildir+"_nohtml.htm")
          ;EndIf 
        EndIf
      Case #Tree_0
        If EventType() = #PB_EventType_LeftClick
          accountnr=GetGadgetState(#Tree_0)
          If accountnr>=0
            accountnr+1
            accountnr=Round(accountnr/5,1)
            ;listnewmails(accountnr)
          EndIf 
        EndIf
        ;
    EndSelect
  EndIf
Until winevent=#PB_Event_CloseWindow

CloseWindow(#mainwin)

Verfasst: 14.09.2004 11:29
von Max.
Agent hat geschrieben:Ok. Ich seh schon, wir kommen so nicht weiter.

Hier also ein Auzug, den ich fürs Board mod. habe. Aber der Fehler tritt hier definitiv auf! Stört euch jetzt aber nicht so am coding, ist ne test-geschichte...
Ohne jetzt ins Detail zu gehen; nimm als ersten Schritt das komplette Eventhandling aus der Prozedur createnewmail heraus, sondern benütze das Handling in der Hauptschleife. Dann sollte es funktionieren - und evt. noch bestehende Fehler leichter behebbar.

Dann schau Dir die Konstanten an; die überschneiden sich für die beiden Fenster. Mit nur einer Enumeration Anweisung für beide Fenster / alle Gadgets funktioniert es.

Verfasst: 14.09.2004 11:37
von Agent
hm...

Stimmt. Der visual-editor ist zwar brauchbar aber nicht das Ultimative. Jetzt wo du es sagst mit den Konstanten - da könnt was dran sein.

Du meinst, ich soll das winevent() nicht separat in der Proc abhandeln? Das "neue email" Fenster ist aber doch nur kurzzeitig auf, wenn es beendet wird, hat das doch nix mehr mit dem Hauptprogramm zu tun. Dann würde die Abfrage immer noch "überlaufen" werden...

Macht doch eigentlich kein Sinn, oder?

Verfasst: 14.09.2004 12:02
von Max.
Agent hat geschrieben:hm...

Stimmt. Der visual-editor ist zwar brauchbar aber nicht das Ultimative. Jetzt wo du es sagst mit den Konstanten - da könnt was dran sein.

Du meinst, ich soll das winevent() nicht separat in der Proc abhandeln? Das "neue email" Fenster ist aber doch nur kurzzeitig auf, wenn es beendet wird, hat das doch nix mehr mit dem Hauptprogramm zu tun. Dann würde die Abfrage immer noch "überlaufen" werden...

Macht doch eigentlich kein Sinn, oder?
Jup, an dem mit den Konstanten ist tatsächlich was dran. :wink:

Nagel mich jetzt nicht auf irgendwelche unerwünschten Seiteneffekte fest, wenn Du seperates Event-Handling betreibst. Auf alle Fälle ist der Overheadaber definitiv geringer wenn Du nur eine Hauptschleife fährst und als Erstes schaust, welches Fenster betroffen ist (EventWindowID) und erst dann auf Gadget-Event-Ebene gehst.