型無しパラメータの型を知る方法を教えて下さい

解決


ahsan  2008-05-21 02:39:27  No: 30750

テキストファイルやバイナリファイルを読み書きする際、
AssignFileで最初関連付けてから,Reset,BlockRead,BlockWrite・・等
を使用して処理しています。
これらの処理の中で一部自作の処理を行いたいので、
AssignFileExやResetEx,BlockReadEx,BlockWriteEx・・等を作成し
その中から、従来のAssignFile等を呼び出したいのですが、互換の無い型
のエラーが発生します。
例)
function AssignFileEx(var f; FileName: string):integer;
begin
 if (FileName[1] = 'A') or (FileName[1] = 'a') then begin
  自作処理
 end else begin
  AssignFile(f,FileName);<===互換の無い型のエラー
 end;
 ・
 ・
 ・
end;
それで、
 AssignFile(Textfile(f),FileName);
のようにキャストをするとエラーは出ないのですが、
AssignFileExの呼び出し側がfile型を渡してきてるかもわかりません。
AssignFileEx内で、引数:fが
Textfile型かfile型か区別できるような方法はあるのでしょうか?
教えて下さい。


Basser  2008-05-21 23:08:36  No: 30751

区別していませんが下記でどうでしょうか?

  AssignFile(Text(F), FileName);


もにゃ  2008-05-21 23:45:49  No: 30752

型なんて飾りです。
要はメモリを何バイト確保するかだけなので
procedure TForm1.Button1Click(Sender: TObject);
var
 f:file;
 t:Textfile;
begin
  Edit1.Text := inttostr(sizeof(t));
  Edit2.Text := inttostr(sizeof(f));
end;
で区別できます。
偉い人にはそれがわからないんですよ…


ahsan  2008-05-22 01:11:41  No: 30753

Basserさん、どうもありがとうございます。
テキストファイルやバイナリファイル共これが使えるのですか?

もにゃさん、どうもありがとうございます。
確かに、こうすると、サイズが異なるので区別できるのです。
AssignFileExの中ではサイズが、
両方共4(ポインタを格納する容量?)になるのです。


Basser  2008-05-22 02:03:33  No: 30754

>テキストファイルやバイナリファイル共これが使えるのですか?

System.pas内で宣言されている _Assign手続きは

  procedure _Assign(var T: Text; S: ShortString);

と宣言されています。

内部でこの手続きが呼び出されていると思うので、多分、大丈夫かと・・・
AssignFile及びAssignFileEx実行後のファイル変数の初期化内容は、同じように見受けられます。
(TFileRec型及びTTextRec型に型キャストして確認)

>もにゃさん、どうもありがとうございます。
>確かに、こうすると、サイズが異なるので区別できるのです。
>AssignFileExの中ではサイズが、
>両方共4(ポインタを格納する容量?)になるのです。

型なしパラメータだからでしよう。


もにゃ  2008-05-22 02:11:56  No: 30755

出し惜しみ失礼しました。
function AssignFileEx(var f; FileName: string):integer;
にさらに型情報パラメータを追加してしまえば良いということです
function AssignFileEx(var f; ftype:cardinal; FileName: string):integer;
みたいな感じで ftypeに型サイズを使用するとか。

もちろん特定の型しか扱わないのであれば
type
  TTestType = (ttFile,ttTextFile,ttOther);
function AssignFileEx(var f; ftype:TTestType; FileName: string):integer;
としても良いでしょうが、これだと型なしを使う御利益が減るかもです。


KHE00221  2008-05-22 20:51:37  No: 30756

>型なしパラメータだからでしよう。

そうじゃない var だから


KHE00221  2008-05-22 20:57:55  No: 30757

AssignFileEx を  overload すればいいんじゃないかな?

function AssignFileEx(var f:File; FileName: string):integer;overload;
begin
    //File時の処理
end;

function AssignFileEx(var f:TextFile; FileName: string):integer;overload;
begin
    //TextFile時の処理
end;


ahsan  2008-05-22 22:31:22  No: 30758

Basserさん、もにゃさん、KHE00221さんありがとうございます。

Basserさん、私もVCLのソース等を探したのですが、AssignFileで
探していたので、わからなかったのですね。そこまでわかりませんでした。

もにゃさん、実は私も、仕方が無いので、
同じ事(パラメータ追加)をしようとしていました。
こんな事をしようと思った目的は、現状のソースを極力触りたくなかった
ので、末端の処理で分岐させたかったのです。

KHE00221さん、行ってみました所、AssignFileEx内でSizeOf(f)が異なった
値になりました。引数の型の違いで、どちらか判定して呼び出して
くれるのですね。知りませんでした。
これで、区別出来ます。

みなさん、お手数をおかけしまして、ありがとうございました。


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

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






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