レコード型について

解決


印刷屋  2007-03-12 05:46:27  No: 25271  IP: [192.*.*.*]

レコード型で保持型にTFontとかTBrushとかその下にも細かいプロパティ持ってる
型を設定するのはよくないのでしょうか?

TPrintData = record
  Font:TFont;
  Brush:TBrush;
  Pen:TPen;

などなどしてると、動作が不安定になってしまいます。

やっぱ細かく
TPrintData = record
  FontName:String;
  FontStyle:TFontStyles;
  FontColor:TColor;
  BrushColor:TColor;
  BrushStyle:TBrushStyle;
したほうがいいんでしょうか。

編集    削除
HOta  2007-03-12 07:31:50  No: 25272  IP: [192.*.*.*]

問題ないはずです。

編集    削除
印刷屋  2007-03-12 08:41:02  No: 25273  IP: [192.*.*.*]

現状、細かくして保存してるんですが、
最初、動的配列で
SetLength(PrintData,count);
1レコづつ追加してて、
Fontにはフォントダイアログをそのまま突っ込む
PrintData.Font := FontDialog.Font;
てやってから、印刷時に
Canvas.Font := PrintData.Font;
つっこむと、フォント内容がデフォルトの「MSゴシック」に戻ってるんですよね。

あと、実行中にアドレスエラーも起きたりしてたんで、ソースをじっくり眺めたんですが原因分からずにレコード項目を細かくしたんです。

環境は、Del7 + Windows2000です

編集    削除
orz  2007-03-12 17:08:38  No: 25274  IP: [192.*.*.*]

> PrintData.Font := FontDialog.Font;
PrintDataのFont値が、FontDialogのFontプロパティに置き換わる
当初、PrintData.Font <> FontDialog.Font が成り立っているなら、
PrintData.Font.Assign(FontDialog.Font) とすべき。

> PrintData.Font := FontDialog.Font;
> てやってから、印刷時に
> Canvas.Font := PrintData.Font;
上記理由により、FontDialog が破棄済みだったりすると、アクセス違反の
エラーが発生します。
PrintData.Fontは、FontDialogのFontプロパティのクラスを参照しているため、
Canvas.Fontの設定時に、メモリからなくなった領域を参照することになります。

動的配列で配列数を増やしても、TPrintData.Font のインスタンスを用意してくれません。
そのため、TFont,TBrush等のクラスをCreateしなくてもよいものに変えると
エラーがでなくなるのでしょう。

編集    削除
えーと  2007-03-12 18:02:13  No: 25275  IP: [192.*.*.*]

orz さんと同じですが、

インスタンスを生成してないので、たんなる参照を受け取ってるだけで、内容の
コピーが行われてないんだと思います。

この例のようにクラスをフィールドにする場合は、レコード型ではなく、クラス
にするべきです。コンストラクタでフィールドを生成し、デストラクタで Free
するようにして、リークを防ぐべきです。

編集    削除
印刷屋  2007-03-13 08:01:18  No: 25276  IP: [192.*.*.*]

ありがとうございます。
なんとなく分かりました。
orzさんが教えてくれたAssignは、配列増やすその都度にCreateして、するべきなんでしょうか?
もちろん配列減らす前に解放してやらないとメモリリークになるんですよね?

編集    削除
orz  2007-03-13 17:06:25  No: 25277  IP: [192.*.*.*]

> orzさんが教えてくれたAssignは、配列増やすその都度にCreateして、するべきなんでしょうか?
Yes

> もちろん配列減らす前に解放してやらないとメモリリークになるんですよね?
Yes

自分なら、めんどくさいので、Createの必要のない型でレコード型を構成します。
または、TPrintDataをクラス型にし、TList(TObjectList)あたりで管理します。

編集    削除
印刷屋  2007-03-14 05:46:27  No: 25278  IP: [192.*.*.*]

そうですね。
面倒くさいのでCreateなしでいきます。

編集    削除