動的に追加したファイル名を削除するには?


オン赤  2002-06-09 18:30:04  No: 988

動的にMainMenu のFile に add で追加したファイル名を次のようにしてdelete したいのですが:
          MainMenu.Items[0].Delete(aa);
          MainMenu.Items[0].items[aa].Free;
私としては、こうしてヘルプの次の説明:
「Delete メソッドは,削除された項目のメモリは解放しません。メニューから項目を削除してその項目が使用していたメモリを解放するには,削除する項目の中で Free メソッドを呼び出します。」
にしたがっているつもりなのですが、どこかがまだ理解不十分なようです。お教え下さい。


にしの  2002-06-09 20:32:43  No: 989

プログラムは、順次実行されていることに注意してください。
MainMenu.Items[0].Delete(aa);
を実行した時点で、MainMenu.Items[0].Items[aa]はメニューから削除され、次のMainMenu.Items[0].Items[aa]では、上を実行する前のMainMenu.Items[0].Items[aa+1]になります。


オン赤  2002-06-09 22:20:13  No: 990

にしの  様、こんにちは。どうもありがとうございました。
なるほど、たしかにそうですね。
Free メソッドを書け、というこのヘルプの記述をどうやれば、ファイル・メニュー表示から、delete したファイル名を消せるのでしょうか?--何となくひどく恥ずかしい超初級の質問をしているみたい。。。


たかみちえ  URL  2002-06-09 22:55:25  No: 991

メニューのそれは一度やってる
(開いたファイルのりれきをとって、10個以上になったら10個目を消す)んですけど、
わたしはそれを、
"ただDeleteで消さずにFreeでけさないとメモリが開放されませんよ"という意味だと解釈しました。
まあ、上のはまだテスト中で、実際10個以上のりれきになったことが一度もないので、
どうとも言えませんけど…^^;

  ふつう、TStringListとかは、Createでつくって(ここがMenuItemだと、NewItem関数になったりするんでしょう)、
適当な処理に使ったあと、Free(MenuItemでもFreeですよね)で削除しますよね?
その際、Clearでなかを掃除したりしないです。
(そう考えると、ひどく不始末なんですけどねぇ…^^;)

  これと同じように、必要なときにNewItem関数でつくって、
不必要になったらFreeで消す…んじゃないでしょうか?
(よく分かりませんけど、最後のFreeは、Delphiがやってるのかもしれません。
  NewItemで項目を作って、実際に追加したあと、変数をFreeで消すと、
  実際に追加した項目まで消えちゃいましたから^^;
  MenuItemの変数を追加したら、その変数とメニュー項目は同一のものと
  考えられるのかも)


にしの  2002-06-10 00:02:47  No: 992

> Free メソッドを書け、というこのヘルプの記述をどうやれば、ファイル・メニュー表示から、delete したファイル名を消せるのでしょうか?

少し遠回しに考えてみるとできますよ。
「メニュー1からaa番目を消し、そのメニューの実体も消す」
の、「その」が、先に消されてしまうのがいけないので、「その」に当てはまる部分を先に保存しておけばいいのです。
「ターゲット(実体)は、メニュー1のaa番目のメニュー。メニュー1のaa番目を消して、ターゲット(実体)も消す」
ならば、aa番目という(相対的な)メニューでなく、ターゲットという、(絶対的な)メニューになりますね。

var
  TargetMenu: TMenuItem;
begin
  TargetMenu := MainMenu.Items[0].items[aa];
  MainMenu.Items[0].Delete(aa);
  TargetMenu.Free;
end;


にしの  2002-06-10 00:07:35  No: 993

今ヘルプを確認したら、FreeするとDeleteもされるようですね。
たかみちえさんの言う通りでした。


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








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