|
|
|
|
|
Sicher kennen Sie die "uralten" Basic-Methoden zum
Zeichnen von Linien, Rechtecken, Ellipsen und Punkten: Line, Circle
und PSet. Mit diesen Methoden und deren für das heutige Visual
Basic recht befremdlich wirkenden Syntax können Sie jedoch nach wie
vor in Forms, PictureBoxen, UserControls, PropertyPages und
UserDocumenten "herummalen".
Allerdings scheinen sich diese Methoden einer
"vernünftigen" programmgesteuerten Handhabung zu
entziehen. Vor allem die optionalen Steps-Schlüsselwörter vor den
in Klammern gesetzten Koordinaten-Angaben, aber auch die Kennungen
B und BF für ein Rechteck bzw. ein gefülltes
Rechteck bei der Line-Methode können Sie nicht per Code über
Variablen kontrollieren. Da zudem bei einem UserControl diese
Methoden nicht öffentlich sind, und für den Fall, dass Sie eine
Komponente schreiben möchten, die solche Zeichen-Methoden zur
Verfügung stellt, bietet es sich an, die Syntax aus der
Basic-Steinzeit auf "moderne" Weise umzuformulieren:
Public Enum StepsConstants
cpsAbsolute
cpsSteps
End Enum
Public Enum LineBoxConstants
lbLine
lbBox
lbBoxFilled
End Enum
Public Sub DrawCircle( _
Optional ByVal Steps As StepsConstants, _
Optional ByVal X As Single, Optional ByVal Y As Single, _
Optional ByVal Radius As Single, _
Optional ByVal Color As Long = -1, _
Optional ByVal RStart As Single, Optional ByVal REnd As Single, _
Optional ByVal Aspect As Single)
Public Sub DrawLine(Optional ByVal Steps1 As StepsConstants, _
Optional ByVal X1 As Single, _
Optional ByVal Y1 As Single, _
Optional ByVal Steps2 As StepsConstants, _
Optional ByVal X2 As Single, Optional ByVal Y2 As Single, _
Optional ByVal Color As OLE_COLOR = -1, _
Optional ByVal Box As LineBoxConstants)
Public Sub DrawPoint(Optional ByVal Steps As StepsConstants, _
Optional ByVal X As Single, Optional ByVal Y As Single, _
Optional ByVal Color As OLE_COLOR = -1)
Soweit bereitet dies keine Schwierigkeiten - die Parameter und
deren Reihung sieht einigermaßen vertraut aus. Und da sie alle
optional sind, können Sie sich wohl auch vorstellen, dass alle
bisher gewohnten Kombinationen damit möglich sind. Lediglich eine
kleine Inkonsequenz in Visual Basic zwingt uns dazu, die
Methoden-Namen zu ändern. Bei der Line-Methode wäre es zwar nicht
notwendig - "Line" als Methoden-Name würde von VB
akzeptiert. Wahrscheinlich wurde dafür schon wegen des
Line-Steuerelements gesorgt, während man die Freigabe der
Schlüsselwörter "Circle" und "PSet" für
überflüssig gehalten hat. Die Methoden lauten also DrawCircle,
DrawPoint und der Einheitlichkeit halber eben DrawLine. Natürlich
können Sie die Methoden auch anders taufen, ganz nach Ihrem
Geschmack... Außerdem ist es selbstverständlich nicht möglich
einen Parameter "End" zu nennen, wie es bei der
Circle-Methode angefallen wäre, um den Bezeichnungen der alten
Parameter in der Dokumentation zu entsprechen. Der End-Parameter
wird somit "REnd" genannt, und analog dazu der
Start-Parameter "RStart", da wir es hier mit
Radians-Werten zu tun haben.
Innerhalb der Prozeduren zu diesen Methoden könnten Sie jetzt in
diversen If...Then- oder Select...Case-Verzweigungen
die Parameter-Kombinationen auswerten und je nach dem Code-Zeilen in
der alten Syntax schreiben. Aber das wird eine ziemlich vertrackte
Angelegenheit - ich habe das vor etlichen Jahren schon einmal
durchgespielt und schon längst dem großen Code-Mülleimer
überantwortet. Denn immerhin haben sich die VB-Fortentwickler doch
bemüht, die alten Zeichen-Methoden auf die heutige Prozedur- und
damit COM-Basis zu stellen. Doch ist das erstens nirgendwo
kommentiert - Sie werden nur in den Kurzbeschreibungen der Methoden
im Objekt-Katalog über die ungewohnt aussehenden Deklarationen
stolpern.
Sub Circle(Step As Integer, X As Single, Y As Single, _
Radius As Single, Color As Long, Start As Single, End As Single, _
Aspect As Single)
Sub Line(Flags As Integer, X1 As Single, Y1 As Single, _
X2 As Single, Y2 As Single, Color As Long)
Sub PSet(Step As Integer, X As Single, Y As Single, Color As Long)
Sieht doch schon ganz ordentlich aus, meinen Sie? Nun, probieren
Sie diese Methoden-Aufrufe doch einmal aus. Sie werden sich wundern,
warum Sie als Farbe angeben können, was Sie wollen - es wird stur
in der voreingestellten Vordergundfarbe gezeichnet. Bei Circle und
PSet ist der Steps-Parameter ja noch naheliegend - die Übergabe einer
1 entspricht der früheren Angabe des Schlüsselworts Steps.
Aber was hat es mit dem Flags-Parameter der Line-Methode auf sich?
Sie werden schon ganz richtig vermuten, dass hier mit irgendwelchen
Werten sowohl die beiden Steps-Schlüsselwörter als auch die
Rechteck-Flags der Line-Methode nachgebildet werden. Und sicher
werden Sie auch relativ schnell herausgefunden haben, dass ein Wert,
dessen 5. Bit (= 16) gesetzt ist, ein
offenes Rechteck zeichnen lässt, wie ebenso der das 6.Bit
(= 32) für ein gefülltes Rechteck zuständig ist.
Aber über das Spiel der übrigen Bits und deren Auswirkungen auf
das Steps-Verhalten der beiden Koordinaten-Paare X1/Y1
und X2/Y2 werden Sie wohl auch erst einmal den Kopf
schütteln.
Ich mache es kurz, ohne Sie mit meinen Versuchsreihen und dem mir
davon bereiteten Kopfzerbrechen zu behelligen. Grundsätzlich sollte
das 3. Bit (= 4) gesetzt sein - dann
werden die beiden Koordinaten als absolute Angaben angesehen. Das 1.
Bit (= 1) macht das erste Koordinaten-Paar
relativ zur aktuellen CurrentX-/CurrentY-Position - entspricht also
dem Steps-Schlüsselwort. Das 4. Bit (= 8)
entspricht dem Steps-Schlüsselwort vor dem zweiten
Koordinaten-Paar. Damit ergibt sich:
Absolut X1/Y1 - Absolut X2/Y2 = 4
Steps X1/Y1 - Absolut X2/Y2 = 5
Absolut X1/Y2 - Steps X2/Y2 = 12
Steps X1/Y1 - Steps X2/Y2 = 13
Das sieht zwar etwas seltsam aus, funktioniert aber. Bleibt nur
die Frage, wie die VB-Fortentwickler auf diese Bitfolgen gekommen
sind, und es bleibt weiterhin die Frage, wie sie (zunächst einmal)
die Line-Methode dazu bringen, in der gewünschten, angegebenen
Farbe zu zeichnen.
Als Antwort auf die erste Frage kann ich Ihnen nur meine
Vermutungen anbieten, die sich aus der Antwort auf die zweite Frage
ergeben. Diese lautet nämlich: Das Geheimnis der Farbe versteckt
sich in dem übersprungenen 2. Bit (= 2).
Ist dieses gesetzt, wird die angegebene Farbe verwendet. Da dies
auch das Farb-Problem bei der Circle- und bei der PSet-Methode
löst, während auch dort das erste Bit, also die 1,
für die Steps-Angabe zuständig ist, ergibt sich die Vermutung: Das
erste Bit ist vergeben für die Steps-Angabe des (ersten)
Koordinaten-Paares; das zweite Bit wird für die Farbe benötigt; da
im Gegensatz zu Circle und PSet die Line-Methode über zwei
Koordinaten-Paare verfügt, also ein nicht gesetztes 1. Bit
nicht als Angabe der absoluten Position für beide Paare
gleichzeitig dienen kann, werden (zwar von der Logik her
gegensinnig, aber immerhin) die nächsten Bits, das 3. und
4., hierfür verwendet . Die Rechteck-Flags finden dann eben
ihren Platz im 5. und 6. Bit.
Meine obenstehenden Neuformulierungen der Zeichen-Methoden
verzichten auf eine derartige Bit-Schusterei. Sie enthalten dort
entsprechende Parameter, wo Sie sie auch aus Gewohnheit erwarten,
und die obskuren Flags werden daraus erst in den Prozeduren zusammen
gesetzt.
Schauen wir uns zuerst die Ausfürhung der DrawCircle-Methode
näher an:
Public Sub DrawCircle( _
Optional ByVal Steps As StepsConstants, _
Optional ByVal X As Single, Optional ByVal Y As Single, _
Optional ByVal Radius As Single, _
Optional ByVal Color As Long = -1, _
Optional ByVal RStart As Single, Optional ByVal REnd As Single, _
Optional ByVal Aspect As Single)
Dim nFlags As Integer
nFlags = Abs(CBool(Steps))
If Color = -1 Then
nFlags = nFlags
Else
nFlags = nFlags Or 2
End If
With UserControl
.Circle nFlags, X, Y, Radius, Color, RStart, REnd, Aspect
End With
End Sub
Die Enumerationen haben Sie bereits oben bei der Vorstellung der
Methoden-Formulierungen gesehen. Die DrawCircle-Methode ist tolerant
und wertet jeden Wert ungleich 0 als Steps-Angabe. Ist
eine Farbe übergeben worden, d.h. die Voreinstellung -1
ist überschrieben worden, wird das zweite Bit gesetzt - die Farbe
wird verwendet.
Dass Sie die alten Methoden-Aufrufe nicht in einem With...End
With-Konstrukt verwenden können, werden Sie wissen (und sich
wohl wie jeder hin und wieder darüber ein wenig geärgert haben) -
in der VB-Hilfe steht das auch ausdrücklich. Doch genau so, wie die
VB-Hilfe uns die alternativen Methoden unterschlägt, unterschlägt
sie uns natürlich auch, dass diese neuen Methoden eben nur
(!) in einem With...End With-Konstrukt verwendet
werden können. Nur so kann wohl VB unterscheiden, welche Art des
Aufrufs gemeint ist.
Die DrawPoint-Methode als Ersatz für PSet sieht im Prinzip genau
so aus, wie DrawCircle:
Public Sub DrawPoint(Optional ByVal Steps As StepsConstants, _
Optional ByVal X As Single, Optional ByVal Y As Single, _
Optional ByVal Color As OLE_COLOR = -1)
Dim nFlags As Integer
nFlags = Abs(CBool(Steps))
If Color = -1 Then
nFlags = nFlags
Else
nFlags = nFlags Or 2
End If
With UserControl
.PSet nFlags, X, Y, Color
End With
End Sub
Bei der DrawLine-Methode kommt noch die Rechteck-Flag-Auswertung
hinzu und die Steps-Auswertung ist ein wenig vertrackter.
Public Sub DrawLine(Optional ByVal Steps1 As StepsConstants, _
Optional ByVal X1 As Single, _
Optional ByVal Y1 As Single, _
Optional ByVal Steps2 As StepsConstants, _
Optional ByVal X2 As Single, Optional ByVal Y2 As Single, _
Optional ByVal Color As OLE_COLOR = -1, _
Optional ByVal Box As LineBoxConstants)
Dim nFlags As Integer
nFlags = Abs(CBool(Steps1)) + (((Abs(CBool(Steps2)) * 2) + 1) * 4)
If Color >= 0 Then
nFlags = nFlags Or 2
End If
Select Case Box
Case lbBox
nFlags = nFlags Or 16
Case lbBoxFilled
nFlags = nFlags Or 32
End Select
With UserControl
.Line nFlags, X1, Y1, X2, Y2, Color
End With
End Sub
Die Zeile der Steps-Auswertung errechnet aus den (ebenfalls
tolerant gehabten) beiden Steps-Parametern den benötigten der 4
Bit-Kombinationswerte 4, 5, 12 oder 13 - das Knacken der
Funktionsweise überlasse ich Ihnen allerdings als kleine
Knobelaufgabe...
|
|
|