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
Antwort Antwort
Benutzerbild von chaosben
chaosben
Registriert seit: 27. Apr 2005
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)
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
 
Benutzerbild von turboPASCAL
turboPASCAL

 
Delphi 6 Personal
 
#2
  Alt 6. Aug 2009, 03:17
Danke, so ein Beispiel habe ich schon lange gesucht.
Matti
  Mit Zitat antworten Zitat
gmc616

 
Delphi 10.3 Rio
 
#3
  Alt 23. Okt 2009, 21:52
Hmpf

Dein Beispiel funktioniert bei mir nicht.
Auch mein Nachbau nach deiner Anleitung funktioniert nicht.

Als Ergebnis erhalte ich in beiden Fällen "undefined".

Im IE8 jedoch funktionierts!

das ganze mit Vista Home Premium x64 SP2

Könnten die 64-Bit das Problem sein?

Also wenn ich 64 Bit drin habe, dann ...
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin
 
#4
  Alt 23. Okt 2009, 22:03
Zitat von gmc616:
das ganze mit Vista Home Premium x64 SP2
Könnten die 64-Bit das Problem sein?
Zitat von chaosben:
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.
Leo S.
  Mit Zitat antworten Zitat
gmc616

 
Delphi 10.3 Rio
 
#5
  Alt 23. Okt 2009, 22:09
Sorry!

Stimmt! Klassisch überlesen.

Prost!
  Mit Zitat antworten Zitat
Cameron
 
#6
  Alt 21. Jan 2010, 13:08
Zitat von chaosben:
...
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.
...
Hi,
was ist genau das Problem bei der 64bit Variante? Muss das ActiveX als 64bit Variante vorhanden sein?
Ich habe bezüglich Gadgets und Problemen mit 64bit leider nichts ergooglen können.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
 
#7
  Alt 21. Jan 2010, 13:19
Zitat von Cameron:
was ist genau das Problem bei der 64bit Variante? Muss das ActiveX als 64bit Variante vorhanden sein?
Ja, denn nur dann kann es von einem 64bit Host-Prozess geladen und ausgeführt werden.
Auf die 32bit Sidebar ausweichen geht in aller Regel nicht auf x64 System, weil man mit an Sicherheit grenzender Wahrscheinlichkeit schon andere x64 Gadgets drin hat (z.B. Memory-Profiler etc.).
Sebastian Gingter
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

 
Delphi XE2 Professional
 
#8
  Alt 21. Jan 2010, 18:51
Zitat von Phoenix:
Auf die 32bit Sidebar ausweichen geht in aller Regel nicht auf x64 System, weil man mit an Sicherheit grenzender Wahrscheinlichkeit schon andere x64 Gadgets drin hat (z.B. Memory-Profiler etc.).
Was ich nicht bestätigen kann. Alle Gadgets, die ich ich bisher ausprobiert habe liefen einwandfrei mit einer 32bit-Sidebar unter Vista64.
Benjamin Schwarze
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:30 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