Seite 1 von 3

#PB_Any probleme

Verfasst: 09.02.2008 16:14
von Tsuki-Namida
hallo,
ich habe in meiner anwedung mehere fenster mit entsprechenden gadget's...
ich habe den fenstern als constande "#PB_Any" gegeben und ebenso den gadgetst

fast jedes fenster hat seine eigene schleife damit der benutzer nicht mehere übergeordnete fenster auf machen kann die nicht gebraucht werden und somit durcheinander kommt.

ich habe somit für die fenster mit eigenen schleifen auch eine procedure gemacht. dies sihet in etwar so aus(nicht genaus so!):

Code: Alles auswählen

Procedure.s Fenster(WindowID)
  Constand = OpenWindow(#PB_Any,x,y,breite,höhe,"Titel",WindowID(WindowID))
  if Constand And CreateGadgetList(WindowID(Constand))
    Button = ButtonGadget(#PB_Any,x,y,breite,höhe,"Text")
  EndIf
  Repeat
    Event = WaitWindowEvent()
    WindowID = EventWindow()
    GadgetID = EventGadget()
    EventType = EventType()
    <Code>
  Until GadgetID = Button
  CloseWindow(Constand)
  ProcedureReturn "Exit"
EndProcedure
Wenn ich jetzt mehere solche Prceduren aufrufe weil bei dem fenster zum Beispiel noch mal ein übergeordnetes fenster ist geht das nicht wirklich... ich habe so das gefühl als wäre die variabel "Constand" global auch wenn dem nicht so ist...

was habe ich da falsch gemacht???

Verfasst: 09.02.2008 16:28
von STARGÅTE
was steht denn bei <code>

vllt ist da ein fehler drin, oder du hast was vergessen

Verfasst: 09.02.2008 16:38
von Tsuki-Namida
okay hier hast du den ganzen code... wollte halt nur die übersicht behalten hier im thema....

Code: Alles auswählen

Enumeration
  #Main_Fenster
  #Neu_Projekt
EndEnumeration

Enumeration
;Main Fenster
  #Editor
  #Menue
  #Panel
  #AddOn
  #Projct
EndEnumeration

Global NewList Strings.s()
Global NewList Variabeln.s()
Global Image0

Image0 = CatchImage(0, ?Image0)

DataSection
Image0:
  IncludeBinary "IMG\dll.ico"
EndDataSection

Procedure.s GetExePath()
  Prg.s = Space(#MAX_PATH)
  GetModuleFileName_(GetModuleHandle_(0), @Prg, #MAX_PATH)
  Prg = GetPathPart(Prg)
  If (FindString(prg,"\PureBasic\Compilers\", 1))
    Prg.s = Space(#MAX_PATH)
    GetCurrentDirectory_(#MAX_PATH,@Prg)
  EndIf
If Right(Prg, 1) <> "\" : Prg + "\" : EndIf
  ProcedureReturn Prg
  teste$ = Prg.s
EndProcedure

Procedure.s Setting(Lesen$)
  If ReadFile(0,"Setting.inf")
    While Eof(0) = 0
      T$ = ReadString(0)
      If FindString(T$,Lesen$+": ",1)
        A$ = RemoveString(T$,Lesen$+": ")
        If FindString(A$,":\",1)
          CloseFile(0)
          ProcedureReturn A$
        Else
          CloseFile(0)
          ProcedureReturn GetExePath()+A$
        EndIf
      EndIf
    Wend
  Else
    MessageRequester("ERROR","Die Datei 'Setting.inf' konnte leider nicht gefunden Werden! Eine neu Installation könnte das Problem beheben.")
    End
  EndIf
EndProcedure

;{ Syntay Generator

Procedure.s String_Editor(Typ$,WindowID)
  Constand = OpenWindow(#PB_Any,0,0,200,300,"String/Variabel ("+Typ$+") Editor",#PB_Window_WindowCentered,WindowID(WindowID))
  If Constand And CreateGadgetList(WindowID(constand))
    ListView = ListViewGadget(#PB_Any,2,2,196,240)
    TextGadget(#PB_Any,2,242,196,20,"Neu Anlegen:")
    StringNeu = StringGadget(#PB_Any,2,256,166,20,"")
    ButtonNeu = ButtonGadget(#PB_Any,170,256,25,20,"Neu")
    ButtonOK = ButtonGadget(#PB_Any,99,278,97,20,"OK",#PB_Button_Default)
    ButtonAbbruch = ButtonGadget(#PB_Any,2,278,97,20,"Abbruch")
  EndIf
  If Typ$ = "!"
    ForEach Strings()
      AddGadgetItem(ListView,-1,Strings())
    Next
  ElseIf Typ$ = "&"
    ForEach Variabeln()
      AddGadgetItem(ListView,-1,Variabeln())
    Next
  EndIf
  Repeat
    Event = WaitWindowEvent()
    WindowID = EventWindow()
    GadgetID = EventGadget()
    EventType = EventType()
    
    If Event = #PB_Event_Gadget
      If GadgetID = ButtonNeu
        T$ = GetGadgetText(StringNeu)
        If Typ$ = "!"
          a = CountString(T$,"!")
          b = FindString(T$,"!",1)
          c = Len(T$)
          If FindString(T$,"!",1)
            If a = 1 And b = 1 And c > 1 And c <> 0
              ForEach Strings()
                If Strings() = T$:d=1:Break:EndIf
              Next
              If d = 1
                MessageRequester("'ERROR'","Der String kann nur einmal in der liste vorhanden sein!"):d = 0
              Else
                AddElement(Strings())
                Strings() = T$
                ClearGadgetItemList(ListView)
                ForEach Strings()
                  AddGadgetItem(ListView,-1,Strings())
                Next
              EndIf
            Else
              MessageRequester("'Syntax ERROR'","Der Angegebene !String kann in dieser form nicht verwendet werden!")
            EndIf
          ElseIf c <> 0
            T$ = "!"+T$
            ForEach Strings()
              If Strings() = T$:d=1:Break:EndIf
            Next
            If d = 1
              MessageRequester("'ERROR'","Der String kann nur einmal in der liste vorhanden sein!"):d = 0
            Else
              AddElement(Strings())
              Strings() = T$
              ClearGadgetItemList(ListView)
              ForEach Strings()
                AddGadgetItem(ListView,-1,Strings())
              Next
            EndIf
          EndIf
        ElseIf Typ$ = "&"
          a = CountString(T$,"&")
          b = FindString(T$,"&",1)
          c = Len(T$)
          If FindString(T$,"&",1)
            If a = 1 And b = 1 And c > 1 And C <> 0
              ForEach Variabeln()
                If Variabeln() = T$:d=1:Break:EndIf
              Next
              If d = 1
                MessageRequester("'ERROR'","Die Variabel kann nur einmal in der liste vorhanden sein!"):d = 0
              Else
                AddElement(Variabeln())
                Variabeln() = T$
                ClearGadgetItemList(ListView)
                ForEach Variabeln()
                  AddGadgetItem(ListView,-1,Variabeln())
                Next
              EndIf
            Else
              MessageRequester("'Syntax ERROR'","Die Angegebene &Variabel kann in dieser form nicht verwendet werden!")
            EndIf
          ElseIf c <> 0
            T$ = "&"+T$
            ForEach Variabeln()
              If Variabeln() = T$:d=1:Break:EndIf
            Next
            If d = 1
              MessageRequester("'ERROR'","Die Variabel kann nur einmal in der liste vorhanden sein!"):d = 0
            Else
              AddElement(Variabeln())
              Variabeln() = T$
              ClearGadgetItemList(ListView)
              ForEach Variabeln()
                AddGadgetItem(ListView,-1,Variabeln())
              Next
            EndIf
          EndIf
        EndIf
      ElseIf GadgetID = ButtonOK
        A$ = GetGadgetText(ListView)
        If A$ <> ""
          CloseWindow(Constand)
          ProcedureReturn A$
        Else
          If Typ$ = "!"
            MessageRequester("Fehler","Sie müssen vorerst einen !String aus der liste wählen.")
          ElseIf Typ$ = "&"
            MessageRequester("Fehler","Sie müssen vorerst eine &Variabel aus der liste wählen.")
          EndIf
        EndIf
      EndIf
    EndIf
  Until GadgetID = ButtonAbbruch
  CloseWindow(Constand)
  ProcedureReturn "Exit"
EndProcedure

;} Syntax Generator Ende

Procedure Main()
  If OpenWindow(#Main_Fenster,0,0,900,600,"Dll Maker",#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_SystemMenu)
    If CreateMenu(#Menue, WindowID(#Main_Fenster))
      MenuTitle("&Datei")
        MenuItem(1,"&Neues Projekt")
        MenuItem(2,"Ö&ffnen")
        MenuItem(3,"&Speichern")
        MenuBar()
        OpenSubMenu("&Exportieren")
          MenuItem(4,"Text &Editor")
          MenuItem(5,"Text &Datei")
        CloseSubMenu()
        OpenSubMenu("&Inportieren")
          MenuItem(6,"Text &Datei")
        CloseSubMenu()
        MenuBar()
        MenuItem(7,"&Beenden")
      MenuTitle("Bearbeiten")
        MenuItem(8,"&Neuer Befehl")
        MenuItem(9,"&Befehl Bearbeiten")
        MenuItem(10,"Befehl &Löschen")
        MenuItem(11,"Befehl &Kopieren")
        MenuItem(12,"Befehl &Einfürgen")
        MenuBar()
        MenuItem(13,"&Add On verwnden")
        MenuItem(14,"Add On &Configurieren")
      MenuTitle("&Projekt")
        MenuItem(15,"&Testen")
        MenuItem(16,"Test &Abbrechen")
        MenuBar()
        MenuItem(17,"Win. &Rechner")
        MenuItem(18,"Win. &Editor")
      MenuTitle("&Hilfe")
        MenuItem(19,"&Hilfe")
        MenuItem(20,"Ü&ber")
    EndIf
    If CreateGadgetList(WindowID(#Main_Fenster))
      ListViewGadget(#Editor,2,2,896,400)
      AddGadgetItem(#Editor,-1,"[]")
      PanelGadget(#Panel,2,404,896,174)
        AddGadgetItem(#Panel, -1, "Add On")
          ListIconGadget(#AddOn,2,2,892,170,"",892,#PB_ListIcon_GridLines)
          ChangeListIconGadgetDisplay(#AddOn, 0)
          AddGadgetItem(#AddOn,-1,"Leer",Image0)
        AddGadgetItem(#Panel, -1, "Projekt")
          ListIconGadget(#Projct,2,2,892,170,"",892,#PB_ListIcon_GridLines)
          ChangeListIconGadgetDisplay(#Projct, 0)
          AddGadgetItem(#Projct,-1,"Leer",Image0)
    EndIf
  EndIf
EndProcedure

Procedure.s NeuProjekt()
  Constand_ = OpenWindow(#PB_Any,0,0,350,100,"Neues Projekt",#PB_Window_WindowCentered,WindowID(#Main_Fenster))
    If Constand_ And CreateGadgetList(WindowID(Constand_))
    TextGadget(1,2,2,100,20,"Projekt Name:")
    ProjektName = StringGadget(#PB_Any,2,16,167,20,"Projekt")
    TextGadget(2,177,2,100,20,"Ordner Name:")
    OrdnerName = StringGadget(#PB_Any,179,16,167,20,"Projekt")
    TextGadget(0,2,39,100,20,"Projekt Verzeichnis:")
    ProjektVerzeichnis = StringGadget(#PB_Any,2,53,324,20,Setting("Projekt Verzeichnis"))
    ButtonVerzeichnis = ButtonGadget(#PB_Any,328,53,20,20,"...")
    ButtonOK = ButtonGadget(#PB_Any,278,78,70,20,"OK",#PB_Button_Default)
    ButtonAbbruch = ButtonGadget(#PB_Any,200,78,70,20,"Abbrechen")
  EndIf
  Repeat
    Event = WaitWindowEvent()
    WindowID = EventWindow()
    GadgetID = EventGadget()
    EventType = EventType()
    If Event = #PB_Event_Gadget
      If GadgetID = ButtonVerzeichnis
        
      EndIf
    EndIf
  Until GadgetID = ButtonAbbruch
  CloseWindow(Constand_)
  ProcedureReturn "Exit"
EndProcedure



Main()
Debug NeuProjekt()
Debug String_Editor("&",#Main_Fenster)
Repeat:WaitWindowEvent():ForEver

Verfasst: 09.02.2008 16:42
von STARGÅTE
jut da du mehrere Windows benutzt musst du vorher noch abfragen ob das GadgetEvent überhaupt im "eigegen" Window statt fand :

Code: Alles auswählen

    If Event = #PB_Event_Gadget And WindowID = Constand
das müsste helfen

Verfasst: 09.02.2008 16:43
von milan1612
WaitWindowEvent darf eigentlich nur einmal aufgerufen werden, mit EventWindow
kann man dann schauen welches Fenster das Event verursacht hat.
Keine Ahnung ob das dein Problem löst...

Verfasst: 09.02.2008 16:47
von Kiffi
es ist eher unüblich, für jedes Fenster eine eigene Event-Schleife zu
programmieren (das macht man nur, wenn man Fenster innerhalb von
Threads öffnet).

Ist Dir schon mal aufgefallen, warum die Gadgets in Main-Fenster nicht
gezeichnet werden, solange Du Dein NeuProjekt-Fenster geöffnet hast? Das
ist unter anderem eine negative Auswirkung, wenn man so vorgeht, wie Du
es getan hast.

Ich empfehle eine Umstellung Deines Code auf eine Event-Schleife und die
Verwendung von Fenster- und Gadget-Konstanten. Dann hast Du auch keine
Probleme mit der Ereignisabarbeitung.

Grüße ... Kiffi

Verfasst: 09.02.2008 16:50
von Tsuki-Namida
okay ich habe das jetzt so abgeändert...
nur wenn ich bei dem zuerst erscheinenden fenster ein exit gebe also den entsprechenden button reagiert es nicht gleich sofort was es aber mösste und erst nach wilden umher klicken... wenn's dann endlich reagiert schließt sich dann das fenster und das nächste fenster öffnet sich,erhält aber das nächste fenster auch gleich das exit...

ach ja ichhabe das auch hier geändert:
Until GadgetID = ButtonAbbruch And WindowID = Constand

Verfasst: 09.02.2008 20:04
von Kiffi
Magix-Soft <Kain> hat geschrieben:okay ich habe das jetzt so abgeändert...
was hast Du geändert? Kannst Du in Zukunft bitte auch das Posting zitieren,
auf was Du antwortest? :|
Magix-Soft <Kain> hat geschrieben:nur wenn ich bei dem zuerst erscheinenden fenster ein exit gebe also den entsprechenden button reagiert es nicht gleich sofort
der Nebel über meiner Glaskugel lichtet sich und dort erblicke ich:
Nur ein (Wait-)WindowEvent() verwenden!

Grüße ... Kiffi

Verfasst: 10.02.2008 00:49
von Tsuki-Namida
@Kiffi
warum ich für jedes fenster eine eigene eventschleife mache (in Proceduren)?

das mache ich eigentlich wegen der übersicht...
in diesem programmteil werden es defenitiv über 35 fenster sein die man aufrufen kann so c.a. maximal 3 übergeordnete fenster...

und wenn ich da dann nur eine schleife mache kommt man dann auch schnell durch ein ander deshalb habe ich auch nicht für die übergeordneten vensenster eine constande an gelegt... weil das bringt mir ja nichts wenn ich über 100 konstanden habe und ich nicht mehr weis welche für was ist -.-

@Thema
gibt es stat meine lösung (die in die hose gegangen ist) eine andere um die übersicht zu behalten? wo es keine probleme gibt?

Verfasst: 10.02.2008 00:59
von STARGÅTE
naja mach doch einfach EINMALIG das hier

Code: Alles auswählen

Event = WaitWindowEvent() 
WindowID = EventWindow() 
GadgetID = EventGadget() 
EventType = EventType() 
und dann nutze doch Macros:
für jedes Fenster kannst du dann die Select:Case sachen auslager aber ohne irgendwas übergeben zu müssen, da es ja mein compilieren da hin kommt wo es sein soll:

Code: Alles auswählen

If Event = #PB_Event_Gadget 
 Fenster1(1)
 Fenster2(2)
 Fenster3(3)
EndIf 

Code: Alles auswählen

Macro Fenster1(Constand)
 If WindowID = Constand 
  Select GadgetID 
   Case
   Case....
  EndSelect
 EndIf
EndMacro