Seite 1 von 2

ImageGadget verschwindet bei zweitem Fenster

Verfasst: 13.03.2009 22:09
von Elektrolurch
Hi All

Ich habe gerade mal wieder etwas ausprobiert und mir dabei wohl einen Fehler eingebaut.

Ich möchte um Fehler meines Programmes analysieren zu können einen kleinen Debugger mitbringen.
Da zu kann ich mit einer Checkbox ein neues Window öffnen.
In diesem Window erstelle ich dann ein Editorgadget.
Nun schreibe ich alle Meldungen meines Programms dort hinein.
Soweit ist alles in Ordnung.
Der Fehler liegt darin, dass in meinem HauptWindow ein ImageGadget am Ende der protokollierten Procedure das Bild wechseln soll.
Mit aktiviertem zweiten Fenster verschwindet das ImageGadget komplett.
Ist das Protokoll abgeschaltet also das zweite Fenster nicht da klappt es.
Was kann ich tun, damit es auch mit Protokoll klappt?

Bye Andre

Verfasst: 13.03.2009 22:13
von ts-soft
code der den fehler aufzeigt wäre ein anfang

Meine Glaskugel sagt, du verwendest GadgetIDs mehrfach, also IDs die
in beiden Fenstern vorkommen.

Verfasst: 13.03.2009 22:15
von Kaeru Gaman

Verfasst: 13.03.2009 22:22
von Elektrolurch
HI

wo kriegt ihr nur die Glaskugeln her.
Der Ganze Code wäre wohl zu umfangreich, aber das sind wohl die wichtigen Stellen

Code: Alles auswählen

UseJPEGImageDecoder()
;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
  #Window_1
EndEnumeration
;}
;{ Gadgets
Enumeration
  #IPAddress_0
  #Text_1
  #Button_1
  #Button_2
  #Button_3
  #Button_4
  #String_1
  #Editor_1
  #Editor_2
  #Editor_3
  #Editor_11
  #Gadget
  #Text_2
  #Text_3
  #Text_4
  #Text_5
  #Check_1
EndEnumeration
DataSection
  
  UdhcpdStart :
  IncludeBinary "c:\HF_Helper\udhcpd.orig"
  UdhcpdEnd :
  SmbStart :
  IncludeBinary "c:\HF_Helper\smb.conf"
  SmbEnd :
EndDataSection
Global IniFile.s = ""
Global IP_Adr.s = ""
Global Log = 0
Global Login.s = "root"
Global Passwort.s = "root"
Global Ziel.s
Global Ser_Nr.s = ""
Global Install.s = "Installieren"
Global Deinstall.s = "Deinstallieren"
Global Funktion.s = ""
Global Dim Telnet_Befehl.s(5)
Global Dim Telnet_Ergebnis.s(5)
Global IM
Global Befehle.l
Global dt =100
;}
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
;}
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 1, 1, 500, 500, "Hifidelio Helper", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
      ; hier beginnt das Erstellen des Menüs...
    If CreateMenu(0, WindowID(0))
      MenuTitle("Funktion")
      MenuItem(1, "Internetradio Patch")
      MenuItem(2, "Musikordner freigeben")
      MenuBar() 
      ; hier wird der Abgrenzungsbalken eingefügt
      MenuItem(99, "Beenden")
      MenuTitle("Admin Funktionen")
      MenuItem(101, "Update auf Pro")
      MenuItem(102, "IPAdressen zurücksetzen")
      MenuItem(103, "Musik retten")
    EndIf
    If CreateGadgetList(WindowID(#Window_0))
      ;immer Sichtbar
      IPAddressGadget(#IPAddress_0, 280, 10, 205, 25)
      TextGadget(#Text_1, 225, 13, 54, 14, "IP Adresse")
      ButtonGadget(#Button_1, 15, 5, 70, 30, "Verbinden")
      CheckBoxGadget(#Check_1, 5, 465, 90, 14, "Debugfenster")
      TextGadget(#Text_3, 390, 465, 70, 14, "Seriennummer")
      TextGadget(#Text_4, 460, 465, 35, 15, "", #PB_Text_Border)
      TextGadget(#Text_2, 102, 13, 54, 14, "Passwort")
      StringGadget(#String_1, 150, 10, 61, 20, "root")
      ;Textfeld oben
      EditorGadget(#Editor_1, 15, 40, 380, 100, #PB_Editor_ReadOnly)
      HideGadget(#Editor_1, 1)
      ;Schalter oben
      ButtonGadget(#Button_2, 410, 75, 70, 30, "Oben")
      HideGadget(#Button_2, 1)
      ;Textfeld unten
      EditorGadget(#Editor_2, 15, 160, 380, 100, #PB_Editor_ReadOnly)
      HideGadget(#Editor_2, 1)
      ;Schalter unten
      ButtonGadget(#Button_3, 410, 195, 70, 30, "Unten")
      HideGadget(#Button_3, 1)
      ;Schalter ausführen
      ButtonGadget(#Button_4, 200, 440, 100, 30, "Installieren")
      HideGadget(#Button_4, 1)
      ;Editorfeld
      EditorGadget(#Editor_3, 15, 40, 470, 385)
      HideGadget(#Editor_3, 1)
      LoadImage(0, "c:\hf_helper\hf_Offline.jpg")
      ResizeImage(0, 350,233,#PB_Image_Smooth)
      LoadImage(1, "c:\hf_helper\hf_Online.jpg")
      ResizeImage(1, 350,233,#PB_Image_Smooth)
      ImageGadget(#Gadget, 75, 100, 350, 300, ImageID(0)) 
      
    EndIf
  EndIf
EndProcedure
Procedure OpenWindow_Window_1()
  If OpenWindow(#Window_1,520, 1, 450, 500, "Hifidelio Debug", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
    If CreateGadgetList(WindowID(#Window_1))
      ;Editorfeld
      EditorGadget(#Editor_11, 15, 15, 420, 470)
      HideGadget(#Editor_11, 0)
    EndIf
  EndIf
EndProcedure
Procedure Programmstart()
  ;Einstellungen laden-------------------------------------------------------------------------------
  IniFile.s = GetPathPart(ProgramFilename()) + "\HF_Helper.ini"
  If OpenPreferences(IniFile.s)
    PreferenceGroup("Global")
    IP_Adr.s = ReadPreferenceString("IP_Adr", "192.168.178.001")
    Passwort.s = ReadPreferenceString("Passwort", "root")
    ClosePreferences()
  Else
    IP_Adr.s = "192.168.178.001"
    CreatePreferences(IniFile.s)
    PreferenceGroup("Global")
    WritePreferenceString("IP_Adr", IP_Adr.s)
    WritePreferenceString("Passwort", Passwort.s)
    ClosePreferences()
  EndIf
  SetGadgetState(#IPAddress_0, MakeIPAddress(Val(StringField(IP_Adr, 1, ".")), Val(StringField(IP_Adr, 2, ".")), Val(StringField(IP_Adr, 3, ".")), Val(StringField(IP_Adr, 4, "."))))
  SetGadgetText(#String_1, Passwort.s)
EndProcedure
Procedure Programmende()

  CreatePreferences(IniFile.s)
  PreferenceGroup("Global")
  WritePreferenceString("IP_Adr", GetGadgetText(#IPAddress_0))
  WritePreferenceString("Passwort", GetGadgetText(#String_1))
  ClosePreferences()
  End
EndProcedure
Procedure Windowclean()
HideGadget(#Button_2, 1)
HideGadget(#Button_3, 1)
HideGadget(#Button_4, 1)
HideGadget(#Editor_1, 1)
HideGadget(#Editor_2, 1)
HideGadget(#Editor_3, 1)
EndProcedure
Procedure Telnet()
  DatenBuffer.s = Space(100)
  ConID = OpenNetworkConnection(IP_Adr.s, 23)
  If ConID
    ;Erste Sequenz vom Server prüfen und beantworten
    ReceiveNetworkData(ConID, @DatenBuffer, Len(DatenBuffer))
    Soll.s = Chr(255) + Chr(253) + Chr(24) + Chr(255) + Chr(253) + Chr(32) + Chr(255) + Chr(253) + Chr(35) + Chr(255) + Chr(253) + Chr(39)
    If Log = 1
      AddGadgetItem(#Editor_11, -1 , "Erwartet= " + Soll.s)
      AddGadgetItem(#Editor_11, -1 , "Erhalten= " + Mid(DatenBuffer, 0, 12))
    EndIf
    If Mid(DatenBuffer, 0, 12) = Soll
      An.s = Chr(255) + Chr(252) + Chr(24) + Chr(255) + Chr(252) + Chr(32) + Chr(255) + Chr(252) + Chr(35) + Chr(255) + Chr(252) + Chr(39) ;+Chr(13)+Chr(10)
      If Log = 1
        AddGadgetItem(#Editor_11, -1 , "Sende= " + An.s)
      EndIf
      If SendNetworkData(ConID, @An, 12) = - 1
        MessageRequester("Error", "Server akzeptiert Antwort nicht.!", 0)
      EndIf
    Else
      MessageRequester("Error", "Serversequenz unbekannt!", 0)
    EndIf
    Delay(dt)
    ;Zweite Sequenz vom Server prüfen und beantworten
    DatenBuffer.s = Space(100)
    ReceiveNetworkData(ConID, @DatenBuffer, Len(DatenBuffer))
    Soll.s = Chr(255) + Chr(251) + Chr(3) + Chr(255) + Chr(253) + Chr(1) + Chr(255) + Chr(253) + Chr(31) + Chr(255) + Chr(251) + Chr(5) + Chr(255) + Chr(253) + Chr(33)
    If Log = 1
      AddGadgetItem(#Editor_11, -1 , "Erwartet= " + Soll.s)
      AddGadgetItem(#Editor_11, -1 , "Erhalten= " + Mid(DatenBuffer, 0, 15))
    EndIf
    If Mid(DatenBuffer, 0, 15) = Soll
      An.s = Chr(255) + Chr(252) + Chr(1) + Chr(255) + Chr(252) + Chr(31) + Chr(255) + Chr(252) + Chr(33) ;+Chr(255)+Chr(252)+Chr(39);+Chr(13)+Chr(10)
      If Log = 1
        AddGadgetItem(#Editor_11, -1 , "Sende= " + An.s)
      EndIf
      If SendNetworkData(ConID, @An, 9) = - 1
        MessageRequester("Error", "Server akzeptiert Antwort nicht.!", 0)
      EndIf
    Else
      MessageRequester("Error", "Serversequenz unbekannt!", 0)
    EndIf
    Delay(dt)
    ;Dritte Sequenz vom Server Login-------------------------------------------------------------------
    Text.s = ""
    Repeat
      DatenBuffer.s = Space(100)
      V = ReceiveNetworkData(ConID, @DatenBuffer, Len(DatenBuffer))
      Text.s = Text.s +(Trim(RemoveString(DatenBuffer, Chr(13) + Chr(10))))
      If Right(Text.s, 6) = "login:"
        V = - 1
      EndIf
    Until V = - 1
    If Log = 1
      AddGadgetItem(#Editor_11, -1 , "L1_Erhalten= " + Mid(Text.s, 0, Len(Text.s) - 6))
      AddGadgetItem(#Editor_11, -1 , "L2_Erhalten= " + Right(Text.s, 6))
    EndIf
    An.s = Chr(255) + Chr(253) + Chr(1) + Login.s + Chr(13) + Chr(10)
    If Log = 1
        AddGadgetItem(#Editor_11, -1 , "L3_Sende= " + Login.s)
    EndIf
    If SendNetworkData(ConID, @An, Len(An.s)) = - 1
      MessageRequester("Error", "Server akzeptiert Antwort nicht.!", 0)
    EndIf
    Delay(dt)
    ;Vierte Sequenz vom Server Password;---------------------------------------------------------------
    Text.s = ""
    Repeat
      DatenBuffer.s = Space(100)
      V = ReceiveNetworkData(ConID, @DatenBuffer, Len(DatenBuffer))
      Text.s = Text.s +(Trim(RemoveString(DatenBuffer, Chr(13) + Chr(10))))
      If Right(Text.s, 9) = "Password:"
        V = - 1
      EndIf
    Until V = - 1
    If Log = 1
        AddGadgetItem(#Editor_11, -1 , "P1_Erhalten= " + Right(Text.s, 9))
    EndIf
    An.s = Chr(255) + Chr(253) + Chr(1) + Passwort.s + Chr(13) + Chr(10)
    If Log = 1
        AddGadgetItem(#Editor_11, -1 , "P2_Sende= " + Passwort.s)
    EndIf
    If SendNetworkData(ConID, @An, Len(An.s)) = - 1
      MessageRequester("Error", "Server akzeptiert Antwort nicht.!", 0)
    EndIf
    Delay(dt)
    ;Fünfte Sequenz vom Server Prompt ermitteln--------------------------------------------------------
    Text.s = ""
    Repeat
      DatenBuffer.s = Space(100)
      V = ReceiveNetworkData(ConID, @DatenBuffer, Len(DatenBuffer))
      Text.s = Text.s +(Trim(RemoveString(DatenBuffer, Chr(13) + Chr(10))))
      If Right(Text.s, 2) = "~#"
        V = 0
      EndIf
    Until V = 0
    For i = 0 To Len(Text.s)
      If Mid(Text, i, 4) = "root"
        Prompt.s = Mid(Text.s, i, Len(Text.s) - 2)
      EndIf
    Next
    If Log = 1
        AddGadgetItem(#Editor_11, -1 , "Pr1_Erhalten= " + Prompt.s)
    EndIf
    ;sechste Sequenz Seriennummer abfragen ------------------------------------------------------------
    For A = 1 To Befehle.l
      Befehl.s = Telnet_Befehl.s(A)

      An.s = Chr(255) + Chr(253) + Chr(1) + Befehl.s + Chr(13) + Chr(10)
      If Log = 1
        AddGadgetItem(#Editor_11, - 1, "Befehl_Senden= " + Befehl.s)
      EndIf
      ;Befehl senden
      If SendNetworkData(ConID, @An, Len(An.s)) = - 1
        MessageRequester("Error", "Server akzeptiert Antwort nicht.!", 0)
      EndIf
      Delay(dt)
      ;Warten bis Antwort komplett
      Text.s = ""
      Repeat
        DatenBuffer.s = Space(1000)
        V = ReceiveNetworkData(ConID, @DatenBuffer, Len(DatenBuffer))
        Text.s = Text.s +(Trim(DatenBuffer))
        If Right(Text.s, 1) = "#"
          For i = 1 To Len(Text.s)
            If Mid(Text.s, i, Len(Prompt.s)) = Prompt.s
              V = 0
              Telnet_Ergebnis.s(A) = Text.s
            EndIf
          Next
        EndIf
      Until V = 0
      If Log = 1
        AddGadgetItem(#Editor_11, - 1, "Befehl_Empfangen= " + Text.s)
      EndIf
    Next
  Else
    MessageRequester("Error", "Keine Verbidung zum Hifidelio möglich! ", 0)
  EndIf
  CloseNetworkConnection(ConID)
EndProcedure
Procedure Seriennummer()
SetActiveWindow(#Window_0)
Befehle.l = 1
Telnet_Befehl.s(1) = "bash /opt/Fidelio/bin/opus"
Telnet()
Ser_Nr.s = Mid(Telnet_Ergebnis.s(1), 29, 5)
SetGadgetText(#Text_4, Ser_Nr.s)
ImageGadget(#Gadget, 75, 100, 350, 300, ImageID(1))        
EndProcedure
OpenWindow_Window_0()
Programmstart()
;{- Event loop
Ziel.s = "\\" + IP_Adr.s + "\import\"
If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
EndIf
Repeat
  Event = WaitWindowEvent()
  Select Event
    ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #IPAddress_0
       IP_Adr.s = GetGadgetText(#IPAddress_0)
       Ziel.s = "\\" + IP_Adr.s + "\import\"
      ElseIf EventGadget = #Text_1
      ElseIf EventGadget = #Button_1
        Seriennummer()
      ElseIf EventGadget = #Button_2
      ElseIf EventGadget = #Button_3
      ElseIf EventGadget = #Button_4
      ElseIf EventGadget = #String_1
        Passwort = GetGadgetText(#String_1)
      ElseIf EventGadget = #Text_2
      ElseIf EventGadget = #Text_3
      ElseIf EventGadget = #Text_4
      ElseIf EventGadget = #Check_1
        If GetGadgetState(#Check_1) = 1
          OpenWindow_Window_1()
          Log = 1
        Else
          CloseWindow(#Window_1)
          Log = 0
        EndIf
      ElseIf EventGadget = #Gadget
      EndIf
      ; ////////////////////////
    Case #PB_Event_Menu
      Select EventMenu() ; To see which menu has been selected
        
          
        Case 102 ; Sub >> Vergebene IPAdressen zuücksetzen
          
        Case 103 ; Sub >> Musik retten
          
        Case 1 ; Sub >> Internetradio
          
        Case 2 ; Sub >> Musikordner freigeben
          
        Case 99 ; Ende
          Programmende()

      EndSelect

    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
;;}
Ich hoffe es ist einigermaßen verständlich.

Update also doch komplett.

Bye Andre

Verfasst: 13.03.2009 22:26
von ts-soft
> aber das sind wohl die wichtigen Stellen
Nein, das ist mehr ünnütz. Wo ist die Enumeration und besser noch das
EventLoop dazu

Verfasst: 13.03.2009 22:45
von Elektrolurch
Hi

OK ich habe oben mal komplettiert.
Vielleicht hilft das ja.

Bye

Verfasst: 13.03.2009 23:02
von Kaeru Gaman
läßt sich halt nicht testen, weil die Binaries fehlen...

also, die Enum ist es nicht, du vergibst korrekte Nummern.

das einzige was mir auffällt ist, dass du das ImageGadget neu erzeugst anstatt nur das Bild zu wechseln.
das sollte zwar trotzdem funktionieren, aber korrigier das erstmal

Code: Alles auswählen

SetGadgetState( #Gadget, ImageID(1))
vielleicht hilft es ja was.

Verfasst: 13.03.2009 23:03
von ts-soft
Leider auch nicht viel, weil ist ja nicht testbar. Problem ist wohl die
Telnet() Procedure, wo ja ewig lange keine events abgearbeitet werden.

Da stirbt das Fenster. Um das zu bereinigen wäre schon eine größere Umstellung vorzunehmen.

Entweder Thread oder das ganze Netzwerkzeugs in den EventLoop sinnvoll
integrieren.

Mit Netzwerk hab ich aber leider nicht viel mit am Hut und testen geht so ja
garnicht :(

Verfasst: 13.03.2009 23:06
von Kaeru Gaman
stimmt, ein überlaufender Eventloop könnte verhindern, dass das neue Gadget korrekt eingesetzt wird.
das muss auf jeden Fall bereinigt werden.

Verfasst: 13.03.2009 23:12
von Elektrolurch
Hi
@ Kaeru Gaman

Bild

mit

Code: Alles auswählen

SetGadgetState( #Gadget, ImageID(1))
läuft es.

Code: Alles auswählen

stimmt, ein überlaufender Eventloop könnte verhindern, dass das neue Gadget korrekt eingesetzt wird. 
das muss auf jeden Fall bereinigt werden.
wie soll ich das machen ????

Bye