Viele Leute halten Delphi für ein RAD-Tool, darunter auch ich selbst, der in meiner Schulzeit Voreingenommenheit gegenüber Delphi hatte. Nachdem ich nun aus dem „Elfenbeinturm“ herausgetreten bin, hat es ein breiteres Spektrum an Bereichen abgedeckt und ist auf mehr Probleme gestoßen Ich habe nach und nach meine eigene Sichtweise gewonnen. Tatsächlich ist Delphi ein Entwicklungstool, das auf der Sprache Object Pascal basiert, was bedeutet, dass Delphi im Wesentlichen ein Sprachtool ist und wirklich objektorientiert ist. Das Beispiel, das ich unten gebe, ist ein in Delphi implementiertes Tray-Applet. Das Programm ist kurz und prägnant, mit klarem Kontext. Ich werde die wichtigsten Teile im Detail erklären. So wie Herr Hou Junjie Schicht für Schicht das MFC abzieht, muss auch ich heute „den Ochsen kochen“.
In Delphi müssen bei der Systemprogrammierung ausnahmslos API-Funktionen aufgerufen werden. Es gibt Prototypen der API-Funktionen, die in der ShellAPI.pas-Einheit verwendet werden sollen.
Praktische Übungen:
eins. Erstellen Sie eine neue Anwendung: Datei->Neue Anwendung. Definieren Sie eine Nachrichtenkonstante im Abschnitt „Schnittstelle“: const WM_NID=WM_USER+1000. Das System legt fest, dass Nachrichten für Benutzer ab WM_USER angepasst werden können.
zwei. Definieren Sie eine globale Variable: NotifyIcon:TNotifyIconData ist eine sehr wichtige Variable. Das gesamte Programm dreht sich im Wesentlichen um diese Variable. TNotifyIconData ist ein Datensatztyp. Halten Sie die Strg-Taste gedrückt und doppelklicken Sie auf TNotifyIconData, um die ShellAPI.pas-Einheit aufzurufen. (Hinweis: In Delphi ist dies eine sehr gute Möglichkeit, den Quellcode zu analysieren. Der Quellcode spricht für sich. Wenn Sie die Insider-Geschichte hinter dem Programm erfahren möchten, analysieren Sie am besten den Quellcode!) Hier Zeit erscheint die folgende Zuweisungsanweisung:
TNotifyIconData = TNotifyIconDataA, diese Bedeutung ist sehr offensichtlich, das heißt, TNotifyIconData und TNotifyIconDataA sind vom gleichen Datentyp, und dann schauen Sie nach unten:
TNotifyIconDataA = _NOTIFYICONDATAA, die Bedeutung ist die gleiche wie zuvor, schauen Sie nach unten:
Typ
_NOTIFYICONDATAA = Datensatz
cbSize: DWord;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: Array [0..63] von AnsiChar;
Ende;
Das ist wirklich so, als würde man „herauskommen, nachdem man ihn lange gerufen hat, aber immer noch die Pipa hält und das Gesicht halb verdeckt.“ Jetzt ist allen klar, dass die globale Variable NotifyIcon, die wir gerade definiert haben, tatsächlich eine Datensatztypvariable ist, die 7 Komponenten enthält, was der Strukturvariablen in C/C++ entspricht (C/C++-Programmierer sollten damit sehr vertraut sein). Lassen Sie uns nacheinander die Funktionen jedes der sieben Teile des Datensatztyps erklären.
1> cbSize ist die Größe der von Ihnen definierten NotifyIcon-Variablen, die mit SizeOf(TNotifyIconData) ermittelt werden kann. Wenn Sie ein erfahrener C/C++-Programmierer sind, sollten Sie damit vertraut sein. Wenn Sie in C/C++ Speicher für eine Strukturvariable reservieren möchten, müssen Sie SizeOf(Struct type) verwenden, um zu wissen, wie viel Speicher zum Speichern einer solchen Strukturvariablen benötigt wird.
2> Wnd ist ein Handle. Welches Formular sollen die vom Tray-Programm generierten Nachrichten verarbeiten?
Beispiel: Wenn Sie auf das kleine Taskleistensymbol in der Taskleiste klicken möchten, um das Formular zwischen „Anzeigen“ und „Ausblenden“ umzuschalten, zeigen Sie mit Wnd auf das Hauptformular.
3> uID: Wenn Sie mehrere Tray-Applets erstellen möchten, wie können Sie diese unterscheiden? Die Unterscheidung erfolgt durch diese ID-Nummer.
3> uFlags ist ein Flag-Bit, das die Eigenschaften des aktuell erstellten Tray-Programms angibt:
NIF_ICON gibt an, dass das aktuell festgelegte Symbol (d. h. der Wert von hIcon) gültig ist
NIF_MESSAGE gibt an, dass die aktuell eingestellte Systemnachricht (d. h. der Wert von uCallBackMessage) gültig ist
NIF_TIP gibt an, dass die aktuell eingestellte Trinkgeldleiste (d. h. der Wert von szTip) gültig ist.
4> uCallBackMessage Dies ist der wichtigste der 7 Teile. Geben Sie hier eine Rückrufnachricht an, das heißt, definieren Sie hier einen Nachrichtennamen. Wenn Sie auf das Taskleistensymbol klicken oder mit der rechten Maustaste darauf klicken, wird ein in uCallBackMessage definierter Nachrichtenname an das Formular gesendet, auf das Wnd zeigt, und dann definieren Sie einen Verwenden Sie im Programm die Funktion „Message Out“, um diese Nachricht zu verarbeiten. Auf diese Weise wird der gesamte Satz Windows-bezogener Meldungen verarbeitet.
6> hIcon ist das Handle des Taskleistensymbols. Basierend auf diesem Handle können Sie Symbole hinzufügen, ändern und löschen.
7> szTip ist die Eingabeaufforderung, die angezeigt wird, wenn Ihre Maus auf dem kleinen Symbol in der Taskleiste platziert wird.
Hier habe ich viel Zeit damit verbracht, die Insider-Geschichte von TNotifyIconData vorzustellen. Sobald dieser Teil geklärt ist, wird sich der Rest von selbst ergeben.
drei. Doppelklicken Sie auf das Hauptformular, um den Codebereich von FormCreate aufzurufen:
TForm1.FormCreate(Sender:TObject);
Beginnen
//NotifyIcon ist eine globale Variable und wurde zu Beginn des Programms definiert
mit NotifyIcon tun
beginnen
cbSize:=SizeOf(TNotifyIconData);
Wnd:=Handle; //Handle, das auf das aktuelle Formular Form1 zeigt
uID:=1;
uFlags:=NIM_ICON oder NIM_MESSAGE oder NIM_TIP;
uCallBackMessage:=WM_NID;
hIcon:=application.Icon.Handle;
szTip:=“Der böse junge Mann der Familie Zhang“;
Ende;.
//Fügen Sie die festgelegte Variable NotifyIcon zur Verarbeitung zum System hinzu
Shell_NotifyIcon(NIM_ADD,@NotifyIcon);
Ende;
Vier. Der nächste Schritt besteht darin, eine Nachrichtenverarbeitungsfunktion zu definieren: Wenn das System eine Nachricht an das Formular sendet, wird diese von der folgenden Funktion verarbeitet. Jede Nachrichtenverarbeitungsfunktion verarbeitet einen bestimmten Nachrichtentyp. Bitte schauen Sie sich den Unterschied zwischen der Definition des Funktionskörpers unten und der allgemeinen Funktionsdefinition genauer an: Die Nachrichtenverarbeitungsfunktion muss am Ende den Namen der Nachricht hinzufügen Wenn das System eine WM_NID-Nachricht sendet, wird automatisch die WMNID-Nachrichtenverarbeitungsfunktion ausgelöst.
PROcedure WMNID(var msg:TMessage);message WM_NID;
beginnen
case msg.LParam von
WM_LBUTTONUp; Form1.Visible:=nicht Form1.Visible;
WM_RBUTTONUP: ShowMessage('Sie haben auf die rechte Schaltfläche geklickt');
Ende;
Ende;
Nun, das einfachste Programm ist geboren. Jeder kann seine Lieblingssymbole festlegen.
Projekt->Optionen, wählen Sie die Anwendungsseite aus und laden Sie Ihr Lieblingssymbol in das Symbolelement, sodass Ihr Lieblingssymbol in der Taskleiste angezeigt wird, wenn das Programm ausgeführt wird. Wenn Sie auf das Symbol klicken, wechselt das Formular Form1 zwischen sichtbar und unsichtbar. Klicken Sie also, um es anzuzeigen, und klicken Sie erneut, um es auszublenden. Wenn Sie mit der rechten Maustaste auf das Symbol klicken, wird die Meldung angezeigt: „Sie haben auf die rechte Schaltfläche geklickt.“
fünf. Denken Sie abschließend daran, das erstellte Taskleistenprogramm beim Schließen der Anwendung freizugeben, da es sonst Systemressourcen belegt.
TForm1.FormDestroy(Sender:TObject);
Beginnen
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
Ende;
Es ist fast ein halbes Jahr her, dass ich in der Schule viele Dinge verstehe, und wenn ich in die Gesellschaft gehe, habe ich viel davon profitiert Wenn ich ein Erlebnis habe, möchte ich es immer in Worten aufschreiben, um zusammenzufassen, was ich gelernt habe. Zweitens: Lasst uns mit allen kommunizieren.
E-Mail: [email protected] QQ: 8133413 Der böse Junge der Familie Zhang