Rückgabewerte von OpenWindow, CreateGadgetList und LoadFont
Verfasst: 13.06.2012 19:13
Hallo,
ich habe früher kleinere Programme in PowerBasic geschrieben und bin nun zu PureBasic gewechselt, weil mir die IDE und insbesondere die Debugging-Fähigkeiten mehr gefallen. Die Unterschiede sind aber doch erheblich größer, als ich zunächst vermutet habe. Ich habe mich trotzdem unverdrossen ans Werk gemacht und versucht, mein erstes eigenes Fenster zu programmiert.
Hierbei stieß ich auf das Phänomen, daß PureBasic bei diversen Befehlen sog. Rückgabewerte erzeugt und ich nicht so richtig weiß, wozu. Konkrete Beispiele: Die Befehle OpenWindow, LoadFont und CreateGadgetList. Zu OpenWindow heißt es in der Hilfe:
"Öffnet ein neues Fenster entsprechend den übergegebenen Parametern." Soweit alles klar und selbstverständlich. Doch weiter heißt es: "Wenn #PB_Any als '#Window' Parameter verwendet wird, dann wird die Nummer des neuen Fensters als 'Ergebnis' zurückgegeben. Ist 'Ergebnis' gleich 0, konnte das Fenster nicht geöffnet werden." Ab diesem Punkt komme ich nicht mehr mit.
Wozu muß ein OpenWindow-Befehl überhaupt einen Rückgabewert erzeugen? Ich meine, wenn der Kode zur Fenstergenerierung fehlerhaft ist, dann kriegt man das ganz bestimmt mit, auch ohne daß man hierfür '0' als Rückgabewert nötig hätte. Das Fenster öffnet dann einfach nicht und man weiß, daß man etwas falsch gemacht hat (und muß sich dann den Kode eben noch einmal ansehen). Außerdem: Die Aussagekraft dieses zurückgegebenen Wertes '0' ist doch im wahrsten Sinne des Wortes gleich Null, weil dieser Rückgabewert ja kein Fehlerkode ist, der einem verriete, woran es denn gelegen hat, daß das Fenster nicht öffnet.
Was ich zu OpenWindow ausgeführt habe, gilt ebenso für CreateGadgetList. Denn mir ist aufgefallen, daß der eigentliche Fenster-Kode, der vom Visual Designer durch "Generate Source" erzeugt wird, in zwei If-Strukturen eingebunden ist:Es ist mir völlig rätselhaft, welchem Zweck diese If-Abfragen dienen. Scheitern kann ja theoretisch jedes Beginnen auf dieser unvollkommenen Welt; wieso also nicht auch Rückgabewerte für Summen und Multiplikationen?
Nun zum Befehl FontLoad, der dem Formatum den Font "WH12G" als Standardzeichensatz für die Gadgets zu verwenden. Laut Hilfe gibt LoadFont einen "Wert ungleich Null zurück, wenn der Zeichensatz erfolgreich geladen wurde, und Null wenn nicht". Mit anderen Worten: In der globalen Variable FontID1 wird dann der Rückgabewert des Versuchs abgelegt, den Font "WH12G" zu laden; damit wäre FontID = 1, wenn der Versuch erfolgreich war, und 0 falls nicht. Aber was hat denn dieser Rückgabewert mit einer FontID zu tun? Eine unique Identifikationsnummer (was ja FontID1 doch wohl sein soll), ist doch nicht dasselbe wie ein Rückgabe-(Erfolgs-/Mißerfolgs-)Wert – schon allein deshalb nicht, weil dieser ja nur 0 und 1 zurückgeben kann, man aber doch mehr als 2 Fonts gleichzeitig laden können muß.
FontID1 wird dann in meinem Fensterkode oben zweimal verwendet: nämlich in beiden SetgadgetFont-Befehlen. Hier ist mir unklar, wieso zwei Setgadget-Befehle nötig sind. Denn der Zeichensatz ändert sich ja nicht, und ein Befehl zur Festlegung des Standard-Fonts für die Gadgets sollte doch genügen.
Vielen Dank
ich habe früher kleinere Programme in PowerBasic geschrieben und bin nun zu PureBasic gewechselt, weil mir die IDE und insbesondere die Debugging-Fähigkeiten mehr gefallen. Die Unterschiede sind aber doch erheblich größer, als ich zunächst vermutet habe. Ich habe mich trotzdem unverdrossen ans Werk gemacht und versucht, mein erstes eigenes Fenster zu programmiert.
Hierbei stieß ich auf das Phänomen, daß PureBasic bei diversen Befehlen sog. Rückgabewerte erzeugt und ich nicht so richtig weiß, wozu. Konkrete Beispiele: Die Befehle OpenWindow, LoadFont und CreateGadgetList. Zu OpenWindow heißt es in der Hilfe:
"Öffnet ein neues Fenster entsprechend den übergegebenen Parametern." Soweit alles klar und selbstverständlich. Doch weiter heißt es: "Wenn #PB_Any als '#Window' Parameter verwendet wird, dann wird die Nummer des neuen Fensters als 'Ergebnis' zurückgegeben. Ist 'Ergebnis' gleich 0, konnte das Fenster nicht geöffnet werden." Ab diesem Punkt komme ich nicht mehr mit.
Wozu muß ein OpenWindow-Befehl überhaupt einen Rückgabewert erzeugen? Ich meine, wenn der Kode zur Fenstergenerierung fehlerhaft ist, dann kriegt man das ganz bestimmt mit, auch ohne daß man hierfür '0' als Rückgabewert nötig hätte. Das Fenster öffnet dann einfach nicht und man weiß, daß man etwas falsch gemacht hat (und muß sich dann den Kode eben noch einmal ansehen). Außerdem: Die Aussagekraft dieses zurückgegebenen Wertes '0' ist doch im wahrsten Sinne des Wortes gleich Null, weil dieser Rückgabewert ja kein Fehlerkode ist, der einem verriete, woran es denn gelegen hat, daß das Fenster nicht öffnet.
Was ich zu OpenWindow ausgeführt habe, gilt ebenso für CreateGadgetList. Denn mir ist aufgefallen, daß der eigentliche Fenster-Kode, der vom Visual Designer durch "Generate Source" erzeugt wird, in zwei If-Strukturen eingebunden ist:
Code: Alles auswählen
Procedure Open_Hf()
If OpenWindow(#Hf, 460, 406, 281, 125, "Differenz", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(#Hf))
TextGadget(#Bz_Ztpkt_1, 7, 11, 71, 16, "Zeitpunkt 1:")
SetgadgetFont(#Bz_Ztpkt_1, FontID1)
StringGadget(#Tf_h1, 85, 8, 14, 22, "0", #PB_String_Numeric)
TextGadget(#Bz_h1, 102, 11, 7, 18, "h")
StringGadget(#Tf_min1, 115, 8, 21, 22, "00", #PB_String_Numeric)
TextGadget(#Bz_min1, 139, 11, 22, 18, "min")
StringGadget(#Tf_sek1, 164, 8, 21, 22, "00", #PB_String_Numeric)
TextGadget(#Bz_sek1, 187, 11, 7, 18, "s")
StringGadget(#Tf_tsek1, 198, 8, 27, 22, "000", #PB_String_Numeric)
TextGadget(#Bz_tsek1, 228, 11, 42, 18, "/1000 s")
TextGadget(#Bz_Ztpkt_2, 7, 40, 71, 16, "Zeitpunkt 2:")
SetgadgetFont(#Bz_Ztpkt_2, FontID1)
StringGadget(#Tf_h2, 85, 37, 14, 22, "0", #PB_String_Numeric)
TextGadget(#Bz_h2, 102, 40, 7, 18, "h")
StringGadget(#Tf_min2, 115, 37, 21, 22, "00", #PB_String_Numeric)
TextGadget(#Bz_min2, 139, 40, 22, 18, "min")
StringGadget(#Tf_sek2, 164, 37, 21, 22, "00", #PB_String_Numeric)
TextGadget(#Bz_sek2, 187, 40, 7, 18, "s")
StringGadget(#Tf_tsek2, 198, 37, 27, 22, "000", #PB_String_Numeric)
TextGadget(#Bz_tsek2, 228, 40, 42, 18, "/1000 s")
Frame3DGadget(#Ra_Erg, 10, 65, 149, 49, "Ergebnis")
TextGadget(#Bz_Erg, 49, 87, 68, 16, "0,000 s", #PB_Text_Center)
ButtonGadget(#Sf_Berechne, 172, 73, 98, 40, "Berechnen")
EndIf
EndIf
EndProcedure
Nun zum Befehl FontLoad, der dem Format
folgt. Der Visual Designer erstellt vor der Fensterprozedur eine ZeileErgebnis = LoadFont(#Font, Name$, Höhe [, Flags])
Code: Alles auswählen
Global FontID1
FontID1 = LoadFont(1, "WH12G", 8)
FontID1 wird dann in meinem Fensterkode oben zweimal verwendet: nämlich in beiden SetgadgetFont-Befehlen. Hier ist mir unklar, wieso zwei Setgadget-Befehle nötig sind. Denn der Zeichensatz ändert sich ja nicht, und ein Befehl zur Festlegung des Standard-Fonts für die Gadgets sollte doch genügen.
Vielen Dank