Problem oder Bug mit Editorgadget

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Problem oder Bug mit Editorgadget

Beitrag von dibro »

Hi,
nachdem ich so langsam überall durchgeboxt habe, ist mir ein Problem mit dem Editorgadget aufgefallen, weil mein Progi nicht so lief, wie ich wollte.
Ich habe das inzwischen herausgefunden. Ist das ein Bug?

Mein Programm verschwindet bei langem Lauf im Hintergrund. Deshalb habe ich das Window disabled, was aber nicht funktioniert.
Klicke ich ins Window,fängt es an zu kringeln, kommt aber am Ende zurück.
Ich stelle hier ein Beispiel ein, das beide Probleme vereinigt.
Gibt es da eine Lösung?

Code: Alles auswählen

#NewLine=#CRLF$ ; neue Zeile
If OpenWindow(0, 0, 0, 750, 200, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
      EditorGadget(1, 5, 8, 240, 133)
      EditorGadget(2, 250, 8, 240, 133)
      EditorGadget(3, 500, 8, 240, 133)
      If CreateStatusBar(1, WindowID(0))
          AddStatusBarField(120)
          AddStatusBarField(170)
      EndIf
      DisableWindow(0,#True)
      While a < 2001
          a + 1
          Text$ = "Das ist ein Versuch,   "
          StatusBarProgress(1, 1, a,0,0,2000)
          AddGadgetItem(1,-1, Text$+#Newline +"der macht kluch, Nr. " +Str(a))   ;geht immer, auch ohne #Newline
          AddGadgetItem(2, a, Text$+#NewLine +"der macht kluch, Nr. " +Str(a))   ;geht nicht mit #Newline oder chr(10)
          AddGadgetItem(3, a, Text$+          "der macht kluch, Nr. " +Str(a))   ;geht nur ohne #Newline
      Wend 
      DisableWindow(0,#False)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

;         AddGadgetItem(1,-1, Text$+Str(a)+#Newline +"der macht kluch Nr. "+Str(a))   ;geht immer, auch ohne #Newline
 
Übrigens vielen Dank für die anfängliche Hilfe.
Jetzt bin ich wieder soweit, dass ich mir meist helfen kann. Ich probiere die Beispiele in der Doku immer so lange aus, bis ich weiß, wie es läuft.
Viele Grüße
Dieter
Gruß aus Solingen, PB 6.0 Win 10 Pro
Taz
Beiträge: 27
Registriert: 20.01.2018 18:24
Wohnort: NRW

Re: Problem oder Bug mit Editorgadget

Beitrag von Taz »

Bei mir Läuft das so durch, klappt das so bei dir mit dem Code?

Code: Alles auswählen

EnableExplicit

Define i, Nr.s, Text$ = "Das ist ein Versuch,   "

If OpenWindow(0, 0, 0, 780, 200, "EditorGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
	EditorGadget(1, 5, 8, 240, 133)
	EditorGadget(2, 250, 8, 240, 133)
	EditorGadget(3, 500, 8, 270, 133)

	If CreateStatusBar(4, WindowID(0))
		AddStatusBarField(120)
		AddStatusBarField(170)
	EndIf

	DisableWindow(0, #True)
	For i=0 To 2000
		Nr = Str(i)
		StatusBarProgress(4, 1, i, 0, 0, 2000)
		AddGadgetItem(1, -1, Text$ + #CRLF$ + "der macht kluch, Nr. " +Nr)
		AddGadgetItem(2, -1, Text$ + #CRLF$ + "der macht kluch, Nr. " +Nr)
		AddGadgetItem(3, -1, Text$ +          "der macht kluch, Nr. " +Nr)
	Next
	DisableWindow(0, #False)

	Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
DePe
Beiträge: 153
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Problem oder Bug mit Editorgadget

Beitrag von DePe »

Ein Kommentar zu deiner Zeile:

AddGadgetItem(2, a, Text$+#NewLine +"der macht kluch, Nr. " +Str(a)) ;geht nicht mit #Newline oder chr(10)

Wenn du eine absolute Position angibst, wird die erste Zeile eingefügt, und darunter an Position + 1 die zweite Zeile. Darum sieht es so aus als ob die Zeilen falsch eingefügt werden, es ist aber richtig.

Liste ist leer, a = 1, der Text wird an Position 0 eingefügt:

* 0: Das ist ein Versuch,
* 1: der macht kluch, Nr. 1

Dann a = 2:

0: Das ist ein Versuch,
1: der macht kluch, Nr. 1
* 2: Das ist ein Versuch,
* 3: der macht kluch, Nr. 2

Dann a = 3:

0: Das ist ein Versuch,
1: der macht kluch, Nr. 1
2: Das ist ein Versuch,
* 3: Das ist ein Versuch,
* 4: der macht kluch, Nr. 3
5: der macht kluch, Nr. 2


Dann a = 4:

0: Das ist ein Versuch,
1: der macht kluch, Nr. 1
2: Das ist ein Versuch,
3: Das ist ein Versuch,
* 4: Das ist ein Versuch,
* 5: der macht kluch, Nr. 4
6: der macht kluch, Nr. 3
7: der macht kluch, Nr. 2

usw.

Du kannst anstatt a + 1, hier a * 2 verwenden, für die zwei eingefügten Zeilen, dann stimmt das Einfügen wieder wie gewollt:

AddGadgetItem(2, (a - 1) * 2, Text$+#NewLine +"der macht kluch, Nr. " +Str(a))

Dass das Fenster einfriert ist normal. Während des Füllens der EditorGadgets werden keine Ereignisse verarbeitet. Du kannst das z.B. über einen Timer oder per Thread und PostEvent machen.
Besser wäre es aber den gesamten Text auf einmal einzufügen, und nicht zeilenweise.

Peter
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Re: Problem oder Bug mit Editorgadget

Beitrag von dibro »

Danke für die Antworten.
Dass es mit -1 als Pos. geht reicht mir eigentlich, aber danke für die umfangreiche Erklärung.
Die Lösung von DePe habe ich mit dem Beispiel aus der Hilfe ausprobiert.
Läuft prima, gut zu wissen aber eigentlich braucht man das nicht.
Zeilenweise muss ich den Text einfügen, da einzelne Dateinamen und Datumsdaten nacheinander gelesen und manipuliert werden.

Code: Alles auswählen

 If OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
     EditorGadget(0, 8, 8, 306, 133)
     DisableWindow(0, #True)
    For a = 1 To 2000
     AddGadgetItem(0, (a - 1) * 2, "Das ist ein Versuch"+ Chr(10) +"der macht kluch, Nr. " +Str(a))
    Next
     DisableWindow(0, #False)
    Repeat : Until  WaitWindowEvent() = #PB_Event_CloseWindow 
  EndIf
Mein Problem ist, dass das Fenster während des Laufs nicht mehr bedient wird, wenn man es anklickt.
Es kringelt unter Windows.
Ich erfasse parallel die Laufzeit der Prozeduren und stelle den Ablauf mit der Prozessbar dar, aber wenn man in das Fenster klickt, bleibt das stehen, während das Progi weiterlaüft.
Ich habe eine Reihe Prozeduren, in denen oft sehr viele Dateien manipuliert werden, MP4 oder JPG, bei denen der Name in ein Datum umgewandelt wird oder das Datum aus dem Namen in das Datum der Datei geschrieben wird. Bei vielen Dateien (>1000) dauert es schon mal 60-70s und da stört das Kringeln, keine Rückmeldung.
Im Thread wollte ich die Funktionen nicht laufen lassen, weil keine parallele Prozedur erforderlich ist.
Ich dachte, dass DisableWindow ausreicht und das Fenster stilllegt, leider nicht.
Es passiert nichts, ist aber ein Schönheitsfehler, der irritiert.
Wie könnte ich das mit dem Timer machen ?
Das Prog. könnte ich ja auch einfügen, sind über 1000 Zeilen. Es ist aber durch learning by doing gewachsen und nicht immer "schön" programmiert.
Funktioniert aber.
Viele Grüße
Dieter
Gruß aus Solingen, PB 6.0 Win 10 Pro
DePe
Beiträge: 153
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Problem oder Bug mit Editorgadget

Beitrag von DePe »

Hallo Dieter,

hier ist ein einfaches Beispiel mit Thread.

Peter

Code: Alles auswählen

#Window = 0                                                                                              
#Editor = 0                                                                                              
                                                                                                         
Enumeration eEventCustom #PB_Event_FirstCustomValue                                                      
  #EventCustomNewText                                                                                    
EndEnumeration                                                                                           
                                                                                                 
Procedure EventCustomNewText()                                                                           
  Protected *Text.String                                                                                 
  *Text = EventData()                                                                                    
  If *Text                                                                                               
    AddGadgetItem(#Editor, -1, *Text\s)                                                                  
    FreeStructure(*Text)                                                                                 
  EndIf                                                                                                  
EndProcedure                                                                                             
                                                                                                 
Procedure Thread(iParam.i)                                                                               
  Protected a.i                                                                                          
  Protected *Text.String                                                                                 
  *Text = AllocateStructure(String)                                                                      
  For a = 1 To 2000                                                                                      
    *Text\s + "Das ist ein Versuch" + #CRLF$ +"der macht kluch, Nr. " + Str(a) + #CRLF$                  
    If (a % 10) = 0                                                                                      
      Debug "a = " + a                                                                                   
      PostEvent(#EventCustomNewText, #Window, #Null, #Null, *Text)                                       
      *Text = AllocateStructure(String)                                                                  
      Delay(10)                                                                                          
    EndIf                                                                                                
  Next                                                                                                   
  If Len(*Text\s)                                                                                        
    PostEvent(#EventCustomNewText, #Window, #Null, #Null, *Text)                                         
  EndIf                                                                                                  
EndProcedure                                                                                             
                                                                                                 
If OpenWindow(#Window, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  EditorGadget(#Editor, 8, 8, 306, 133)                                                                  
  BindEvent(#EventCustomNewText, @EventCustomNewText(), #Window)                                         
  CreateThread(@Thread(), #Null)                                                                         
  Repeat : Until  WaitWindowEvent() = #PB_Event_CloseWindow                                              
EndIf    
DePe
Beiträge: 153
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Problem oder Bug mit Editorgadget

Beitrag von DePe »

Und hier mit Timer.

Peter

Code: Alles auswählen

#Window = 0
#Editor = 0
#Timer = 1

Procedure NewText()
  Static a.i, c.i
  Protected Text.s
  #Items = 10

  For a = 1 To #Items
    Text + "Das ist ein Versuch" + #CRLF$ +"der macht kluch, Nr. " + Str(c + a) + #CRLF$
  Next
  AddGadgetItem(#Editor, -1, Text)
  c + #Items
  If c = 2000
    c = 0
    RemoveWindowTimer(#Window, #Timer)
  EndIf
EndProcedure

If OpenWindow(#Window, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  EditorGadget(#Editor, 8, 8, 306, 133)
  AddWindowTimer(#Window, #Timer, 10)
  BindEvent(#PB_Event_Timer, @NewText(), #Window)
  Repeat : Until  WaitWindowEvent() = #PB_Event_CloseWindow 
EndIf
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Re: Problem oder Bug mit Editorgadget

Beitrag von dibro »

Danke,
das mit dem Timer funktioniert prima, obwohl ich das noch nicht restlos kapiert habe.
Ich initialisiere den Timer in der Abfrageschleife 1 x und rufe über ein Select die verschiedene Prozeduren auf.
Es gibt aber mit einer Prozedur ein Problem.
Darin habe ich mir ein Childwindow gebastelt in dem 3 Buttons über WaitWindowEvent() abgefragt werden und da meckert der Compiler.
Darin wird abgefragt ob die Datei geändert werden soll Ja/Nein/Alle.
Beim Requester kann man die 3 Buttons zwar auch umbenennen, das gibt aber wieder andere Probleme.
Vorher stellt die Prozedur fest, ob der Dateinamen ein Datum enthält, deshalb kann ich die Abfrage über das Childwindow nicht einfach auslagern.

Code: Alles auswählen

Repeat 
    WaitWindowEvent()
            Select EventGadget()
                Case #ButYes
                    Wert = 1 
                Case #ButNo
                    Wert = 2
                Case #ButAll
                    Wert = 3 
            EndSelect 
   Until  Wert > 0 
Kann man das anders machen als über WaitWindowEvent()?
Grüße Dieter
Gruß aus Solingen, PB 6.0 Win 10 Pro
DePe
Beiträge: 153
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Problem oder Bug mit Editorgadget

Beitrag von DePe »

Hallo Dieter,

ich verwende nur BindEvent-Funktionen anstatt der Ereignisschleife mit WaitWindowEvent(). Für mich ist das einfacher und logischer. Falls du mehrere WaitWindowEvent()-Funktionen verwendest kann es zu Problemen kommen. Bin mir aber nicht sicher ob ich dein Problem verstanden habe. Hier ist ein Code der ein Fenster mit Abfrage anzeigt und nur per BindEvent und PostEvent funktioniert, vielleicht kannst du so dein Problem lösen.

Peter

Code: Alles auswählen

EnableExplicit

#Window = 0
#Editor = 0
#Button = 1

#MessageBox = 1
#Button1 = 2
#Button2 = 3
#Button3 = 4

Enumeration eEventCustom #PB_Event_FirstCustomValue
  #EventMessageBox
EndEnumeration

Procedure EventMessageBox()
  Protected Antwort.i
  Select EventGadget()
    Case #Button1
      Antwort = 1
    Case #Button2
      Antwort = 2
    Case #Button3
      Antwort = 3
  EndSelect
  PostEvent(#PB_Event_CloseWindow, #MessageBox, #Null, #Null, Antwort)
EndProcedure

Procedure EventCloseMessageBox()
  Protected Antwort.i
  Antwort = EventData()
  CloseWindow(EventWindow())
  PostEvent(#EventMessageBox, #Window, #Null, #Null, Antwort)
  DisableWindow(#Window, #False)
EndProcedure

Procedure MessageBox(Titel.s)
  DisableWindow(#Window, #True)
  If OpenWindow(#MessageBox, #PB_Ignore, #PB_Ignore, 200, 100, Titel,
      #PB_Window_SystemMenu | #PB_Window_WindowCentered, WindowID(#Window))
    ButtonGadget(#Button1, 5, 30, 60, 25, "1")
    ButtonGadget(#Button2, 70, 30, 60, 25, "2")
    ButtonGadget(#Button3, 135, 30, 60, 25, "3")
    BindEvent(#PB_Event_Gadget, @EventMessageBox(), #MessageBox)
    BindEvent(#PB_Event_CloseWindow, @EventCloseMessageBox(), #MessageBox)
  EndIf
EndProcedure

Procedure EventButton()
  MessageBox("Bitte auswählen")
EndProcedure

If OpenWindow(#Window, 0, 0, 322, 185, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  EditorGadget(#Editor, 8, 8, 306, 133)
  ButtonGadget(#Button, 8, 149, 100, 25, "MessageBox")
  BindGadgetEvent(#Button, @EventButton())
  Repeat
    Define Event.i = WaitWindowEvent()
    If Event = #EventMessageBox
      Define Antwort.i = EventData()
      If Antwort
        AddGadgetItem(#Editor, -1, "Die Antwort ist " + Antwort)
      Else
        AddGadgetItem(#Editor, -1, "Abgebrochen, die Antwort ist " + Antwort)
      EndIf
    EndIf
  Until  Event = #PB_Event_CloseWindow
EndIf
Antworten