class of TGraphic

解決


ofZ  2007-12-21 21:59:38  No: 29049

以下、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;

このような現象に遭遇した方いませんか?


ofZ  2007-12-21 22:00:40  No: 29050

間違った
> function FileExtToGraphicClassInst(aFileExt: String): TGraphic;
> (略)
>    Result := graphClass.Create;  //(2)


ofZ  2007-12-21 22:24:40  No: 29051

https://www.petitmonte.com/bbs/answers?question_id=2811

あ〜・・・同じ現象発見
しかも、解決していないし・・・
D5のせいですか?


ofZ  2007-12-21 23:45:46  No: 29052

ここからのスレッドで、
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以降は
大丈夫のようですね。
くやしい・・・。


KHE00221  URL  2007-12-22 03:27:03  No: 29053

D5はインストールしていないので確認できませんが

Create を Public にもってきて Graphics.pas を再構築してしまえばいいんでない?


ofZ  2007-12-29 03:13:11  No: 29054

> Create を Public にもってきて Graphics.pas を再構築してしまえばいいんでない?
ソースを上記の通り改変して、コンパイルの通るトコに置くのと同じコトかと思いますが、
Formで「Iconが、異なるバージョンのGraphics.pas により〜〜」というエラーになり、コンパイルすらできなくなりました。
スコープとか変わるので、Graphics.pas をusesしているもの全て再構築しないといけない気がします。


KHE00221  2007-12-29 19:01:41  No: 29055

>スコープとか変わるので、Graphics.pas をusesしているもの全て再構築しないといけない気がします。

その通りです。なのでソースが無いとそのコンポーネント等は使えなくなります。

おかげで QuickReport とか使えませんよ?

でもClasses.pas は DLLでFormsを使用するとメモリーリークを防ぐために書き換えないと駄目なんだよね〜


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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