Grafiken Invertieren
 Info  
Von : Wolfgang Kluge
 Zusatz  
Printfreundliche Ansicht
Oje,...Da will man sich mal mit VB etwas an Grafiken heranwagen (was ja Eigentlich nicht das richtige System dafür ist) und findet Reichlich Hilfe und Funktionen (wenn letzeres auch öfter in API´s).

Und dann stellt man fest, daß man einen Wert, den man zuvor noch Lustiger-, oder Sinnvollerweiße in einen Long-Wert vie RGB()-Funktion umgewandelt hat nicht wieder zurückbekommt, was man eigentlich reingeschrieben hat...

So ging es zumindest mir, bei meinen ersten Gehversuchen was Grafik in VB anbelangt.
Nun denn,....so schwer ist das gar nicht. Und wenn mans weiß ist es sogar richtig Einleuchtend ;)
Naja, eben erst nachdem...

 Methode:
Sub A_RGB (ByVal Farbe As Long, R As Integer, G As Integer, B As Integer)
  ' Farbwerte umwandeln
  R = Farbe And &HFF
  G = Farbe \ &H100 And &HFF
  B = Farbe \ &H10000 And &HFF
End Sub


Aufgerufen wird das ganze so:
' Aufruf der umgedrehten RGB-Funktion
Dim r As Integer, g As Integer, b As Integer
A_RGB Label1.Background, r, g, b
' Nun hat man in den 3 Variablen die Werte des RGB-Farbwertes


Zur Information:
Das Schlüsselwort ByVal, der den Parametern der Funktion vorsteht bewirkt, dass ein Wert Als Wert übergeben wird. Standard(unter VB.net ists andersrum) ist ByRef. ByRef übergibt eine Referenz, und nicht den Wert(so was ähnliches wie ein Pointer unter C).

Variablen, die als Wert übergeben werden legen im Speicher eine Kopie des Wertes an. Wenn dieser Wert in einer Funktion dann geändert wird, passiert beim Aufrufer gar nichts. (Wenn man in diesem Fall der Variablen Farbe einen anderen Wert geben würde, würde dies ausserhalb der Methode nicht bekannt werden)
Als Referenz übergebene Werte dagegen werden direkt an der Stelle im Speicher bearbeitet. So ist eine Änderung auch ausserhalb der Funktion sichtbar.

Die Krux an der Sache ist, dass ByVal-Parameter schneller übergeben werden können (wer das letzte aus seiner Anwendung rausziehen will, der sollte wenn möglich alle Parameter ByVal übergeben.
Ich hab dabei noch nicht verstanden, warum dies so ist (weil ja erst eine Kopie angelegt werden muß), aber es ist anscheinend so(deswegen wurde ByVal in VB.net auch zum Standard).