Seite 1 von 2

Wie programmiert ihr eigentlich eure Fensterapplikationen?

Verfasst: 05.01.2007 21:50
von Darie
Hallo Leute !!!

Ich würde gerne mal wissen, wie ihr vorgeht, wenn ihr Programme unter Windows schreibt. Na ganz normal wahrscheinlich, dumme Frage, oder?

Erstmal ein Hauptfenster öffnen und ne EventSchleife machen.......
(Okay, das mache ich auch immer und zwar in einer Procedure
Hauptfenster_zeichnen, oder so ähnlich, aber was dann......)
Ich würde halt gerne wissen, ob es nicht von Vorteil ist, alle für das Programm benötigte Fenster , die ganzen Gadgets zu erstellen und zum Schluss alle Fenster, die beim Programmstart erstmal nicht erscheinen, unsichtbar zu machen und falls dann benötigt wieder sichtbar zu machen.
(Das könnte man dann ja in einer riesen Prozedur machen, dann sind die eigentlichen Prozeduren viel übersichtlicher)
Oder lasst ihr jedes Fenster mit seinen Gadgets neu zeichnen, wenn das entsprechende Fenster geöffnet werden soll ?
Und wie sieht es mit der Eventschleife aus ? Gilt die "Haupt"-Event-Schleife auch für alle neu geöffneten Fenster, oder habt ihr dort eine eigene Eventschleife ?
Und was noch wichtig ist : Mit der Enumeration kann man ja ganz praktisch alle Gadgets eintragen und welche hinzufügen, aber mich nervt, dass ich bei den vielen Gadgets den Überblick verliere und nichtmehr genau weiss, welche Konstante zu welchem Knopf gehört. Und sich tausend Namenserweiterungen auszudenken, um alle Gadgets zu unterscheiden ist auch blöd. Könnte man nicht mehrere Enumarationen für bestimmte Fenster, Gadgetlists oder Container einführen. Quasi getrenntes Enumerieren, in denen sich Konstantenbezeichnungen für triviale Gadgets wiederholen dürfen?

Darie

Verfasst: 05.01.2007 21:56
von a14xerus
konstanten haben immer eine feste zahl zugewiesen, udn wenn zwei gadget die gleiche zahl haben würden, dann -.-' ^^
die mainloop, also die events gelten imemr für alle fenster eines programms, es gibt nur eine loop in einem programm
ich erstelle immer alle fenster beim programmstart und hide sie alle
programme im allgemeinen bestehen bei mir nur aus proceduren (also kaum freistehender code)

Verfasst: 05.01.2007 22:04
von edel
>>Wie programmiert ihr eigentlich eure Fensterapplikationen?

Wenn etwas groesseres ansteht mit ResEd (www.radasm.com) und WinApi.
Einzig fuer ein Treeview muss ich auf PB zurueckgreifen, da war ich bis her
zu faul :mrgreen:

Verfasst: 05.01.2007 22:44
von DarkSoul
Die konstanten sollten zuerst ordentliche namen haben.
bei mir sehen die immer so aus, wie die hier:

#MainTrImagelist
#MainBuOptions
#OptWinBuOK

Fenster erstelle ich immer erst einmal das hauptfenster (im unsichtbaren, bis es fertig ist und mache es dann sichtbar, so dass der aufbau-flackereffekt vermieden wird)

Dann bemühe ich mich, WaitWindowEvent() zu verwenden. wenn nicht, nehme ich WindowEvent() und verwende einen Delay()-befehl als prozessorbegrenzung.

die übrigen Fenster mache ich nicht im hintergrund, sondern mache für jedes Fenster eine eigene Event-schleife, die ich mit einer Schaltvariable zuschalte, wenn ich das fenster öffne:

Code: Alles auswählen

  event=windowevent
  if mainwindowisopen
    usewindow(windowid)
    if event
       ;blablabla
    endif
  endif
und dann numeriere ich die gadgets so, dass jede nummer einmalig ist, auch fensterübergreifend, sonst ist mir die fehlergefahr zu groß!

es geht mit enums für jedes fenster einzeln, dann jedoch musst du mit eventwindowid() arbeiten und das kann noch chaotischer werden, wenn du irgendwas von einem fenster ins andere packen willst!

Verfasst: 05.01.2007 22:56
von ts-soft
>> es geht mit enums für jedes fenster einzeln
geht nicht

Verfasst: 05.01.2007 23:01
von AND51
ts-soft hat geschrieben:>> es geht mit enums für jedes fenster einzeln
geht nicht
Richtig.
CreateGadgetList() hat geschrieben:Hinweis: Es gibt in PureBasic keine getrennte Verwaltung der Gadgetlisten für jedes geöffnete Fenster. Verwenden Sie deshalb auch bei mehreren Fenstern fortlaufend durchnummerierte 'GadgetID's. Oder verwenden Sie die neue #PB_Any Konstante als 'GadgetID'.

Verfasst: 05.01.2007 23:30
von Macros
Ich mache es so:
Fenster erstellen
Gadgetlist erstellen
eventuelles laden von Informationen
Erstellen der Gadgets
(Positionierung per Hand und Kopfrechnen,
ID mit nummern geordnet, ja nach art und Position in einem Berreich,
keine Konstanten. [ Ich weis ich bin ein freak :D ])
Eventschleife

Ich verwende selten mehrere Fenster,
höchstens wenn kurz Benutzereingaben verlangt werden.

Re: Wie programmiert ihr eigentlich eure Fensterapplikatione

Verfasst: 06.01.2007 00:14
von vonTurnundTaxis
> Ich würde gerne mal wissen, wie ihr vorgeht, wenn ihr Programme unter Windows
Gar nicht; die schreibe ich unter Linux :wink:

So funktioniert das bei mir ganz gut:

Code: Alles auswählen

;Pseudocode

Enumeration
  ;Fenster
EndEnumeration

Enumeration
  ;Gadgets
EndEnumeration


Procedure EventHandler()
Select WaitWindowEvent()
   Case ...
   Case #PB_Event_CloseWindow
      Procedure Return #PB_Event_CloseWindow
EndSelect
EndProcedure

Procedure Fenster1(Eventuelles Parameter)
  OpenWindow()
  CreateGadgetList()
  ;Gadgets
  Repeat
  Until EventHandler() = #PB_Event_CloseWindow
EndProcedure


Verfasst: 06.01.2007 09:30
von Marvin
Ich mach's bei meinem derzeitigen Projekt so:
  • Konstanten & Strukturen initialisieren
    Globale Variablen, Arrays und Listen initialisieren
    Dringend benötigte Sachen für den Splashscreen laden
    Splashscreen anzeigen
    DLLs laden & DirectX initialisieren
    Bilder laden
    Hauptfenster öffnen & Unsichtbar machen
    Gadgets im unsichtbaren Fenster erstellen
    Gadget-Inhalte aktualisieren & Informationen sammeln
    Initialisierung von nicht Global-Definierten Variablen & Starten von Threads
    Überprüfung der ProgramParameter
    Splashscreen schließen und Hauptfenster anzeigen
    Hauptschleife
Für die Gadgetbezeichnung benutze ich immer -1, also #PB_Any und die Variablen haben dann folgende Form:
gdt_111_222_333_444
111: Typ des Gadgets (z.B. lst für ListIconGadget)
222: Rubrik (Stelle im PanelGadget, z.B. pck für Packen)
333: Unterrubrik (z.B. zip)
444: evtl. nochmalige Bezeichnung (z.B. shw für show, also Anzeige von Dingen)

Verfasst: 06.01.2007 10:01
von Kaeru Gaman
imho. muss man gar nicht alle fenster zu beginn erzeugen.
es genügt völlig, sie dann zu erzeugen, wenn sie gebraucht werden.

...kleines beispiel, dass ich mal geschrieben hatte zum thema "mehrere fenster - ein event-loop"

Code: Alles auswählen

;********************************************************* 
;*** MoreWindows.pb 
;*** 
;*** Example for use of EventWindow() 
;*** to handle multiple Windows 
;*** without child/parent 
;*** 
;*** Dec.22, 2006  Kaeru Gaman 
;*** 
;*** PB Ver 4.02 Win 
;********************************************************* 
EnableExplicit 
;************************************* 
Enumeration     ;Windows 
  #Win_Main 
  #Win_Sub1 
  #Win_Sub2 
  #Win_Sub3 
  #Win_Sub4 
EndEnumeration 
;************************************* 
Enumeration     ;Gadgets 
  #Main_But_LaunchSub1 
  #Main_But_LaunchSub2 
  #Main_But_LaunchSub3 
  #Main_Txt_Display 
  #Sub1_But_TestBeep  
  #Sub2_But_TestBeep  
  #Sub3_But_LaunchSub4 
  #Sub4_Opt_Text1 
  #Sub4_Opt_Text2 
  #Sub4_Opt_Text3 
EndEnumeration 
;************************************* 
 Procedure OpenSub1() 
  OpenWindow(#Win_Sub1, -1, -1, 200,150,"Sub1",#PB_Window_ScreenCentered | #PB_Window_SystemMenu ) 
    CreateGadgetList(WindowID(1)) 
      ButtonGadget(#Sub1_But_TestBeep,10,10,60,20,"Beep Deep") 
 EndProcedure 
;************************************* 
 Procedure OpenSub2() 
  OpenWindow(#Win_Sub2, -1, -1, 200,150,"Sub2",#PB_Window_ScreenCentered | #PB_Window_SystemMenu ) 
    CreateGadgetList(WindowID(2)) 
      ButtonGadget(#Sub2_But_TestBeep,10,10,60,20,"Beep High") 
 EndProcedure 
;************************************* 
 Procedure OpenSub3() 
  OpenWindow(#Win_Sub3, -1, -1, 200,150,"Sub3",#PB_Window_ScreenCentered | #PB_Window_SystemMenu ) 
    CreateGadgetList(WindowID(3)) 
    ButtonGadget(#Sub3_But_LaunchSub4, 70,110,120,30,"Launch Sub4") 
 EndProcedure 
;************************************* 
 Procedure OpenSub4() 
  OpenWindow(#Win_Sub4, -1, -1, 200,150,"Sub4",#PB_Window_ScreenCentered | #PB_Window_SystemMenu ) 
    CreateGadgetList(WindowID(4)) 
      OptionGadget(#Sub4_Opt_Text1,20,20,160,20,"Beef") 
      OptionGadget(#Sub4_Opt_Text2,20,50,160,20,"Lamb") 
      OptionGadget(#Sub4_Opt_Text3,20,80,160,20,"Fish") 
 EndProcedure 
;************************************* 
OpenWindow(#Win_Main,0,0,320,240,"Main", #PB_Window_ScreenCentered | #PB_Window_SystemMenu ) 
  CreateGadgetList(WindowID(0)) 
    ButtonGadget(#Main_But_LaunchSub1,190,120,120,30,"Launch Sub1") 
    ButtonGadget(#Main_But_LaunchSub2,190,160,120,30,"Launch Sub2") 
    ButtonGadget(#Main_But_LaunchSub3,190,200,120,30,"Launch Sub3") 
    TextGadget(#Main_Txt_Display,10,10,160,20, "No Choice yet", #PB_Text_Border) 
;************************************* 
Define Event.l 
Define EXIT.l 
Define DisplayTxt$ = "Your Choice is " 
;************************************* 
Repeat 
  Event = WaitWindowEvent() 
  Select EventWindow() 
;********************************************************* 
;*** Main Window 
;********************************************************* 
    Case   #Win_Main 
      Select Event 
        Case #PB_Event_Gadget 
    ;************************************* 
    ;** Gadget Events 
          Select EventGadget() 
            Case #Main_But_LaunchSub1 
              OpenSub1() 
            Case #Main_But_LaunchSub2 
              OpenSub2() 
            Case #Main_But_LaunchSub3 
              OpenSub3() 
          EndSelect 
    ;************************************* 
    ;** Other Events 
        Case #PB_Event_CloseWindow 
          EXIT = 1 
      EndSelect 
;********************************************************* 
;*** Sub Window 1 
;********************************************************* 
    Case #Win_Sub1 
      Select Event 
        Case #PB_Event_Gadget 
    ;************************************* 
    ;** Gadget Events 
          Select EventGadget() 
            Case #Sub1_But_TestBeep 
              Beep_( 500,300) 
          EndSelect 
    ;************************************* 
    ;** Other Events 
        Case #PB_Event_CloseWindow 
          CloseWindow(#Win_Sub1) 
      EndSelect 
;********************************************************* 
;*** Sub Window 2 
;********************************************************* 
    Case #Win_Sub2 
      Select Event 
        Case #PB_Event_Gadget 
    ;************************************* 
    ;** Gadget Events 
          Select EventGadget() 
            Case #Sub2_But_TestBeep 
              Beep_(1500,300) 
          EndSelect 
    ;************************************* 
    ;** Other Events 
        Case #PB_Event_CloseWindow 
          CloseWindow(#Win_Sub2) 
      EndSelect 
;********************************************************* 
;*** Sub Window 3 
;********************************************************* 
    Case #Win_Sub3 
      Select Event 
        Case #PB_Event_Gadget 
    ;************************************* 
    ;** Gadget Events 
          Select EventGadget() 
            Case #Sub3_But_LaunchSub4 
              OpenSub4() 
          EndSelect 
    ;************************************* 
    ;** Other Events 
        Case #PB_Event_CloseWindow 
          CloseWindow(#Win_Sub3) 
      EndSelect 
;********************************************************* 
;*** Sub Window 4 
;********************************************************* 
    Case #Win_Sub4 
      Select Event 
        Case #PB_Event_Gadget 
    ;************************************* 
    ;** Gadget Events 
          Select EventGadget() 
            Case #Sub4_Opt_Text1 
              SetGadgetText(#Main_Txt_Display, DisplayTxt$ + "Beef") 
            Case #Sub4_Opt_Text2 
              SetGadgetText(#Main_Txt_Display, DisplayTxt$ + "Lamb") 
            Case #Sub4_Opt_Text3 
              SetGadgetText(#Main_Txt_Display, DisplayTxt$ + "Fish") 
          EndSelect 
    ;************************************* 
    ;** Other Events 
        Case #PB_Event_CloseWindow 
          CloseWindow(#Win_Sub4) 
      EndSelect 
;********************************************************* 
;*** End of Window List 
;********************************************************* 
  EndSelect 
Until EXIT = 1 
End