Wie programmiert ihr eigentlich eure Fensterapplikationen?
Wie programmiert ihr eigentlich eure Fensterapplikationen?
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
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
Repeat
PureBasic
ForEver
PureBasic
ForEver
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)
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)
>>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
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

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:
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!
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
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!

- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
>> es geht mit enums für jedes fenster einzeln
geht nicht
geht nicht
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Richtig.ts-soft hat geschrieben:>> es geht mit enums für jedes fenster einzeln
geht nicht
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'.
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
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
])
Eventschleife
Ich verwende selten mehrere Fenster,
höchstens wenn kurz Benutzereingaben verlangt werden.
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

Eventschleife
Ich verwende selten mehrere Fenster,
höchstens wenn kurz Benutzereingaben verlangt werden.
- vonTurnundTaxis
- Beiträge: 2130
- Registriert: 06.10.2004 20:38
- Wohnort: Bayreuth
- Kontaktdaten:
Re: Wie programmiert ihr eigentlich eure Fensterapplikatione
> Ich würde gerne mal wissen, wie ihr vorgeht, wenn ihr Programme unter Windows
Gar nicht; die schreibe ich unter Linux
So funktioniert das bei mir ganz gut:
Gar nicht; die schreibe ich unter Linux

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
Ich mach's bei meinem derzeitigen Projekt so:
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)
- 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
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)
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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"
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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.