Seite 2 von 42
Verfasst: 16.04.2006 20:34
von freedimension
ullmann hat geschrieben:
Bsp.
Meine Farbtiefe ist auf 16 Bit eingestellt.
In der Farbtabelle in der Hilfe ist $FFFFCC ein hellgelber Farbton.
Box(100,100,50,50,$FFFFCC) liefert jedoch eine hellblaue Box.
Damit sind die Farben in der Hilfe unbrauchbar.
Box(100,100,50,50,RGB($FF,$FF,$CC)) liefert die hellgelbe Box.
Es könnte also sein, dass die Farben in der Hilfe richtig sind, so dass der oben genannte Fehler ein Compiler-Fehler ist.
Nun, wenn du 16Bit Farbtiefe hast, aber deine Farbe als 24Bit übergibst sollte dich das Ergebnis doch nicht allzu sehr überraschen, oder? Sind ja schließlich 8 Bit zu viel

Für diesen Fall gibt es ja auch, wie du ja auch schon bemerkt hast, die Funktion RGB welche unter jeder Farbtiefe einen halbwegs passenden Farbwert zurückgibt.
Verfasst: 16.04.2006 21:18
von Helle
Der aus der Farbtabelle entnommene Wert kann nicht einfach als unveränderter Gesamt-Zahlenwert verwendet werden! Die 3 Einzelwerte RGB müssen folgendermassen zu einem Gesamtwert berechnet werden:
Gesamt = R*1+G*256+B*65536
Dann stimmen auch die Farben wieder!
@Andre: Im Beispiel für Box ist auch WindowOutput ohne Parameter!
Vielleicht wäre ein Hinweis auf die Umrechnung in der Farbtabelle auch nicht schlecht.
Gruss
Helle
P.S.: Wenn die Hex-Werte schon bekannt sind braucht man sie nur in der Reihenfolge BGR anzugeben (also aus FFFFCC wird CCFFFF) und alles ist auch wieder im Lot.
Verfasst: 16.04.2006 22:27
von ullmann
@freedimension
Ich habe die Farbtiefe mal auf 32 bit umgestellt. Der "Fehler", besser der Effekt ist gleich: die hellblaue Box. Es liegt also nicht an der Farbtiefe.
@helle, @André
Die Umrechnung ist die Ursache, da finde ich es auch besser, wenn die Werte in der Farbtabelle gleich verwendbar geschrieben wären, also als BGR (im o.g. Bsp. CCFFFF) oder wenn wenigstens für die Umrechnung ein Hinweis und ein Beispiel in die Hilfe aufgenommen wird.
Gruß Rainer
Verfasst: 16.04.2006 22:38
von In_Go
Hallo André
Ich habe mir mal die Mühe gemacht und alle möglichen Fälle der VariablenÜbergabe durch Zeiger zusammengestellt, und würde mich freuen wenn solches in die Dokumentation übernommen wird:
Code: Alles auswählen
;Beispiel für Syntax Variablenübergabe ByReference
; Art Declaration Aufruf Procedurekopf
;Array 1 Dimension Name(x(1)) Name(y(1)) Name(z(1))
;Array 2 Dimensionen Name(x(2)) Name(y(2)) Name(z(2))
;Structurvariable Name(*x.struc) Name(*y.struc) Name(*z.struc)
;Array Strukturvariable 1 Dimension Name(x.struc(1)) Name(y.struc(1)) Name(z.struc(1))
;Array Strukturvariable 2 Dimension Name(x.struc(2)) Name(y.struc(2)) Name(z.struc(2))
;Liste Name(x()) Name(y()) Name(z())
;Structure Liste Name(x.struc()) Name(y()) Name(z.struc())
Dim EindimensionalArray.l(4) : EindimensionalArray.l(2)=2 : EindimensionalArray.l(3) = 3
Declare TauscheEindimensionalArray(a.l(1)) :TauscheEindimensionalArray(EindimensionalArray.l())
Debug "EindimensionalesArray Sollte 3,2 sein: "+Str(EindimensionalArray.l(2))+","+Str(EindimensionalArray.l(3))
Procedure TauscheEindimensionalArray(eindim.l(1))
eindim.l(3)=2:eindim.l(2)=3
EndProcedure
Dim ZweidimensionalArray.l(4,4) : ZweidimensionalArray.l(2,2)=2 : ZweidimensionalArray.l(3,3) = 3
Declare TauscheZweidimensionalArray(a.l(2)) :TauscheZweidimensionalArray(ZweidimensionalArray.l())
Debug "ZweidimensionalesArray Sollte 3,2 sein: "+Str(ZweidimensionalArray.l(2,2))+","+Str(ZweidimensionalArray.l(3,3))
Procedure TauscheZweidimensionalArray(zweidim.l(2))
zweidim.l(3,3)=2:zweidim.l(2,2)=3
EndProcedure
Structure mein
zwei.l
drei.l
EndStructure
StrVar.mein
StrVar.mein\zwei =2 :StrVar.mein\drei=3
Declare TauscheStrukturVariable(*sv.mein) : TauscheStrukturVariable(StrVar.mein)
Debug "StruktureVariable Sollte 3,2 sein: "+Str(StrVar.mein\zwei)+","+Str(StrVar.mein\drei)
Procedure TauscheStrukturvariable(*st.mein)
*st.mein\drei =2 :*st.mein\zwei= 3
EndProcedure
Dim StrVarArray.mein(4)
StrVarArray.mein(2)\zwei =2 :StrVarArray.mein(3)\drei=3
Declare TauscheStrukturVariableArray(sv.mein(1))
TauscheStrukturVariableArray(StrVarArray())
Debug "StruktureVariableArray Sollte 3,2 sein: "+Str(StrVarArray.mein(2)\zwei)+","+Str(StrVarArray.mein(3)\drei)
Procedure TauscheStrukturvariableArray(star.mein(1))
star.mein(3)\drei =2 :star.mein(2)\zwei= 3
EndProcedure
Dim StrVarArrayZwei.mein(4,4)
StrVarArrayZwei.mein(2,2)\zwei =2 :StrVarArrayZwei.mein(3,3)\drei=3
Declare TauscheStrukturVariableArrayZwei(svz.mein(2))
TauscheStrukturVariableArrayZwei(StrVarArrayZwei())
Debug "StruktureVariableArrayZweidimensinal Sollte 3,2 sein: "+Str(StrVarArrayZwei.mein(2,2)\zwei)+","+Str(StrVarArrayZwei.mein(3,3)\drei)
Procedure TauscheStrukturvariableArrayZwei(starZ.mein(2))
starZ.mein(3,3)\drei =2 :starZ.mein(2,2)\zwei= 3
EndProcedure
NewList Liste.l()
AddElement(liste()) :AddElement(liste()):AddElement(liste()):AddElement(liste())
SelectElement(Liste(),2):liste()=2
SelectElement(Liste(),3):liste()=3
Declare TauscheLinkedListElement(lister()) :TauscheLinkedListElement(liste())
SelectElement(Liste(),2): zwei= Liste() :SelectElement(Liste(),3):drei=liste()
Debug "LinkedList Sollte 3,2 sein: "+Str(zwei)+","+Str(drei)
Procedure TauscheLinkedListElement(meinLL())
SelectElement(meinLL(),2) :meinLL()=3
SelectElement(meinLL(),3) :meinLL()=2
EndProcedure
NewList StrukturListe.mein()
AddElement(StrukturListe()) :AddElement(StrukturListe()):AddElement(StrukturListe()) :AddElement(StrukturListe())
SelectElement(StrukturListe(),2):StrukturListe()\zwei=2
SelectElement(StrukturListe(),3):StrukturListe()\drei=3
Declare TauscheStrukturLinkedListElement(listeR.mein())
TauscheStrukturLinkedListElement(StrukturListe())
SelectElement(StrukturListe(),2) : zwei= StrukturListe()\zwei
SelectElement(StrukturListe(),3) : drei= StrukturListe()\drei
Debug "Structure LinkedList Sollte 3,2 sein: "+Str(zwei)+","+Str(drei)
Procedure TauscheStrukturLinkedListElement(meinLL.mein())
SelectElement(meinLL(),2) :meinLL()\zwei=3
SelectElement(meinLL(),3) :meinLL()\drei=2
EndProcedure
;
Verfasst: 16.04.2006 23:06
von Kaeru Gaman
@ullmann
daß der Rot-kanal im Win-standard der less-significant ist, sollte bekannt sein.
wenn man nicht weiß, daß der 24bit farbwert so berechnet wird, wie hier von Helle beschrieben,
sollte eben die RGB-funktion benutzen.
mit 16bit ist das nochmal ein anderer schnack, jedenfalls im screen,
siehe hierzu den exkurs von mir im Tutorial bereich des boards...
Verfasst: 17.04.2006 13:30
von ullmann
@Kaeru Gaman
Aber in der Hilfe steht über der Farbtabelle, dass man die Hex-Werte so wie sie sind direkt verwenden kann. Und das ist nicht korrekt. Man muss sie als RGB-Werte betrachten und "umdrehen". Für den Sinn dieser Tabelle, für eine Farbe schnell einen fertigen Hex-Wert zu haben, wäre es besser, wenn direkt verwendbare Hex-Werte unter den Farben stehen würden.
Gruß Rainer
Verfasst: 17.04.2006 16:27
von nco2k
@Andre
es wäre sehr schick, wenn bei allen befehlen stehen würde, welcher typ als ergebnis zurückgeliefert wird. (byte, long, quad...)
c ya,
nco2k
Verfasst: 17.04.2006 16:53
von uweb
Einen habe ich noch :
So wie für menu ein Querverweis in Window und Gadgets sein sollte fehlen meiner Meinung nach noch die entsprechenden Links für
- SortArray
- SortList
- SortStructuredArray
- SortStructuredList
Verfasst: 20.04.2006 15:39
von Helle
Punkt: Inline x86 ASM
Im 1.Beispiel
muss bei l_mylabel alles kleingeschrieben werden!
Weshalb als Sprungmarken-Beispiel kein Sprung oder Call sondern ein MOV verwendet wird ist auch schwer nachzuvollziehen.
Im 3.Beispiel
Code: Alles auswählen
Procedure Test(*Pointer, Variable)
! MOV dword [p.p_Pointer], 20
! MOV dword [p.v_Variable], 30
Debug *Pointer
Debug Variable
EndProcedure
Test(0, 0)
sollte die Prozedur nicht Test heissen. Funktioniert zwar bei ausgeschaltetem Inline-ASM, aber ASM-Befehle sollte man generell als verwendete Namen meiden.
Gruss
Helle
Beinahe vergessen:
Code: Alles auswählen
- Die verwendbaren Register sind: eax, edx und ecx. Alle anderen müssen immer reserviert bleiben.
Das suggeriert einem "Frischling", er kann nur diese 3 Register benutzen und die anderen sind tabu. Natürlich kann man auch mit ebp, ebx, edi und esi arbeiten! Die o.g. Aussage finde ich nicht sehr glücklich formuliert. Diese 3 Register sind zwar die, die bei PB-Funktions-Aufrufen (meist) verändert werden, aber für deren Sicherung hat der Progger selbst zu sorgen (wird er dann schon merken...

). Dies hat doch aber nichts mit den anderen Registern zu tun!
Verfasst: 20.04.2006 21:08
von Sven
MDIGadget()
Beim Verwenden von AddGadgetItem() mit diesem Gadget wird dabei ein neues PB Fenster erstellt. Alle Befehle der Window Library können zusammen mit diesem neuen Fenster verwendet werden (mit Ausnahme von StickyWindow()).
Das stimmt so nicht. GetActiveWindow() gibt nicht das aktive Child-Window, sondern das Hauptfenster zurück, zum Abfragen des aktiven Childs muß GetGadgetState() verwendet werden (wie es weiter unten steht), SetActiveWindow() wird ähnlich sein (hab ich nicht probiert).
Ist zwar funktionsbedingt sicher richtig, aber verwirrt, wenn alle anderen Child-Ereignisse als Windows-Ereignisse behandelt werden. Sollte also noch ein Hinweis darauf hin, vielleicht derart: (mit Ausnahme von GetActiveWindow(), SetActiveWindow() und StickyWindow())
Sven