AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Windows 7 Support für Delphi [ALPHA 1]
Thema durchsuchen
Ansicht
Themen-Optionen

Windows 7 Support für Delphi [ALPHA 1]

Ein Thema von sakura · begonnen am 20. Jan 2009 · letzter Beitrag vom 19. Nov 2014
Antwort Antwort
Seite 7 von 8   « Erste     567 8      
Benutzerbild von sakura
sakura
Registriert seit: 10. Jun 2002
Einige von Euch lesen ja die Blogs oder haben den Windows 7 Thread beobachtet. Ich habe ein wenig mit Windows 7 gespielt und die ersten Funktionen in kleine Komponenten verpackt. Wer will, der kann sich die herunterladen und nutzen (in Euren Anwendungen: GPL, LGPL, MPL - je nach belieben; für eigene Komponenten nur GPL).

Das Package ist ausschließlich als Installer verfügbar, wer das nicht mag, der muss die auch nicht herunterladen Ich werde kein einfaches ZIP zum entpacken zur Verfügung stellen.

Ausführliche Beschreibung (engl.): http://www.gumpi.com/Blog/2009/01/20...ForDelphi.aspx
Installer: http://www.gumpi.com/Downloads/Delph...Components.zip (ca. 1,5 MB)

Momentan kopiert der Installer ausschließlich nach Auswahl. Die Installation in die IDE muss von Hand erfolgen.

Packages sind enthalten für: Delphi 7, Delphi 2006, Delphi 2007 und Delphi 2009

Derzeit verfügbar sind:
  • Jump Lists - Rechtsklick Kontextmenü der Anwendung in der Taskbar
  • Overlay Icon - wird im Taskbar Button je nach Auswahl angezeigt
  • Fortschrittsanzeige im Taskbar Button
  • Taskbar Thumbnails - Die Anwendung kann direkt von der Taskbar aus gesteuert werden

Hinweis: Die meisten Features setzen Aero voraus und laufen daher nicht in VMs.

......
Ich bin nicht zurück, ich tue nur so

Geändert von Matze (18. Jul 2010 um 15:15 Uhr) Grund: Download-Link aktualisiert
 
Benutzerbild von Sherlock
Sherlock

 
Delphi 12 Athens
 
#61
  Alt 16. Jul 2010, 10:19
Ui, Danke. Ich bin zwar da drauf gewesen, aber ich war nur auf der Seite zu den Komponenten....und, was soll ich sagen? War zu faul weiter zu suchen. Mea culpa

Sherlock
Oliver
  Mit Zitat antworten Zitat
Chillkröte

 
Delphi 2010 Architect
 
#62
  Alt 14. Aug 2010, 19:32
Hallo
ich habe deine Thumbnails-Komponente zu meinem Projekt hinzugefügt.

Muss man da noch zusätzlich aktivieren oder dem Projekt hinzufügen?

Bei WinXP (ja ich weiß, es ist sinnlos... war aber nur zu Testzwecken) bekam ich keinerlei Fehlermeldungen. Als ich das gleiche Projekt dann bei einem Win7 Laptop ausprobiert habe, bekomm ich erst eine Nachricht "Das Programm funktioniert nicht mehr" wenn man dann abbricht Zugriffsverletzungen.

Diesen Code habe ich noch hinzugefügt
Delphi-Quellcode:
procedure TFrmMain.ThumbsWin7ThumbnailClick(Sender: TdwTaskbarThumbnailItem);
begin
case Sender.Index of
0: showmessage('A');
1: showmessage('B');
end;
end;
kannst du mir sagen woran das liegt?

In der Hoffnung das du mir helfen kannst.
MfG
Chillkröte

edit:
jetzt kommen keine fehlermeldungen mehr, die buttons bleiben aber verborgen.
Am Code habe ich nichts verändert!

Geändert von Chillkröte (14. Aug 2010 um 20:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ralfschwalbe
ralfschwalbe

 
Delphi XE3 Professional
 
#63
  Alt 9. Dez 2010, 08:18
Guten Morgen,

ich erstelle ein MDI Child und verwende dann folgenden Code:

Delphi-Quellcode:
  Win7TaskBarWindow.DeactivateTaskWindows;
  Win7TaskBarWindow.TaskbarWindows.Clear;

  with Win7TaskBarWindow.TaskbarWindows.Add do
  begin
    Caption := Self.MDIChildren[i].Caption;
    WinControl := Self.MDIChildren[i];
  end;

  Win7TaskBarWindow.UpdateAllTaskbarWindows;
  if Win7TaskBarWindow.TaskbarWindows.Count > 0 then Win7TaskBarWindow.ActivateTaskWindows;
Die Taskbarwindows werden erzeugt, aber...

1. Die MDI Childs enthalten ein TPageControl. Alle Controls die dort drauf sind werden nicht mit gezeichnet.
2. Das OnActivateTab funktioniert mit MDI Child Fenstern nicht. Das Event wird gar nicht ausgelöst.

Außerdem habe ich schon in TdwTaskbarWindowsEntry.DoCreatePreview(Message: TMessage) folgende Zeilen geändert:

Delphi-Quellcode:
Parent := WinControl.Parent;
while (Parent <> nil) and (Parent.Parent <> nil) do
begin
  Pt := Parent.ClientToParent(Pt, Parent.Parent);
  Parent := Parent.Parent;
end;
DwmSetIconicLivePreviewBitmap(ProxyHandle, PreviewArea.Handle, @Pt, 0);
Das while war erst: while (Parent.Parent <> nil) do Da aber ein MDI Child keinen Parent hat... Bummm!

Hat jemand diese Compos schon mal mit MDI Child Fenstern eingesetzt? Gibt es sonstige Hinweise?

Danke im Voraus.
Ralf Schwalbe
  Mit Zitat antworten Zitat
Benutzerbild von ralfschwalbe
ralfschwalbe

 
Delphi XE3 Professional
 
#64
  Alt 10. Dez 2010, 09:57
Keiner eine Idee? Oder hat noch niemand versucht einzelne MDI Childs mit dieser Komponente in der Win7 Taskbar anzuzeigen?
Ralf Schwalbe
  Mit Zitat antworten Zitat
NickelM

 
Delphi 2009 Professional
 
#65
  Alt 10. Mär 2011, 08:47
Hallo zusammen,
und erstmal ein Lob an sakura für die Komponenten.
Ich benutze zur Zeit die ProgressBar und OverlayIcon in meiner Anwendung, weil ich den Updatefortschritt auch in der Taskbar anzeigen will.
Funkt nach langem fummeln auch mit Thread usw.
Habe mir zum Testen auf eine Virtuele Maschine unter XP, die 90 Tage Testversion von Win7 Enterprise gezogen, damit ich mein Programm testen kann.
So nun hab ich Win7 SP 1 installiert und jetzt hab ich dauerthaft ein Schild bei der Anwendung (wegen ProgramFile Ordner brauch ich Adminrechte beim Update). Nun ich bekomms net mehr weg (bin neu in Win7 also bitte nicht gleich erschlagen ).

Um auf den Punkt meines Problems zukommen:
Durch das Update hab ich das Schild-Icon auch als Overlay-Icon in der Taskbar. Nun zeichnet die Overlay-Kompenente das andere darauf.
Ist das normal? Weil ich find es ein bischen blöd wenn ich mit der Kompenente das Overlay Icon ändern will, aber es nur auf das Schild-Icon draufgezeichnet wird. (Davor hatte ich es noch nicht, da gings wunderbar )
@sakura: Ich wies net ob das geht, aber ist es Möglich das du das Icon ersetzt, solang der ImageIndex in der Overlay-Kompenente > -1 ist
und dan wieder zurücksetzt?Also in meinem Fall das Schild wieder hinkommt?
Nickel
  Mit Zitat antworten Zitat
Dawn87

 
Delphi XE5 Professional
 
#66
  Alt 24. Mai 2011, 14:07
Der Downloadlink ist leider tot. Wäre jemand so lieb und würde die Komponente bereitstellen?

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

 
FreePascal / Lazarus
 
#67
  Alt 24. Mai 2011, 14:27
In der Hoffnung das Richtige gefunden zu haben:
Angehängte Dateien
Dateityp: 7z Win7 Components.7z (651,3 KB, 87x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

 
Delphi 12 Athens
 
#68
  Alt 24. Mai 2011, 14:47
Ansonsten kann man sich die hier auch einmal ansehen: http://delphi.fsprolabs.com/
Detlef
  Mit Zitat antworten Zitat
NickelM

 
Delphi 2009 Professional
 
#69
  Alt 4. Aug 2011, 21:19
Hallo nochmal,

Mal ne frage...es ist doch möglich mit der Taskbar Unit, auch das für nonvcl zumachen oder?
Weil ich wollte das mit der Taskbarprogressbar in NonVCL verwenden.

EDIT:
Ich habe es soweit hinbekommen das er es mir anzeigt. Hingegen bekomm ich beim schliessen einen Zugriffsverletzung auf adresse 000000 (d.h. auf ein bereits freigegeben Pointer) Ich vermute es liegt am dem Form das früher freigegeben wird als die ProgressBar in der Taskleiste.
Nur wie gebe ich die davor frei bzw. wann? und wo?

Benutze Delphi2009/Delphi2010

Delphi-Quellcode:
program metroupdate;

uses SysUtils,messages, windows, classes, CommCtrl, xpman, ComObj;

type
  ULONGLONG = UInt64;

  TTipString = array[0..259] of WideChar;
  PTipString = ^TTipString;
  tagTHUMBBUTTON = packed record
    dwMask
      : DWORD;
    iId
    , iBitmap
      : UINT;
    hIcon
      : HICON;
    szTip
      : TTipString;
    dwFlags
      : DWORD;
  end;
  THUMBBUTTON = tagTHUMBBUTTON;
  THUMBBUTTONLIST = ^THUMBBUTTON;

  ITaskbarList = interface
    ['{56FDF342-FD6D-11D0-958A-006097C9A090}']
    procedure HrInit; safecall;
    procedure AddTab(hwnd: Cardinal); safecall;
    procedure DeleteTab(hwnd: Cardinal); safecall;
    procedure ActivateTab(hwnd: Cardinal); safecall;
    procedure SetActiveAlt(hwnd: Cardinal); safecall;
  end;

  ITaskbarList2 = interface(ITaskbarList)
    ['{602D4995-B13A-429B-A66E-1935E44F4317}']
  procedure MarkFullscreenWindow(hwnd: Cardinal; fFullscreen: Bool); safecall;
  end;

  ITaskbarList3 = interface(ITaskbarList2)
    ['{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}']
    procedure SetProgressValue(hwnd: Cardinal; ullCompleted, ullTotal: ULONGLONG); safecall;
    procedure SetProgressState(hwnd: Cardinal; tbpFlags: DWORD); safecall;
    procedure RegisterTab(hwndTab: Cardinal; hwndMDI: Cardinal); safecall;
    procedure UnregisterTab(hwndTab: Cardinal); safecall;
    procedure SetTabOrder(hwndTab: Cardinal; hwndInsertBefore: Cardinal); safecall;
    procedure SetTabActive(hwndTab: Cardinal; hwndMDI: Cardinal; tbatFlags: DWORD); safecall;
    procedure ThumbBarAddButtons(hwnd: Cardinal; cButtons: UINT; Button: THUMBBUTTONLIST); safecall;
    procedure ThumbBarUpdateButtons(hwnd: Cardinal; cButtons: UINT; pButton: THUMBBUTTONLIST); safecall;
    procedure ThumbBarSetImageList(hwnd: Cardinal; himl: Cardinal); safecall;
    procedure SetOverlayIcon(hwnd: Cardinal; hIcon: HICON; pszDescription: LPCWSTR); safecall;
    procedure SetThumbnailTooltip(hwnd: Cardinal; pszTip: LPCWSTR); safecall;
    procedure SetThumbnailClip(hwnd: Cardinal; prcClip: PRect); safecall;
  end;

var hwndProgress : DWord;
    hWndFont : HFONT;
    FTaskbarList : ITaskbarList;
    FTaskbarList2 : ITaskbarList2;
    FTaskbarList3 : ITaskbarList3;
    FensterH : HWND;

function InitCommonControl(CC: Integer): Boolean;
var
  ICC: TInitCommonControlsEx;
begin
  ICC.dwSize := SizeOf(TInitCommonControlsEx);
  ICC.dwICC := CC;
  Result := InitCommonControlsEx(ICC);
  if not Result then InitCommonControls;
end;

function CompareMD5(A, B : TMD5Digest) : Boolean;
var I : Integer;
begin
Result := True;
for I := 0 to 16 - 1 do
if A[I] <> A[I] then
begin
Result := False;
Exit;
end;
end;

const
  CLSID_TaskbarList: TGUID = '{56FDF344-FD6D-11D0-958A-006097C9A090}';
  CLSID_TaskbarList2: TGUID = '{602D4995-B13A-429B-A66E-1935E44F4317}';
  CLSID_TaskbarList3: TGUID = '{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}';

  //Warum das eigentlich?
  ICC_PROGRESS_CLASS = $00000020;

  //Brauch nur normal und keine xD
  TBPF_NOPROGRESS   = $00;
  TBPF_NORMAL    = $02;

  ClassName = 'TTest';
  Window1Name = 'Test';
  WindowWidth = 270;
  WindowHeight = 15;

function WndProc(hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: LParam):
  lresult; stdcall;
var
  x, y,FormHeight,FormWidth : integer;
begin
  Result := 0;
  case uMsg of
    WM_CREATE:
      begin
        x := GetSystemMetrics(SM_CXSCREEN);
        y := GetSystemMetrics(SM_CYSCREEN);
        FormHeight := 10 + WindowHeight + (GetSystemMetrics(SM_CYCAPTION)) + (2 * GetSystemMetrics(SM_CYDLGFRAME)) + 10;
        FormWidth := 10 + WindowWidth + (2 * GetSystemMetrics(SM_CXDLGFRAME)) + 10;

        MoveWindow(hWnd, (x div 2) - (FormWidth div 2),
          (y div 2) - ((FormHeight) div 2),
          FormWidth, FormHeight, true);

        hwndProgress := CreateWindowEx(0,PROGRESS_CLASS,nil,
         WS_CHILD or WS_VISIBLE or PBS_SMOOTH,10,10,270,15,hwnd,
         0,hInstance,nil); //Brauch ich, da ich es im Fenster und in der Taskleiste haben will;
      end;
    WM_DESTROY:
      begin
        if CheckWin32Version(6, 1) and (FTaskbarList3 <> nil) then
        FTaskbarList3.SetProgressState(FensterH, TBPF_NOPROGRESS); //Sollte doch das Freigeben sein oder? Funkt aber net hier auch nicht bei WM_CLOSE
        PostQuitMessage(0);
      end;
  else
    Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
  end;
end;


var
  wc: TWndClassEx = (
    cbSize : SizeOf(TWndClassEx);
    Style : CS_HREDRAW or CS_VREDRAW;
    lpfnWndProc : @WndProc; //Fensterfunktion für Fenster 1
    cbClsExtra : 0;
    cbWndExtra : 0;
    lpszMenuName : nil;
    lpszClassName : ClassName; //Klassenname für Fenster 1
    hIconSm : 0;
  );
  msg: TMsg;

var
  Obj
    : IInterface;
begin
  wc.hInstance := hInstance;
  wc.hCursor := LoadCursor(0, IDC_ARROW);
  wc.hbrBackground := GetSysColorBrush(COLOR_BTNHIGHLIGHT);

  RegisterClassEx(wc);

  FensterH := CreateWindowEx(0, ClassName, Window1Name, WS_VISIBLE or WS_SYSMENU,
    Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), WindowWidth, WindowHeight, 0, 0, hInstance,
    nil);

  InitCommonControl(ICC_PROGRESS_CLASS); //Ist ja sowieso alles größer alls 32Bit xD Brauch ich das überhaupt?

  if CheckWin32Version(6, 1) then
  begin
    Obj := CreateComObject(CLSID_TaskbarList);
    if Obj = nil then
    FTaskbarList := nil
    else
    begin
      FTaskbarList := ITaskbarList(Obj);
      FTaskbarList.HrInit;

      FTaskbarList.QueryInterface(CLSID_TaskbarList2, FTaskbarList2);
      FTaskbarList.QueryInterface(CLSID_TaskbarList3, FTaskbarList3);
    end;
  end;

  if CheckWin32Version(6, 1) and (FTaskbarList3 <> nil) then
  begin
    FTaskbarList3.SetProgressState(FensterH, TBPF_NORMAL);
    FTaskbarList3.SetProgressValue(FensterH, 50, 100); //Testweise
  end;

  while GetMessage(msg,0,0,0) do
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;

  ExitCode := msg.wParam;
end.
Nickel

Geändert von NickelM ( 5. Aug 2011 um 00:06 Uhr)
  Mit Zitat antworten Zitat
EWeiss
 
#70
  Alt 7. Aug 2011, 11:20
FTaskbarList3.SetProgressState(FensterH, TBPF_NOPROGRESS);
Du teilst hier TaskbarList3 lediglich mit das keine Progressbar angezeigt werden soll

Hat mit der freigabe nix zu tun.
Denke mal du solltest das Objekt TaskbarList3 Releasen oder?

Und für die Progressbar kannst du dir die CLSID_TaskbarList2 schenken.

PS:
Dann würde ich auch nicht jedesmal auf
CheckWin32Version(6, 1) prüfen sondern hier eine fixed variable deklarieren als BOOL oder was auch immer
Das reicht wenn man es einmal prüft bei Programmstart.

gruss

Geändert von EWeiss ( 7. Aug 2011 um 11:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 8   « Erste     567 8      


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 10:55 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