Window-Refresh bzw. fehlender Fensteraufbau

Für allgemeine Fragen zur Programmierung mit PureBasic.
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Window-Refresh bzw. fehlender Fensteraufbau

Beitrag 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.
Zuletzt geändert von Agent am 13.09.2004 16:30, insgesamt 1-mal geändert.
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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.
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
RolandIV
Beiträge: 28
Registriert: 11.09.2004 13:33

Beitrag 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.
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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.
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag 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.
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
RolandIV
Beiträge: 28
Registriert: 11.09.2004 13:33

Beitrag 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]
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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)
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Max.
Beiträge: 58
Registriert: 29.08.2004 13:19

Beitrag 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.
AMD XP 2400+ · 1 GB RAM · Radeon 9800 Pro · Win XP SP1 · IE 6.0
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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?
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Max.
Beiträge: 58
Registriert: 29.08.2004 13:19

Beitrag 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.
AMD XP 2400+ · 1 GB RAM · Radeon 9800 Pro · Win XP SP1 · IE 6.0
Antworten