Wer schon mal voller Elan danach gesucht hat, wie man eigene Gadgets für die Vista-Sidebar schreibt, ist vielleicht auch schon an der Stelle "
HTML mit Javascript" stecken geblieben. Nicht weil man es nicht könnte oder wöllte, sondern einfach deswegen, weil man lieber sein Delphi benutzen will.
Hier kommt nun eine kleine Anleitung, wie man seinen Delphi-Code in ein Gadget packen kann.
Kurz zusammengefasst nennt sich die Lösung:
ActiveX.
Was man braucht- Ein Windows Vista/7
- Einen Unicode-fähigen Editor (z.B. Notepad++)
- Ein Delphi, mit dem man ActiveX-Controls erstellen kann (ich nutze für dieses Beispiel Delphi 2006)
Eine weitere Voraussetzung ist, das die 32bit-Variante der Sidebar läuft. Das ist automatisch so, wenn man ein 32bit-Windows nutzt. Ist man 64bit-Nutzer, sollte man die Version aus c:\Programme (x86) nutzen.
Nu aber los jetzt
Als erstes brauchen wir eine neues Gadget-Verzeichnis. Das legen wir uns unter
Code:
%USERPROFILE%\AppData\Local\Microsoft\Windows Sidebar\Gadgets
mit folgender Nomenklatur an: DerNameMeinesGadgets.gadget
In diesem Verzeichnis erstellen wir eine Datei namens "gadget.xml". Sie hat grob den folgenden Aufbau (Inhalt einfach anpassen):
XML-Code:
<?
xml version="1.0" encoding="utf-8" ?>
<gadget>
<name>Der Name unseres Gadgets</name>
<version>1.0.0.0</version>
<author name="DelphiPraxis-User">
<info
url="www.DelphiPraxis.net" />
</author>
<copyright>© DelphiPraxis.net</copyright>
<description>Dieses Gadget macht irgendwas</description>
<hosts>
<host name="sidebar">
<base type="
HTML" apiVersion="1.0.0" src="main.html" />
<permissions>Full</permissions>
<platform minPlatformVersion="1.0" />
</host>
</hosts>
</gadget>
Genaueres findet man
hier.
Die Zeile
<base type="HTML" apiVersion="1.0.0" src="main.html" />
verrät uns auch gleich, wie die nächste Datei heißen sollte, die wir im Gadget-Verzeichnis anlegen: "main.html"
Die Datei füllen wir am besten auch gleich mit ein paar Daten:
XML-Code:
<
html >
<head>
<meta http-equiv="Content-Type" content="text/
html; charset=
Unicode" />
<script type="text/jscript" language="jscript">
</script>
</head>
<body onload="init()">
<div id="content" style="text-size: xx-small">Moment noch ...</div>
</body>
</
html>
Jetzt können wir die Sache schon mal ausprobieren. Minianwendung hinzufügen und gucken obs klappt.
Delphi
Jetzt kommt der interessante Teil. Man nehme sich ein Delphi und erzeuge ein neues Projekt vom Typ "Delphi-Projekte->
ActiveX->
ActiveX-Bibliothek".
Als Ausgabe-Verzeichnis setzt man sinnvollerweise den Pfad auf das oben neu angelegte Gadget-Verzeichnis.
Außerdem fügen wir noch ein Automatisierungsobjekt ein. "Neu->Delphi-Projekte->
ActiveX->Automatisierungsobjekt".
Im Dialog gibt man den Klassennamen des neuen Objektes an. Dieses Objekt binden wir dann später in unser Gadget ein.
Unser Gadget soll uns die Zeit bis zum Release von Delphi 2010 anzeigen. Also nennen wir die Klasse "D2010ReleaseChecker".
In der TLB-Ansicht (Ansicht->Typbibliothek) erzeugt man via Kontextmenu auf dem Interface (ID2010ReleaseChecker) eine neue Eigenschaft "TimeToRelease". Den Typ ändern wir auf "BSTR". Den Setter kann man beruhigt löschen.
In der zugehörigen
Unit findet man jetzt eine Funktion
function TD2010ReleaseChecker_.Get_TimeToRelease: WideString;
Nach dem usen der Units DateUtils und SysUtils kann man sie so ausfüllen:
Delphi-Quellcode:
var
Diff : TDateTime;
begin
Diff := StrToDate('26.08.2009') - Now;
Result := FormatDateTime('d "Tage" h "Stunden" n "Minuten", s "Sekunden"', Diff);
end;
Unsere Datei "main.html" erweitern wir noch wie folgt:
XML-Code:
<
html >
<head>
<meta http-equiv="Content-Type" content="text/
html; charset=
Unicode" />
<script type="text/jscript" language="jscript">
function SetNextTimeout(AInterval)
{
setTimeout("Update()", AInterval);
}
function Update()
{
var d = document.getElementById('content');
d.innerHTML = Checker.TimeToRelease;
SetNextTimeout(1000);
}
</script>
</head>
<body style="width: 120px; height 150px" onload="Update()">
<div id="content" style="font-size: xx-small"></div>
<object width="1" height="1" name="Checker" classid="
clsid:A6CB4EF7-92AF-4E70-B83D-92E7F0FF410F" codebase="D2010ReleaseChecker.dll" />
</body>
</
html>
Die ClassID bekommt aus aus den Infos in der TLB-Ansicht (Ansicht->Typbiliothek), wenn, in unserem Beispiel, "D2010ReleaseChecker" (Achtung! Nicht die
GUID des Interfaces (das Ding mit dem I vor dem Namen) nehmen) ausgewählt ist.
Wenn man das Projekt so kompilert, sollte es schon funktionieren. Der Zugriff auf unser Objekt geht in diesem Fall über
weil das Objekt mit dem Parameter
eingebunden wurde.
Eine Falle gibt es noch: Der IE speichert
ActiveX-Bibliotheken zwischen (
in der Regel unter "c:\Windows\Downloaded Program Files"). Daher sollte man die alte
DLL nach jedem neuen Kompilat aus diesem Ordner löschen.
Die
DLL braucht
nicht im System registriert werden, weil sie als codebase angegeben wurde.
Viel Spass!