喫茶XRAYトップページ


[4745] [お気に入りに追加]のダイアログ表示返信 削除
2011/5/13 (金) 16:50:16 Mr.XRAY
[お気に入りに追加]のダイアログ表示のコードを書いてみました.
shdocvw.dll内のDoAddToFavDlgという関数で表示(モーダル表示)できるんだそうです.

VCLで未定義のWin32 API関数の使用
http://mrxray.on.coocan.jp/Delphi/Others/Usage_Win32API.htm#01

で,関数そのものを使うのは簡単にできるんですが.
やってみちら,文字が1文字分しか処理してくれんない.
この関数,Ansi版だったんですね.で,AnsiCharに直して動作しました.

う〜む.何か,つまらない.
サンプルプログラム集掲載はボツですね.
動作確認は,Windows 7 U64 + Delphi 2010(UP5)です.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShlObj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

  //PITEMIDLISTの使用にはusesにShlObjが必要
  //文字列はAnsiでないと正常動作しない
  function DoAddToFavDlg(
             hWindow     : HWND;
             wpszInitDir : PAnsiCHAR;
             cchInitDir  : UINT;
             wspzFile    : PAnsiCHAR;
             cchInitFDir : UINT;
             pidlBrowse  : PITEMIDLIST
             ): BOOL; stdcall; external 'shdocvw.dll';

var
  Form1: TForm1;

implementation

uses ActiveX;

{$R *.dfm}

//=============================================================================
//  お気に入りダイアログの表示(タスクバーにアイコン表示なし)
//
//  使用する関数のMSDNの記事より
//  http://msdn.microsoft.com/en-us/library/aa753580%28VS.85%29.aspx
//
//  BOOL DoAddToFavDlg(
//    HWND hwnd,
//    CHAR *pszInitDir,
//    UINT cchInitDir,
//    CHAR *pszFile,
//    UINT cchInitDir,
//    LPITEMIDLIST pidlBrowse
//  );
//
//  PItemIDListの使用にはusesにActiveXが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  wpszInitDir : array[0..MAX_PATH - 1] of AnsiChar;
  wpszFile    : array[0..MAX_PATH - 1] of AnsiChar;
  pidlBrowse  : PItemIDList;
begin
  StrPCopy(wpszFile, '素敵なサイト');
  //[お気に入り]フォルダの項目識別子を取得
  SHGetSpecialFolderLocation(Handle,
                             CSIDL_FAVORITES,
                             pidlBrowse);

  //DoAddToFavDlgはAnsi版であることに注意
  if DoAddToFavDlg(Handle,
                  wpszInitDir,  //終了後に入力した名前のフルパス名が戻ってくる
                  MAX_PATH,
                  wpszFile,     //終了後に入力した名前部分のみが戻ってくる
                  MAX_PATH,
                  pidlBrowse)   //作成先のフォルダを項目識別子で指定
                  then begin;


    //ここに実際の[お気に入り]への登録コードを書く
  end;

  //項目識別子の解放
  CoTaskMemFree(pidlBrowse);
end;

end.



[4746] Re:[お気に入りに追加]のダイアログ表示返信 削除
2011/5/13 (金) 19:39:22 Mr.XRAY
こっちの方がいいような気がします
このコードでは,実際に追加作業もします.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

  function AddUrlToFavorites(
             hWindow     : HWND;
             pszUrlW     : LPCWSTR;
             pszTitleW   : LPCWSTR;
             fDisplayUI  : BOOL
             ): Integer; stdcall; external 'shdocvw.dll';

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  お気に入りダイアログの表示(タスクバーにアイコン表示なし)
//
//  使用する関数のMSDNの記事より
//  http://msdn.microsoft.com/en-us/library/aa753579%28v=VS.85%29.aspx
//
//  STDAPI AddUrlToFavorites(
//      HWND hwnd,
//      LPCWSTR pszUrlW,
//      LPCWSTR pszTitleW,
//      BOOL fDisplayUI
//  );
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  AURL       : String;
  ATitle     : String;
  fDisplayUI : Boolean;
begin
  AURL   :=  'http://mrxray.on.coocan.jp/';
  ATitle := '素敵なサイト';
  //fDisplayUI := True;にするとダイアログを表示しない
  fDisplayUI := False;

  AddUrlToFavorites(Handle, PChar(AURL), PChar(ATitle), fDisplayUI);
end;

end.


[4747] Re2:[お気に入りに追加]のダイアログ表示返信 削除
2011/5/13 (金) 23:55:29 Mr.XRAY
2番目(AddUrlToFavorites関数を使用した)の動作確認環境が書いてありませんでした.
dllのバージョンは調べていません...

Windows XP(SP3) + Delphi 2010 + IE6
Windows Vista + IE7
Windows 7 U64 + IE8ではダイアログは表示しませんでした.
残念ですが.

最初のサンプルコードは,上のいずれでも動作しました.


[4748] Re3:[お気に入りに追加]のダイアログ表示返信 削除
2011/5/14 (土) 00:14:37 Mr.XRAY
参考までに,IShellUIHelperを使用したコードです.
これは,ダイアログのアイコンがタスクバーに(モードレス)表示されます.
Windows XP + IE6
Vista + IE7
Windows 7 U64 + IE8で表示されます.

ダイアログのハンドルを操作して,タスクバーのアイコンを非表示に
もできますが,クラス名が#32770なのて,ちょっと面倒ですね.
もっとも,タスクバーに非表示にしても,モーダル表示となるわけでは
ありません.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses SHDocVw, ComObj;

{$R *.dfm}

//=============================================================================
//  お気に入りダイアログの表示(タスクバーにアイコン表示あり)
//
//  IShellUIHelperの使用にはusesにSHDocVwが必要
//  CreateComObjectの使用にはusesにComObjが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  UIHelper : IShellUIHelper;
  AURL     : String;
  ATitle   : OleVariant;
begin
  UIHelper := CreateComObject(CLASS_ShellUIHelper) as IShellUIHelper;
  AURL     := 'http://mrxray.on.coocan.jp/';
  ATitle   := '素敵なサイト';

  UIHelper.AddFavorite(AURL, ATitle);
end;

end.


[4749] タスクバーのアイコンの表示制御返信 削除
2011/5/14 (土) 00:26:41 Mr.XRAY
>ダイアログのハンドルを操作して,タスクバーのアイコンを非表示に
>もできますが,クラス名が#32770なのて,ちょっと面倒ですね.


参考までに,メモ帳を起動して,メモ帳のタスクバーのアイコンの
非表示,表示を切り替えるサンプルです.
切り替えの時に,一旦メモ帳自身を非表示にするので,少しチラつきます.
#32770の場合は,環境によっては,他のダイアログを検出してしまう
可能性があるので,工夫が必要です.

また,この方法は,ウィンドウのスタイルをWS_EX_TOOLWINDOWとします.
したがって,キャプションバーの高さが低くなってしまいます.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private 宣言 }
    hMainWnd : HWND;
    Before : LongInt;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses ShellAPI;

{$R *.dfm}

//=============================================================================
//  テスト用に操作対象のアプリを起動.ここではメモ帳
//  ShellExecuteの使用にはusesにShellAPIが必要
//============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellExecute(Handle, 'open', 'Notepad.exe', nil, nil, SW_SHOW);
end;
//=============================================================================
//  タスクバーのアイコンを非表示にする
//============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  //操作対象のウィンドウハンドルを取得する
  //hMainWnd := Application.Handleなら自分自身
  hMainWnd := FindWindow('notepad', nil);

  if hMainWnd <> 0 then begin
    //スタイル変更等は一度非表示にする
    ShowWindow(hMainWnd, SW_HIDE);

    //前の設定を保存しておく
    Before := SetWindowLong(hMainWnd, GWL_EXSTYLE,
              GetWindowLong(hMainWnd, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);

    //Zオーダを変更したくないのでShowWindowではなくSetWindwoPosを使用
    SetWindowPos(hMainWnd, 0, 0, 0, 0, 0,
                 SWP_NOMOVE or HWND_BOTTOM        or
                 SWP_NOSIZE or
                 SWP_SHOWWINDOW);
  end else begin
    ShowMessage('メモ帳が見つかりません');
  end;
end;
//=============================================================================
//  対象アプリのウィンドウのスタイルを元に戻す
//============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
  //操作対象のウィンドウハンドルを取得する
  //hMainWnd := Application.Handleなら自分自身
  hMainWnd := FindWindow('notepad', nil);

  if hMainWnd <> 0 then begin
    //スタイル変更等は一度非表示にする
    ShowWindow(hMainWnd, SW_HIDE);

    SetWindowLong(hMainWnd, GWL_EXSTYLE, Before);
    //SetWindowPosでもいいがHideからShowにするので同じ
    //ここまでは非表示なので表示すれば必ずZオーダトップ
    ShowWindow(hMainWnd, SW_SHOWNORMAL);
  end else begin
    ShowMessage('メモ帳が見つかりません');
  end;
end;

end.


[4751] Re4:[お気に入りに追加]のダイアログ表示返信 削除
2011/5/14 (土) 21:57:19 Mr.XRAY
> 参考までに,IShellUIHelperを使用したコードです.

TEmbeddedWBコンポーネントですと,内部で処理してくれますので,
例えば,以下のようにダイアログを表示できます.

[942_TEmbeddedWBコンポーネント]
http://mrxray.on.coocan.jp/Delphi/plSamples/942_TEmbeddedWB.htm

procedure TForm1.Button1Click(Sender: TObject);
begin
  EmbeddedWB1.AddToFavorites(EmbeddedWB1.LocationURL,
                             EmbeddedWB1.Doc2.title);
end;


あるいは,TFavoritesMenuコンポーネントを配置して,

procedure TForm1.FormCreate(Sender: TObject);
begin
  FavoritesMenu1.CreateMenu;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FavoritesMenu1.AddFavorite(nil);
end;


[4756] Re:[お気に入りに追加]のダイアログ表示返信 削除
2011/5/15 (日) 12:45:17 Mr.XRAY
> う〜む.何か,つまらない.
> サンプルプログラム集掲載はボツですね.


と思ったのですが,追加しておきました.

[03__[お気に入りの追加]ダイアログをモーダル表示]
http://mrxray.on.coocan.jp/Delphi/plSamples/942_TEmbeddedWB.htm#03

[4763] ネット検索のノウハウ返信 削除
2011/5/17 (火) 10:42:46 Mr.XRAY
ネットでDelphiの参考となるコードを検索することが多いと思います.
手持ちの参考書と同時に,検索も1つノウハウだと思います.

この[03_[お気に入りの追加]ダイアログをモーダル表示]のリスト3
http://mrxray.on.coocan.jp/Delphi/plSamples/942_TEmbeddedWB.htm#list3
に,
procedure CreateIntShotCut(aFileName, aURL: PChar);
という関数のコードがあります.
これは,他のサイトのコードを借用しています.
これをどうやって見つけ出したかです.

まず,お気に入りですから,URLのショートカットです.
これをMicrosoftのキーワードを含めて検索します.
あるいは,SDKをインストールしていたら,この中を検索します.
参考コードがある場合があります.
IUniformResourceLocator関数を使用したサンプルがあります.
コードはC++です.
もしかしたらDelphiのコードにしたものがネット上にあるかも知れない.
と予測して検索する.という手順で見つけました.
見つけたら,このインターフェイスが,標準のDelphiのVCL内にあるか
確認します.また,このサンプルは,TEmbeddedWBコンポですから,
このソースも確認します.
なければ実装が必要ですから,今回はTEmbeddedWBのソースにありましたから,
インターフェイスの実装は必要ありませんでした.
このインターフェイスまたは定数が定義してあるpasファイルをusesに追加
します.


一般のDelhiの参考コードは,まず,Delphiのキーワードも含めて検索します.
当サイトのように,各ページにDelphiという語句があるページは見つけやすく
なります.逆に,当サイトの記事は,Delphiという語句がないと,ほとんど
検索結果に入ってきません.

なければ,Delphiの語句を抜いて検索します.
その際,例えばボタン関係の場合,Buttonではなく,TButtonのように,先頭に
Tを付けての検索もします.
結構違いがあります.

今はブログが全盛の時代で,検索すると,同じブログの同じ記事が検索リストに
出てきますが,当サイトの記事はそういうことはありません.
これは,基本的にどうしようもありません.

その他にもいろいろノウハウがあるかも知れません.
ちなみに,2チャンネルの記事もリストされますが,基本的に見ません.
貴重なサンプルがあるかも知れませんが,体質的に合いませんので(笑)


INCM/CMT
Cyclamen v3.82