Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.10.2010, 16:26
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию избранное


как сделать вот таке меню итемов, чтоб туда кидалось избранное из IE.

Вот компонент с этим только перенести не удается...


Код:
unit FavMenu;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Shdocvw_tlb, Registry, menus, IEUtils, ShellApi, Shlobj, Imglist, ActiveX;

type
  PItem = ^TItem;
  TItem = record
    ID, FullID: PItemIDList;
    Folder: Boolean;
    Created: Boolean;
  end;

type

  TOnUrlSelectedEvent = procedure(Sender: TObject; Url: string) of object;

  TLocalization = class(TPersistent)
  private
    FAddFavorites,
      FOrganizeFavorites,
      FImportFavorites,
      FExportFavorites: string;
  published
    property AddFavorites: string read FaddFavorites write FAddFavorites;
    property OrganizeFavorites: string read FOrganizeFavorites write FOrganizeFavorites;
    property ImportFavorites: string read FImportFavorites write FImportFavorites;
    property ExportFavorites: string read FExportFavorites write FExportFavorites;
  end;


  TResolveUrl = (IntShCut, IniFile);
  TFavOptions = (AddFavorites, OrganizeFavorites, ImportFavorites, ExportFavorites);

  TOptions = set of TFavOptions;

  TFavoritesMenu = class(TComponent)
  private
    { Private declarations }
    Images: TImageList;
    Counter: Integer;
    List: TList;
    Item: PItem;
    FavoritesMenu: TMenuItem;
    FavoritesPidl: PItemIDList;
    Desktop: IShellFolder;
    FCaption: string;
    FResolveUrl: TResolveUrl;
    FOptions: TOptions;
    FMenuPos: Integer;
    FChannels : Boolean;
    FMaxWidth: Integer;
    FMainMenu: TMainmenu;
    FLocalization: TLocalization;
    FWebbrowser: TWebbrowser;
    FOnUrlSelected: TOnUrlSelectedEvent;
    procedure OrganizeFavorite(Sender: TObject);
    procedure AddFavorite(Sender: TObject);
    procedure FavoritesImport(Sender: TObject);
    procedure FavoritesExport(Sender: TObject);
  protected
    { Protected declarations }
    procedure BuildOptionsMenu;
    procedure AddMenu(Menu: TMenuItem; FullID: PItemIDList);
    procedure AddDummy(menu: TMenuItem);
    procedure MenuClick(Sender: TObject);
    procedure AddEmpty(menu: TMenuItem);
    procedure DestroyList;
  public
    { Public declarations }
    procedure CreateMenu;
    procedure ReBuildMenu;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published declarations }
    property Webbrowser: TWebbrowser read FWebbrowser write FWebbrowser;
    property Localization: TLocalization read FLocalization write FLocalization;
    property Options: TOptions read FOptions write FOptions;
    property MainMenu: TMainMenu read FMainMenu write FMainMenu;
    property Menupos: Integer read FMenuPos write FMenuPos;
    property MaxWidth: Integer read FMaxWidth write FMaxWidth;
    property Caption: string read FCaption write FCaption;
    property ResolveUrl: TResolveUrl read FResolveUrl write FResolveUrl;
    property Channels: Boolean read FChannels write FChannels;
    property OnURLSelected: TOnURLSelectedEvent read FOnURLSelected write FOnURLSelected;
  end;

procedure Register;

implementation

const
  CLSID_ShellUIHelper: TGUID = '{64AB4BB7-111E-11D1-8F79-00C04FC2FBE1}';

var
  ChannelShortcut, InternetShortcut: string;
  Folder: IShellFolder;
  p: procedure(Handle: THandle; Path: PChar); stdcall;


function SortFunc(Item1, Item2: Pointer): Integer;
begin
  Result := SmallInt(Folder.CompareIDs(0, PItem(Item1).ID, PItem(Item2).ID));
end;

procedure TFavoritesMenu.FavoritesExport(Sender: TObject);
var
  Sh: ISHellUIHelper;
begin
  CoCreateInstance(CLSID_SHELLUIHELPER, nil, CLSCTX_INPROC_SERVER,
    IID_IShellUIHelper, Sh);
  sh.ImportExportFavorites(FALSE, '');
  Rebuildmenu;
end;

procedure TFavoritesMenu.FavoritesImport(Sender: TObject);
var
  Sh: ISHellUIHelper;
begin
  CoCreateInstance(CLSID_SHELLUIHELPER, nil, CLSCTX_INPROC_SERVER,
    IID_IShellUIHelper, Sh);
  sh.ImportExportFavorites(TRUE, '');
  Rebuildmenu;
end;

procedure TFavoritesMenu.AddDummy(menu: TMenuItem);
var
  Dummy: TMenuItem;
begin
  Dummy := TMenuItem.Create(self);
  Dummy.Visible := False;
  Menu.add(Dummy);
end;

procedure TFavoritesMenu.AddEmpty(menu: TMenuItem);
var
  Empty: TMenuItem;
begin
  Empty := TMenuItem.Create(self);
  Empty.Caption := ' (Empty) ';
  Empty.Enabled := False;
  Menu.add(Empty);
end;

procedure TFavoritesMenu.AddMenu(Menu: TMenuItem; FullID: PItemIDList);
var
  MenuItem: TMenuItem;
  EnumList: IEnumIDList;
  ID: PItemIDList;
  NumIDs: LongWord;
  TempList: TList;
  I: Integer;
begin
  TempList := TList.Create;
  Desktop.BindToObject(FullID, nil, IID_IShellFolder, Pointer(Folder));
  Folder.EnumObjects(Application.Handle, SHCONTF_FOLDERS or SHCONTF_NONFOLDERS,
    EnumList);
  while EnumList.Next(1, ID, NumIDs) = S_OK do
  begin
If not Channels and IsChannel(ChannelShortcut, Folder, ID) then continue;
    Item := New(PItem);
    Item.ID := CopyPidl(ID);
    Item.FullID := ConcatPIDLs(FullID, ID);
    Item.Folder := IsFolderEx(ChannelShortcut, Folder, ID);
    Item.Created := False;
    TempList.Add(Item);
  end;
  DisposePidl(ID);
  if TempList.Count = 0 then begin
    AddEmpty(Menu);
    TempList.Free;
    exit;
  end;
  TempList.Sort(SortFunc);
  for I := 0 to TempList.Count - 1 do begin
    List.Add(PItem(Templist[i]));
    MenuItem := TMenuItem.Create(Menu);
    MenuItem.SubmenuImages := Images;
    MenuItem.OnClick := MenuClick;
    MenuItem.Tag := Counter;
    MenuItem.Caption := GetDisplayName(Folder, PItem(TempList[i])^.ID);
    if Length(MenuItem.Caption) > FMaxWidth then
      MenuItem.Caption := Copy(MenuItem.Caption, 1, FMaxWidth) + '...';
    MenuItem.ImageIndex := GetImageIndex(PItem(TempList[i])^.FullID);
    Menu.Add(MenuItem);
    Inc(Counter);
    if PItem(TempList[i])^.Folder then AddDummy(MenuItem);
  end;
  TempList.Free;
end;


procedure TFavoritesMenu.BuildOptionsMenu;
begin
  if AddFavorites in FOptions then
    Favoritesmenu.Add(NewItem(FLocalization.FAddFavorites, 0,
      False, True, addfavorite, 0, ''));
  if OrganizeFavorites in FOptions then
    Favoritesmenu.Add(NewItem(FLocalization.FOrganizeFavorites, 0,
      False, True, organizefavorite, 0, ''));
  if FavoritesMenu.Count > 0 then
    Favoritesmenu.Add(NewItem('-', 0, False, True, nil, 0, ''));
  if IE5_Installed then
  begin
    if ImportFavorites in FOptions then
      Favoritesmenu.Add(NewItem(FLocalization.FImportFavorites, 0,
        False, True, FavoritesImport, 0, ''));
    if ExportFavorites in FOptions then
      Favoritesmenu.Add(NewItem(FLocalization.FExportFavorites, 0,
        False, True, FavoritesExport, 0, ''));
    if (ImportFavorites in FOptions) or (ExportFavorites in FOptions) then
      Favoritesmenu.Add(NewItem('-', 0, False, True, nil, 0, ''));
  end;
end;

procedure TFavoritesMenu.CreateMenu;
var
  FileInfo: TSHFileInfo;
begin
  Counter := 0;
  List := TList.Create;
  Images := TImagelist.Create(self);
  Images.ShareImages := True;
  Images.DrawingStyle := dsTransparent;
  Images.Handle := SHGetFileInfo(Pchar(FavoritesPidl), 0, FileInfo,
    SizeOf(FileInfo), SHGFI_PIDL or SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
  FavoritesMenu := TMenuitem.Create(self);
  FavoritesMenu.SubmenuImages := Images;
  FavoritesMenu.Caption := FCaption;
  if Assigned(FMainMenu) then begin
    if FMenuPos > FMainMenu.Items.Count + 1 then
      FMenuPos := FMainMenu.Items.Count + 1 else
      if FMenuPos <= 0 then FMenuPos := 1;
    FMainMenu.Items.Insert(FMenuPos - 1, FavoritesMenu);
  end;
  BuildOptionsMenu;
  AddMenu(FavoritesMenu, FavoritesPidl);
end;

procedure TFavoritesMenu.ReBuildMenu;
begin
  DestroyList;
  List := TList.Create;
  FavoritesMenu.Clear;
  BuildOptionsMenu;
  AddMenu(FavoritesMenu, FavoritesPidl);
end;

constructor TFavoritesMenu.Create;
begin
  FLocalization := TLocalization.Create;
  FLocalization.FAddFavorites := 'Add to Favorites';
  FLocalization.FOrganizeFavorites := 'Organize Favorites';
  FLocalization.FImportFavorites := 'Import Favorites';
  FLocalization.FExportFavorites := 'Export Favorites';
  SHGetDesktopFolder(Desktop);
  SHGetSpecialFolderLocation(Application.Handle, CSIDL_FAVORITES, FavoritesPIDL);
  FCaption := ExtractfileName(GetFileName(Desktop, FavoritesPidl));
  with TRegistry.Create do
  begin
    RootKey := HKEY_CLASSES_ROOT;
    if OpenKey('ChannelShortcut', FALSE)
      then ChannelShortCut := ReadString('') else ChannelShortcut := 'Channel Shortcut';
    Closekey;
    if OpenKey('InternetShortcut', FALSE)
      then InternetShortCut := ReadString('') else InternetShortcut := 'Internet Shortcut';
    Closekey;
    Free;
  end;
  FMaxWidth:=50;
  FMenuPos := 1;
  FOptions := [addFavorites, organizeFavorites];
  inherited;
end;

procedure TFavoritesMenu.DestroyList;
var
  I: Integer;
begin
  if list <> nil then
  begin
    for I := 0 to List.Count - 1 do
    begin
      DisposePIDL(PItem(List[i]).ID);
      DisposePIDL(PItem(List[i]).FULLID);
      Dispose(PItem(List[i]));
    end;
    Counter := 0;
    List.Free;
  end;
end;

destructor TFavoritesMenu.Destroy;
begin
  FLocalization.Free;
  DestroyList;
  inherited;
end;

procedure Register;
begin
  RegisterComponents('Samples', [TFavoritesMenu]);
end;

end.
Ответить с цитированием
  #2  
Старый 16.10.2010, 20:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

много кода, причем нафиг ненужного. не понятен смысл оформления этого в виде компонента. а если ты сменишь библиотеку для меню? переписывать твой компонент?

вообще, избранное хранится в виде файлов в известном месте (системная папка). Достаточно прочто считать оттуда список файлов и создань нужные пункты меню. все это надо сделать при старте программы.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:20.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025