以下、Delphi5 のソースより一部抜粋
TGraphicClass = class of TGraphic;
procedure TPicture.LoadFromFile(const Filename: string);
var
NewGraphic: TGraphic;
GraphicClass: TGraphicClass;
begin
GraphicClass := FileFormats.FindExt(Ext);
NewGraphic := GraphicClass.Create; //(1)
end;
(1)で停止し、式評価するとTBitmap, TJpegImage, TGLDPNG 等の
クラス名が表示されます。
で、Createは、それぞれのクラスのCreateが行われます。
ところが、自作で以下のようにすると(一部抜粋)、(2)からのトレース実行で、
いきなりTObjectのCreateに突入してしまいます。
もちろん、graphClass を式評価したら、TBitmap, TJpegImage, TGLDPNG 等の
クラス名を確認できています。
FileExtToGraphicClass のステップ実行でも、正しいクラス型を返していることは確認済み
function FileExtToGraphicClass(aFileExt: String): TGraphicClass;
begin
if (aFileExt = 'BMP') then begin
Result := Graphics.TBitmap;
end
else if (aFileExt = 'PNG') then begin
{PNG}
Result := TGLDPNG;
end;
end;
function FileExtToGraphicClassInst(aFileExt: String): TGraphic;
var
graphClass: TGraphicClass;
begin
graphClass := FileExtToGraphicClass(aFileExt);
if graphClass <> nil then begin
Result := graphClass.Create; //(1)
end
else begin
Result := nil;
end;
end;
このような現象に遭遇した方いませんか?
間違った
> function FileExtToGraphicClassInst(aFileExt: String): TGraphic;
> (略)
> Result := graphClass.Create; //(2)
https://www.petitmonte.com/bbs/answers?question_id=2811
あ〜・・・同じ現象発見
しかも、解決していないし・・・
D5のせいですか?
ここからのスレッドで、
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=034846
以下のように回答がありました。
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=034851
> 原因は TGraphic の Create が protected だから
Graphics.pas ユニット以外から、TGraphicsのCreateを呼べないため
TObjectのCreateに飛んでしまうという話。
Delphi 6 の TGraphic を、見るとpublic になっているから、D6以降は
大丈夫のようですね。
くやしい・・・。
D5はインストールしていないので確認できませんが
Create を Public にもってきて Graphics.pas を再構築してしまえばいいんでない?
> Create を Public にもってきて Graphics.pas を再構築してしまえばいいんでない?
ソースを上記の通り改変して、コンパイルの通るトコに置くのと同じコトかと思いますが、
Formで「Iconが、異なるバージョンのGraphics.pas により〜〜」というエラーになり、コンパイルすらできなくなりました。
スコープとか変わるので、Graphics.pas をusesしているもの全て再構築しないといけない気がします。
>スコープとか変わるので、Graphics.pas をusesしているもの全て再構築しないといけない気がします。
その通りです。なのでソースが無いとそのコンポーネント等は使えなくなります。
おかげで QuickReport とか使えませんよ?
でもClasses.pas は DLLでFormsを使用するとメモリーリークを防ぐために書き換えないと駄目なんだよね〜
ツイート | ![]() |