1.uses ActiveX//加上ActiveX单元initialization
    OleInitialize(nil);
finalization
    try
      OleUninitialize;
    except
end;这些代码加在 end. 前!2.遍历收藏夹目录取出所有文件动态添加到菜单上!

解决方案 »

  1.   

    unit FavoritesMenu;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Menus;type
      TUrlNotifyEvent = procedure(Sender: TObject; Url: string) of object;  TFavoritesMenu = class(TComponent)
      private
        { Private declarations }
        FMenuItem: TMenuItem;
        FMaxLength: integer;
        FOnUrlClick: TUrlNotifyEvent;
        FImageFolder: integer;
        FImageUrl: integer;
        FSorted: boolean;
        procedure FillFavorites(Directory: string; AMenuItem: TMenuItem);
        function CreateMenuOption(AFileName: string; AMenuItem: TMenuItem):
          TMenuItem;
        function CreateMenuOptionDir(AFileName: string;
          AMenuItem: TMenuItem): TMenuItem;
        procedure DoClickUrl(Sender: TObject);
        function ReadUrl(AFileName: string): string;
      protected
        { Protected declarations }
        procedure Notification(AComponent: TComponent; Operation: TOperation);
          override;
      public
        { Public declarations }
        constructor Create(AOwner: TComponent); override;
        procedure Refresh;
      published
        { Published declarations }
        property MenuItem: TMenuItem read FMenuItem write FMenuItem;
        property MaxLength: integer read FMaxLength write FMaxLength default 30;
        property ImageFolder: integer read FImageFolder write FImageFolder default 0;
        property ImageUrl: integer read FImageUrl write FImageUrl default 1;
        property OnUrlClick: TUrlNotifyEvent read FOnUrlClick write FOnUrlClick;
        property Sorted: boolean read FSorted write FSorted default True;
      end;implementationuses Registry, Inifiles;{ TFavoritesMenu }constructor TFavoritesMenu.Create(AOwner: TComponent);
    begin
      inherited;
      FMaxLength := 30;
      FImageFolder := 0;
      FImageUrl := 1;
      FSorted := True;
    end;procedure TFavoritesMenu.DoClickUrl(Sender: TObject);
    begin
      if Assigned(FOnUrlClick) then FOnUrlClick(Sender, TMenuItem(Sender).Hint);
    end;function TFavoritesMenu.ReadUrl(AFileName: string): string;
    var
      Reg: TIniFile;
    begin
      Reg := TIniFile.Create(AFileName);
      result := Reg.ReadString('InternetShortcut', 'URL', 'non url');
      Reg.Free;
    end;function TFavoritesMenu.CreateMenuOption(AFileName: string; AMenuItem:
      TMenuItem): TMenuItem;
    var
      Item: TMenuItem;
      Cap: string;
      Url: string;
    begin
      Item := TMenuItem.Create(AMenuItem);
      Cap := Copy(ExtractFileName(AFileName), 1,
        Length(ExtractFileName(AFileName)) - 4);
      if Length(Cap) > FMaxLength then
        Cap := Copy(Cap, 1, FMaxLength) + '..';
      Item.ImageIndex := FImageUrl;
      Item.Caption := Cap;
      Item.Hint := ReadUrl(AFileName);
      Item.OnClick := DoClickUrl;
      AMenuItem.Add(Item);
      result := Item;
    end;function PosRight(sub: char; s: string): integer;
    var
      i: integer;
    begin
      result := -1;
      for i := Length(s) downto 1 do
        if s[i] = sub then
        begin
          result := i;
          break;
        end;
    end;function TFavoritesMenu.CreateMenuOptionDir(AFileName: string; AMenuItem:
      TMenuItem): TMenuItem;
    var
      Item: TMenuItem;
      p: integer;
    begin
      Item := TMenuItem.Create(AMenuItem);
      p := PosRight('\', AFileName);
      Item.Caption := Copy(AFileName, p + 1, Length(AfileName));
      Item.ImageIndex := FImageFolder;
      if FSorted then
        AMenuItem.Insert(0, Item)
      else
        AMenuItem.Add(Item);
      result := Item;
    end;procedure TFavoritesMenu.FillFavorites(Directory: string; AMenuItem: TMenuItem);
    var
      search: TSearchRec;
      Item: TMenuItem;
    begin
      if Directory[length(Directory)] <> '\' then Directory := Directory + '\';
      if FindFirst(Directory + '*.*', faArchive + fadirectory, search) = 0 then
      begin
        repeat
          if ((search.Attr and fadirectory) = fadirectory) and (search.name[1] <>
            '.') then
          begin
            Item := CreateMenuOptionDir(Directory + search.Name, AMenuItem);
            FillFavorites(Directory + search.Name, Item);
          end
          else if ((search.Attr and faArchive) = faArchive) then
            CreateMenuOption(Directory + search.Name, AMenuItem);
        until FindNext(search) <> 0;
        FindClose(search);
      end;
    end;procedure TFavoritesMenu.Refresh;
    var
      Reg: TRegistry;
      InitDir: string;
    begin
      Reg := TRegistry.Create;
      Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', false);
      InitDir := Reg.ReadString('Favorites');
      Reg.Free;
      FillFavorites(InitDir, FMenuItem);
    end;procedure TFavoritesMenu.Notification(AComponent: TComponent;
      Operation: TOperation);
    begin
      inherited;
      if (Operation = opRemove) and (AComponent = FMenuItem) then FMenuItem := nil;
    end;end.
      

  2.   

    TO
     ehom(?!) 兄:
      我用USEs Activex ,编辑时,报错呀。而且你说把初始化语写在END前,是什么意思,可以详细点描述吗?
      

  3.   

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Menus;一般程序前,不都有这些东东?加个Activex单元(其实OLE2也可以!^_^)!
    然后所有程序最后不都有个"end."?
    initialization
        OleInitialize(nil);
    finalization
        try
          OleUninitialize;
        except
    end;
    加在那个"end."前!
      

  4.   

    谢谢,
    TO
     ehom(?!) 兄:编辑菜单的查找(在当前网页)功能应该怎么实现。好像用WebBrowser1.ExecWB(OLECMDID_FIND, OLECMDEXECOPT_PROMPTUSER);
    不行。
      

  5.   

    ehom(?!) 兄:
    我在吗?
      

  6.   

    with WebBrowser1.Application as IOleobject do
    DoVerb(OLEIVERB_UIACTIVATE, nil, WebBrowser1, 0, Handle, GetClientRect);上面程序可以让WebBrowser获得焦点!
    然后用SendKeys函数向WebBrowser发送Ctrl+F使用IOleCommandTarget接口的成员函数
    var
    VI, VO: OleVariant;
    IECommand: IOleCommandTarget;IECommand := WebBrowser1.Document as IOleCommandTarget;
    IECommand.Exec(nil, OLECMDID_FIND,OLECMDEXECOPT_DODEFAULT, VI,VO);也可以自己写代码
    var
      Doc: IHtmlDocument2;
      TxtRange: IHtmlTxtRange;
    begin
    Doc :=WebBrowser1.Document as IHtmlDocument2;
    Doc.SelectAll;
    TxtRange :=Doc.Selection.CreateRange as IHtmlTxtRange;
    TxtRange.FindText('Test',0.0);
    TxtRange.Select;
    end;
      

  7.   

    TO
     ehom(?!) 兄:var
            VI, VO: OleVariant;
            IECommand: IOleCommandTarget;
    begin
            with WebBrowser1.Application as IOleobject do
                    DoVerb(OLEIVERB_UIACTIVATE, nil, WebBrowser1, 0, Handle, GetClientRect);
            //上面程序可以让WebBrowser获得焦点!
            //然后用SendKeys函数向WebBrowser发送Ctrl+F
            //使用IOleCommandTarget接口的成员函数
            IECommand := WebBrowser1.Document as IOleCommandTarget;
            IECommand.Exec(nil, OLECMDID_FIND,OLECMDEXECOPT_DODEFAULT, VI,VO);
    end;
    但是执行这段话,网页上一点反映都没有呀,是什么原因呀?
      

  8.   

    是吗?下面代码我也没用过,不过用IOleCommandTarget接口来打开打印窗口可以!
    var
    VI, VO: OleVariant;
    IECommand: IOleCommandTarget;IECommand := WebBrowser1.Document as IOleCommandTarget;
    IECommand.Exec(nil, OLECMDID_FIND,OLECMDEXECOPT_DODEFAULT, VI,VO);那就用第一和第三种方法!