テキストファイルやバイナリファイルを読み書きする際、
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型か区別できるような方法はあるのでしょうか?
教えて下さい。
区別していませんが下記でどうでしょうか?
AssignFile(Text(F), FileName);
型なんて飾りです。
要はメモリを何バイト確保するかだけなので
procedure TForm1.Button1Click(Sender: TObject);
var
f:file;
t:Textfile;
begin
Edit1.Text := inttostr(sizeof(t));
Edit2.Text := inttostr(sizeof(f));
end;
で区別できます。
偉い人にはそれがわからないんですよ…
Basserさん、どうもありがとうございます。
テキストファイルやバイナリファイル共これが使えるのですか?
もにゃさん、どうもありがとうございます。
確かに、こうすると、サイズが異なるので区別できるのです。
AssignFileExの中ではサイズが、
両方共4(ポインタを格納する容量?)になるのです。
>テキストファイルやバイナリファイル共これが使えるのですか?
System.pas内で宣言されている _Assign手続きは
procedure _Assign(var T: Text; S: ShortString);
と宣言されています。
内部でこの手続きが呼び出されていると思うので、多分、大丈夫かと・・・
AssignFile及びAssignFileEx実行後のファイル変数の初期化内容は、同じように見受けられます。
(TFileRec型及びTTextRec型に型キャストして確認)
>もにゃさん、どうもありがとうございます。
>確かに、こうすると、サイズが異なるので区別できるのです。
>AssignFileExの中ではサイズが、
>両方共4(ポインタを格納する容量?)になるのです。
型なしパラメータだからでしよう。
出し惜しみ失礼しました。
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;
としても良いでしょうが、これだと型なしを使う御利益が減るかもです。
>型なしパラメータだからでしよう。
そうじゃない var だから
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;
Basserさん、もにゃさん、KHE00221さんありがとうございます。
Basserさん、私もVCLのソース等を探したのですが、AssignFileで
探していたので、わからなかったのですね。そこまでわかりませんでした。
もにゃさん、実は私も、仕方が無いので、
同じ事(パラメータ追加)をしようとしていました。
こんな事をしようと思った目的は、現状のソースを極力触りたくなかった
ので、末端の処理で分岐させたかったのです。
KHE00221さん、行ってみました所、AssignFileEx内でSizeOf(f)が異なった
値になりました。引数の型の違いで、どちらか判定して呼び出して
くれるのですね。知りませんでした。
これで、区別出来ます。
みなさん、お手数をおかけしまして、ありがとうございました。
ツイート | ![]() |