今作っているブラウザのメニューにお気に入りのメニューを
追加したいのです。動的メニューの追加の方法は検索して
見つけたのですが、お気に入りで言うフォルダ部分を
表現するためのサブメニューがうまく作れなくて困っています。
→本家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;
お気に入りといっても上で書いた通り、タブブラウザサンプルの
お気に入りファイルなので、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)
タブブラウザJanusのソースを解読したら
解決できてしまいました。(>_<)
本当にすみませんでした><
ツイート | ![]() |