AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Vista/Windows 7 Gadgets mit Delphi
Tutorial durchsuchen
Ansicht
Themen-Optionen

Vista/Windows 7 Gadgets mit Delphi

Ein Tutorial von chaosben · begonnen am 5. Aug 2009 · letzter Beitrag vom 21. Jan 2010
 
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#1

Vista/Windows 7 Gadgets mit Delphi

  Alt 5. Aug 2009, 13:53
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
Code:
document.Checker
weil das Objekt mit dem Parameter
Code:
name="Checker"
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!
Angehängte Dateien
Dateityp: zip d2010checker.gadget_177.zip (76,2 KB, 353x aufgerufen)
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz