Visual Component ist eigentlich eine Klasse. Um eine Klasse zu schreiben, können Sie sie direkt in die *.pas-Datei schreiben. Um jedoch Steuerelemente zu schreiben, müssen Sie Pakete verwenden. Wählen Sie „Neu“ aus dem Menü „Datei“, um ein neues Paket zu erstellen. Dies ist das Paket, das zum Speichern und Installieren des Steuerelements verwendet wird. Klicken Sie dann im Paketfenster auf die Schaltfläche „Hinzufügen“, um eine Komponente (Einheit) hinzuzufügen.
Wählen Sie oben im Popup-Dialogfeld „Neue Komponente“ aus. Da es unmöglich ist, alle Eigenschaften, Methoden und Ereignisse eines Steuerelements selbst zu programmieren, müssen Sie die Vorgängerklasse (oder „übergeordnete Klasse“ oder „Basisklasse“) auswählen und dann Ihre eigenen Eigenschaften, Methoden usw. hinzufügen Ereignisse dazu. Wählen Sie im Dropdown-Feld nach Ancestor-Typ die erforderliche Ahnenklasse aus. Da das Schreiben visueller Steuerelemente das Zeichnen erfordert, wird TGraphicControl als Vorgängerklasse ausgewählt. Geben Sie dann den Namen des neuen Steuerelements (Klasse) in das Feld „Klassenname“ ein, normalerweise beginnend mit „T“. Mit der Palettenseite können Sie den Namen der Steuerelementseite des neuen Steuerelements im Delphi-Fenster auswählen, z. B. „Standard“. Fügen Sie den Pfad und den Dateinamen der neuen Steuerdatei unter Unit File Name hinzu und klicken Sie auf die Schaltfläche OK. Neue Steuerelemente werden hinzugefügt. Jetzt ist es an der Zeit, Code für das Steuerelement zu schreiben.
Im Folgenden wird als Beispiel das Schreiben einer Bildlaufleiste verwendet, mit der Bilder angepasst werden können, um die Methode zum Schreiben visueller Steuerelemente zu veranschaulichen.
Befolgen Sie die obige Methode, wählen Sie TGraphicControl als Vorgängerklasse aus und der Name des neuen Steuerelements lautet TPigHorizontalScroller. Nachdem Sie den Dateipfad und den Dateinamen ausgewählt haben, klicken Sie auf die Schaltfläche „OK“, um mit dem Schreiben des Codes zu beginnen.
Jedes Steuerelement wird erstellt (Create) und gelöscht (Destroy), daher müssen diese beiden Prozesse zuerst geschrieben werden. Für jede Prozedur in der Steuerung muss sie zunächst definiert und später geschrieben werden. Es gibt drei Arten von definierten Prozessen oder Eigenschaften: 1. Die nach „PRivate“ definierten Prozesse werden intern vom Steuerelement verwendet und können von Personen, die das Steuerelement verwenden, nicht gesehen werden. 2. Die nach „Protected“ definierten Prozesse sind im Allgemeinen unsichtbar und können nur von anderen verwendet werden, wenn andere verwenden das Steuerelement nur, wenn andere Steuerelemente als Vorgängerklasse geschrieben werden. 3. Die nach public definierten Steuerelemente können nur von anderen im Programm aufgerufen werden Inspektor). Da der Erstellungs- und Löschvorgang nicht nur automatisch ausgeführt wird, wenn das Steuerelement während des Programmiervorgangs erstellt wird, sondern auch aufgerufen werden kann, wenn das Steuerelement während der Ausführung des Programms dynamisch erstellt wird, wird er nach public (1) definiert. (Die Seriennummer gibt die Position des Codes des Unterschritts im angehängten Quellprogramm an, dasselbe unten) Vielleicht wissen Sie immer noch nicht, was in diesen beiden Prozessen kompiliert werden soll und wie man es kompiliert. Wir werden weiter unten darüber sprechen.
Fügen wir diesem Steuerelement zunächst einige Eigenschaften hinzu. Wir definieren eine Max-Eigenschaft, um den Maximalwert der Bildlaufleiste festzulegen oder auszulesen. Da Attribute im Allgemeinen nicht direkt in Programmen verwendet werden, muss eine Variable definiert werden, die dem Attribut entspricht und deren Wert geändert oder gelesen werden kann. Da es nur innerhalb des Steuerelements verwendet wird, definieren wir es nach private (2). (Im Allgemeinen beginnen Variablen, die Attributen zugeordnet sind, mit „F“, z. B. FMax.) Definieren Sie nach dem Definieren der Variablen die Attribute. Diese Eigenschaft muss im Objektinspektorfenster sichtbar sein, also definieren Sie sie und veröffentlichen Sie sie (3). Die definierte Syntax ist:
Eigenschaft <Eigenschaftsname>:<Typ> <entsprechende Variable beim Lesen dieser Eigenschaft lesen> <entsprechende Variable oder Prozedur beim Schreiben dieser Eigenschaft schreiben>
Auch andere Variablen und Attribute werden auf ähnliche Weise definiert (z. B. Min. Minimalwert, Wert aktueller Wert usw.). Als nächstes definieren wir mehrere Eigenschaften und Variablen zum Festlegen des Bildlaufleistenbilds (da die Bildvariable etwas Besonderes ist, werden wir separat darüber sprechen). Wir definieren LeftButtonUpPicture (Bild der linken Taste), LeftButtonDownPicture (Bild zum Drücken der linken Taste) usw. als TBitmap-Typen (entsprechende Variablen müssen definiert werden).
Sie müssen bemerkt haben, dass im angehängten Quellprogramm beim Definieren dieser Attribute die Variable, die dem nach dem Lesen gelesenen Attribut entspricht, F ... ist, die Variable, die dem nach dem Schreiben angegebenen Attribut entspricht, jedoch keine Variable ist, sondern so etwas wie Set ... Dies ist ein maßgeschneiderter Prozess. Der Prozess als Funktion ist definiert als:
Prozedur <Prozedurname>(Wert: <Werttyp des gesetzten Attributs>)
Da beim Schreiben dieses Attributtyps noch andere Dinge erledigt werden müssen, können Sie nicht einfach eine Variable zur Verarbeitung verwenden, sondern einen Prozess zur Verarbeitung verwenden. Dieser Prozess wird im Allgemeinen nach geschützt definiert. Bei dieser Art von Prozedur wird eine Anweisung wie ⑷ verwendet, um einer Variablen vom Typ TBitmap einen Wert zuzuweisen. Dies wird übernommen, da Variablen dieses Typs kein direkter Wert zugewiesen werden kann.
Nachdem Sie die Eigenschaften dieser Variablen vom Typ TBitmap definiert haben, müssen Sie Code in den oben erwähnten Erstellungsprozess und Zerstörungsprozess schreiben. Da es sich bei TBitmap ebenfalls um eine Klasse handelt, muss sie während des Erstellungsprozesses (5) erstellt und während des Zerstörungsprozesses (6) freigegeben (frei) werden. Die hier in ⑺ erwähnte geerbte Anweisung wird verwendet, um anzuzeigen, dass der Prozess von der Vorfahrenklasse geerbt wird. (Dies darf nicht fallen gelassen werden).
Da wir ein visuelles Steuerelement schreiben, müssen wir Bilder auf das Steuerelement zeichnen. Die Vorgängerklasse unseres Steuerelements, TGraphicControl, kapselt ein Canvas-Objekt (Canvas), und wir können es direkt zum Zeichnen von Bildern verwenden. Wenn Sie mit der Verwendung von Leinwand noch nicht vertraut sind, ist es eine gute Idee, ein Buch zu finden und es zu lesen.
Als nächstes muss das Bild gezeichnet werden. Wie zeichne ich Bilder auf die Steuerung? In der Vorgängerklasse TGraphicControl gibt es ein Paint-Ereignis, das automatisch ausgelöst wird, wenn das Steuerelement neu gezeichnet werden muss. Was wir jetzt tun müssen, ist, ein Programm für diese Veranstaltung zu schreiben. Definieren Sie nach dem Schutz zunächst ein Canvas-Objekt. Da es bereits in der Vorfahrenklasse vorhanden ist, ist keine Erklärung erforderlich⑻. Wir werden dieses Objekt verwenden, um das Bild zu zeichnen. Als Nächstes müssen Sie einen Paint-Prozess definieren und den Code zum Zeichnen des Steuerelements schreiben. Definieren Sie den Paint-Prozess zuerst nach öffentlich. Da es von der Vorgängerklasse ausgelöst wird und nicht vom Benutzer aufgerufen wird, muss anschließend eine Überschreibung hinzugefügt werden. Andernfalls wird das Steuerelement nicht zu einem visuellen Steuerelement, da der Paint-Prozess niemals aufgerufen wird. Als nächstes schreiben wir den Code für den Paint-Prozess⑽.
Die T_Height und andere Variablen im Paint-Prozess des diesem Artikel beigefügten Quellprogramms werden verwendet, um die Größe von Schaltflächen, Schiebereglern usw. in der Bildlaufleiste zu speichern. Dieser Teil des Programms unterscheidet sich nicht wesentlich vom Programm in normalen Anwendungen Die meisten davon sind für die Bedienung auf der Leinwand gedacht, ich glaube, jeder wird es auf einen Blick verstehen. Es ist erwähnenswert, dass die Variable FAutoSize eine boolesche Variable ist, die dem Attribut AutoSize des Steuerelements zugeordnet ist. Sie wird verwendet, um festzulegen, ob sich die Größe des Steuerelements mit der Größe des Bildes ändert. Beachten Sie, dass im Code des Steuerelements Eigenschaften in der Regel nicht direkt aufgerufen werden, sondern die entsprechenden Variablen verwendet werden.
An diesem Punkt im Programm haben Sie Ihr neues Steuerelement endlich angezeigt, aber es kann noch nicht gescrollt werden. Schreiben wir nun Mausereignisse, mit denen wir sie manipulieren können. Die Definition des Mausereignisprozesses ist dem Paint-Prozess sehr ähnlich, mit der Ausnahme, dass am Ende Parameterbeschreibungen hinzugefügt werden müssen. Mausereignisse sind in drei Typen unterteilt: MouseDown, MouseMove und MouseUp müssen nach der Definition hinzugefügt werden. Als nächstes schreiben Sie den Code dahinter. Hinweis: Das Mausereignis hier ist Mouse..., nicht das übliche OnMouse... Aber wofür wird die Definition bei ⒀ verwendet? Die Ereignisdefinitionen hier sind alle für Benutzer, d. h. wenn das Steuerelement verwendet wird, wird es auf der Ereignisseite im Objektinspektor angezeigt.
Der Code für diese Mausereignisse ist ebenfalls sehr einfach. Er ermittelt die Koordinaten der Maus, zeichnet das entsprechende Bild auf die Leinwand usw. und löst gleichzeitig das entsprechende Ereignis aus. Beachten Sie, dass Sie beim Aufrufen eines benutzerdefinierten Ereignisses zunächst eine Anweisung wie ⒁ verwenden müssen, um festzustellen, ob der Benutzer Code für das Ereignis geschrieben hat. Dies ist sehr wichtig, da sonst ein Fehler auftritt.
Jeder hat bemerkt, dass die gerade aufgerufenen Ereignisse alle angepasst sind und die definierte Methode ebenfalls sehr einfach ist. Sie ähnelt der Definition von Eigenschaften, außer dass der Typ TNotifyEvent ist.
TNotifyEvent ist das Standardereignis, das wie folgt definiert ist:
TNotifyEvent = procedure(Sender: TObject)
Wenn Sie eine andere Ereignisform definieren möchten, müssen Sie Folgendes tun: Schreiben Sie es zuerst und geben Sie es dann ein
<Name des Ereignistyps> = procedure(<Parameter>:<Typ>)
Zum Beispiel:
TCustomEvent = procedure(a: Integer; b:String);
Definieren Sie es dann nach public:
<Ereignisname>:<Ereignistypname>
Zum Beispiel:
AnEvent: TCustomEvent;
Nachdem Sie dies gelesen haben, sollten Sie den gesamten Vorgang verstehen. Sollten Kompilierungs- oder Lauffehler auftreten, prüfen Sie bitte folgende Punkte:
1. Gibt es vererbte Anweisungen in den Erstellungs- und Zerstörungsprozessen?
2. Wurden die Variablen vom Typ TBitmap erstellt und freigegeben?
3. Gibt es vor dem Prozess einen Steuernamen, zum Beispiel: TPigHorizontalScroller.MoseMove
So ermitteln Sie, ob die Maus das Steuerelement betritt oder verlässt:
Definieren Sie den folgenden Prozess:
procedure MouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
procedure MouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;