喫茶XRAYトップページ


[7101] メモリーが足りません返信 削除
2013/12/7 (土) 11:13:11 andy
メモリーが足りませんと出ましたので
FastMM4を使ってみたところ、いっぱい出てきました。

以下のコードが原因でした。
type
PMeisyoData = ^TPMeisyoData;
TPMeisyoData = record
 id:integer;
 str:string;
  end;


function NewFamilyData(FD:TPMeisyoData):PMeisyoData;
  begin
   New(result);
   result^ := FD;
  end;

//登録時
procedure TForm1.Button1Click(Sender: TObject);
var TM:TPMeisyoData;
begin
 tm.Id:=1;
 tm.str:='テスト';
 with Grid1 do
  Objects[1,1]:=TObject(NewFamilyData(tm));
end;

//取り出し
procedure TForm1.Button2Click(Sender: TObject);
var TM:TPMeisyoData;
begin
 with Grid1 do
  tm:=PMeisyoData(Objects[1,1])^;
  ShowMessage('id:'+inttostr(tm.id)+' 文字:'+tm.str);
end;

勝手に開放してくれると思っていましたがそうではなかったみたいです。




[7103] Re:メモリーが足りません返信 削除
2013/12/7 (土) 16:34:50 Mr.XRAY
▼ andyさん

> 勝手に開放してくれると思っていましたがそうではなかったみたいです。

ですね.
ここの List 8 の

http://mrxray.on.coocan.jp/Halbow/Notes/N023.html

procedure TForm1.FormDestroy(Sender: TObject);
のような感じでしょうか


[7104] Re2:メモリーが足りません返信 削除
2013/12/8 (日) 09:55:51 andy
▼ Mr.XRAYさん

>> 勝手に開放してくれると思っていましたがそうではなかったみたいです。
>
> ですね.
> ここの List 8 の
>
> http://mrxray.on.coocan.jp/Halbow/Notes/N023.html
>
> procedure TForm1.FormDestroy(Sender: TObject);
> のような感じでしょうか


返信ありがとうございます。

procedure TForm1.FormDestroy(Sender: TObject);
 var i:integer;
 begin
  with Grid1 do
   for i:=0 to rowcount-1 do
    Dispose(PMeisyoData(Objects[0,i]));
 end;

で開放できました。

しかし、Grid1のデータを参照しているGrid2での開放はうまくいかないみたいです。
1日半かけて、全プログラムを別のやり方で対応していましたので
とても疲れました。
これまで、メモリーのことなど気にもかけていなかったので、エラーが
出なければいいと思っていた付けが出ました。


[7105] Re3:メモリーが足りません返信 削除
2013/12/8 (日) 10:11:25 Mr.XRAY
▼ andyさん

> しかし、Grid1のデータを参照しているGrid2での開放はうまくいかないみたいです。

なるほど,そういうのって結構面倒ですよね.ハッキリ言って.

> これまで、メモリーのことなど気にもかけていなかったので、

Delphi は特殊なことをしない限り,気にする必要がないですよね.
Delphi を使い始めた頃,このことにも驚いたものです.
じゃぁ,特殊とはどんなことなんだ,と聞かれても困りますが.ハハハッ

インターフェイスのインスタンスだって,OleVaiant 型の変数だって,
イベントのローカル内だったら気にする必要はないし,
もちろん,その中で初期化する必要があることもありますが.
また,初期化してから使用した方がいい場合もありますが.


[7106] Re4:メモリーが足りません返信 削除
2013/12/8 (日) 14:19:53 andy
▼ Mr.XRAYさん
>
> > しかし、Grid1のデータを参照しているGrid2での開放はうまくいかないみたいです。
>
> なるほど,そういうのって結構面倒ですよね.ハッキリ言って.
>
> > これまで、メモリーのことなど気にもかけていなかったので、
>
> Delphi は特殊なことをしない限り,気にする必要がないですよね.
> Delphi を使い始めた頃,このことにも驚いたものです.
> じゃぁ,特殊とはどんなことなんだ,と聞かれても困りますが.ハハハッ
>
> インターフェイスのインスタンスだって,OleVaiant 型の変数だって,
> イベントのローカル内だったら気にする必要はないし,
> もちろん,その中で初期化する必要があることもありますが.
> また,初期化してから使用した方がいい場合もありますが.


やっと、問題が解決しましてほっとしています。
後、AdvTabSetというタブコントロールを貼り付けただけで
出ていましたので、SpeedButtonで代用して置き換えました。

別の、プログラムでもやって見ます。

INCM/CMT
Cyclamen v3.82