お気に入りをメニューに追加するには?

解決


みけにゃん  2005-02-03 02:06:23  No: 13018

今作っているブラウザのメニューにお気に入りのメニューを
追加したいのです。動的メニューの追加の方法は検索して
見つけたのですが、お気に入りで言うフォルダ部分を
表現するためのサブメニューがうまく作れなくて困っています。
→本家Actyでは実装している機能なのですが・・・(T_T)

今テストで作っているコードを載せます。
取り込むお気に入りのファイル形式はDelphi初めの一歩(delphi.sakura.vg)の
タブブラウザサンプル3と同じです。(階層番号,ページタイトル,URLのテキストファイル)

//引数に上位メニューアイテム、Caption、位置を受け取り、
//メニューを追加し、作成したメニューアイテムを返す関数
function TForm1.AddMenu(OwnerMenu : TMenuItem ;
Title : AnsiString; Hint: String; Index : Integer; Event: TNotifyEvent) : TMenuItem;
var
   NewItem : TMenuItem;
begin
   NewItem := TMenuItem.Create(self);
   NewItem.Caption := Title;
   NewItem.Hint    := Hint;
   NewItem.Visible := true;
   NewItem.Enabled := true;
   NewItem.OnClick := Event;
   OwnerMenu.Insert(Index ,NewItem);

   result := NewItem;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  P:PBookMarkItem;
  BookMark_TBL : TStringList;
  LevelA, LevelB, intA, intB, i, n : integer;
  BookMarkFile, tmpStr, TitleStr : String;
begin
  // まずは初期化
  LevelA := 0;
  LevelB := 0;
  intB   := 0;
  BookMarkFile := 'BookMark.txt';
  BookMark_TBL := TStringList.Create;
  try
    // ブックマークファイルがあればリストに取り込む
    if FileExists('BookMark.txt') <> False then
    begin
      BookMark_TBL.LoadFromFile('BookMark.txt');

      // ブックマークの終端まで続ける
      for i := 0 to BookMark_TBL.Count -1 do
      begin
        // ブックマークの文字列をワークに格納
        tmpStr := BookMark_TBL.Strings[i];
        // 'の最初の位置をintAに格納
        intA := Pos(',', tmpStr);

        // ワーク領域の配列番号が1になるまで続ける
        for n := Length(tmpStr) downto 1 do
        begin
          // ワーク領域の配列に'があったとき
          if tmpStr[n] = ',' then
          begin
            // intBに'のある配列番号を格納して抜ける
            intB := n;
            break;
          end;
        end;

        try
          // LevelAにワーク領域の左端の数字を格納する
          // Copy関数はMid関数とほぼ同じ使い方
          LevelA := StrToInt(Copy(tmpStr, 1, intA - 1));
        except
          // エラーが発生した場合はエラー表示をして抜ける
          on EConvertError do
          begin
            MsgBox('ブックマークの読み込みに失敗しました。');
            Exit;
          end;
        end;

        // ワーク領域からページのタイトル(,と,の間の文字列)を格納する
        TitleStr := Copy(tmpStr, intA + 1, intB - intA - 1);

        // ブックマークを作成
        New(P);

        // ワーク領域からURL(2個目の,1つ先の文字から最後まで)を格納する
        P^.URL := Copy(tmpStr, intB + 1, Length(tmpSTr) - intB);

        AddMenu(Favorites1, TitleStr, P^.URL, i, ItemClick);

{        // LevelAの階層が0以上のとき
        if LevelB > LevelA then
        begin
          // LevelBにLvelAの階層を格納する
          LevelB := LevelA;
          // メニューの階層がLvelA以上になるまで
          while Favorites1.Count > LevelA do
          begin
            // メニューを追加
            AddMenu(Favorites1, TitleStr, P^.URL, i, ItemClick);
          end;
        end
        // もし、LevelBがLevelA以下のとき
        else if LevelB < LevelA then
        begin
          // メニューを追加
          AddMenu(Favorites1, TitleStr, P^.URL, i, ItemClick);
          // LevelBにLevelAの階層を格納する
          LevelB := LevelA;
        end;
}
      end;
    end;
  finally
    // ブックマークを解放する
    BookMark_TBL.Free;
  end;
end;


みけにゃん  2005-02-03 23:38:13  No: 13019

お気に入りといっても上で書いた通り、タブブラウザサンプルの
お気に入りファイルなので、IEのオリジナルのお気に入りを
表示するわけではありません。(>_<)

Folderが来たら、ポップアップメニューに格納に格納して
同じ階層番号の間そのポップアップメニューに追加します。
階層番号にFolderがなければそのままメニューを追加するという仕様です。

どうかご教授ください(>_<)

タブブラウザサンプルのファイルの中身(例)
0,お気に入り,Folder
1,リンク,Folder
1,Microsoft ホームページ,http://www.microsoft.com/japan/
2,テスト,Folder
2,テストページ,http://aaa.bbb.ccc/~ddddd/
3,プログラミングライブラリ,http://madia.world.coocan.jp/

実際のメニューの階層(例)
+ブックマーク(&B)・・・親メニュー
↓ここから動的メニュー作成
 +お気に入り(0,Folder)
  +リンク(1,Folder)
   +Microsoft ホームページ(1,HP)
  +テスト(2,Folder)
   +テストページ(2,HP)
  +プログラミングライブラリ(3,HP)


みけにゃん  2005-02-04 02:06:00  No: 13020

タブブラウザJanusのソースを解読したら
解決できてしまいました。(>_<)

本当にすみませんでした><


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加