こんにちは。
D2007で作成した、下記のルーチン(DBGridにmemo項目の1行目を表示させる)が、D2010では「無効なクラス型キャスト」というエラーになってしまいます。
回避策はありませんでしょうか。
tbl内memo項目のOnGetTextで呼んでいます。
Procedure bin_GridLowDisplay(Sender: TField; var Text: String; DisplayText: Boolean);
var
BlobMemo : TBlobStream;
SL : TStringList;
begin
BlobMemo := TBlobStream.Create(TBlobField(Sender),bmRead); ←エラー
SL := TStringList.Create;
SL.LoadFromStream(BlobMemo);
if SL.Count > 0 then
Text := SL[0];
BlobMemo.Free;
SL.Free;
end;
if Sender is TBlobField then begin
BlobMemo := TBlobStream.Create(Sender as TBlobField, bmRead);
...
としてみたら?
やってみましたが、同じエラーが出てダメでした…。
BlobMemo := Tableのコンポーネント名.TBlobStream.Create(TBlobField(Sender),bmRead);
---
では?
または IBX ですが・・・・
DBGridのMemo項目で
procedure TForm1.IBTableフィールド名GetText(Sender: TField; var Text: string;
DisplayText: Boolean);
var
BlobMemo : TStream;
SL : TStringList;
begin
BlobMemo := IBTable.CreateBlobStream(IBTable.FieldByName('フィールド名'),bmRead);
SL := TStringList.Create;
SL.LoadFromStream(BlobMemo);
if SL.Count > 0 then
Text := SL[0];
BlobMemo.Free;
SL.Free;
end;
2007ですが、うまくいっていますが・・2010は環境がありません・・。
1案はコンパイルエラーが出てダメでした。(TBlobStreamが未定義の識別子)
2案はうまく行きました!
ただ、同じmemo型項目があと30個あり、なんとか共通ルーチン化したいところです。
var
BlobMemo : TStream; <---
SL : TStringList;
begin
BlobMemo := Tableのコンポーネント名.TStream.Create(TBlobField Sender),bmRead);
TBlobStream--->TStream・・・ では?
同じくコンパイルエラーです。
Tableのコンポーネント名.TStreamというメソッドが無いようです。
案2がいいのであれば、
> BlobMemo := IBTable.CreateBlobStream(IBTable.FieldByName('フィールド名'),bmRead);
↓
BlobMemo := IBTable.CreateBlobStream(IBTable.FieldByName(Sender.FieldName),bmRead);
これだけのことじゃないの?
E2076 このメソッドの呼び方はクラスメソッドの場合に限られます
とコンパイルエラーになってしまいます。
自分で試した(コンパイルエラーがでる)コードをここに提示してみたら?
> 自分で試した(コンパイルエラーがでる)コードをここに提示してみたら?
現在こうなっています。
//メモ項目1行目をGrid表示
Procedure bin_GridLowDisplay(Sender: TField; var Text: String; DisplayText: Boolean);
var
BlobMemo : TBlobStream;
// BlobMemo : TStream;
SL : TStringList;
begin
BlobMemo := TABSQuery.CreateBlobStream(TABSQuery.FieldByName(Sender.FieldName),bmRead);
SL := TStringList.Create;
SL.LoadFromStream(BlobMemo);
if SL.Count > 0 then
Text := SL[0];
BlobMemo.Free;
SL.Free;
end;
>TABSQuery
これはクラス型の識別子だよね。エラーの原因はこれ。
クラスのインスタンスの識別子を書かなきゃ。
ありがとうございます。
つたない知識で下記のようにしたのですが、前述のコンパイルエラーがでなくなった代わりに、
実行時に「”bikou_memo(存在するはずの項目名)”が見つかりません」とEDatabaseErrorが出てしまいます。
なにか勘違いしてますでしょうか。
Procedure bin_GridLowDisplay(Sender: TField; var Text: String; DisplayText: Boolean);
var
BlobMemo : TStream;
ABSTable : TABSQuery;
SL : TStringList;
begin
ABSTable := TABSQuery.Create(Sender);
BlobMemo := ABSTable.CreateBlobStream(ABSTable.FieldByName(Sender.FieldName),bmRead);
SL := TStringList.Create;
SL.LoadFromStream(BlobMemo);
if SL.Count > 0 then
Text := SL[0];
BlobMemo.Free;
SL.Free;
ABSTable.Free;
end;
勘違いかどうかは本人以外知る由もなし。
見つからない項目名がその一つだけなら、それを自分でよく再確認するしかないんじゃないの?
>ABSTable := TABSQuery.Create(Sender);
この行が本当にここにあるなら、見つからないのは当たり前。
作成したばかりのモノには項目など何もないし…
IBX ですが・・・・
DBGridのMemo項目で
procedure TForm1.IBTableフィールド名GetText(Sender: TField; var Text: string; DisplayText: Boolean);
var
BlobMemo : TStream;
SL : TStringList;
begin
BlobMemo := <コンポーネント名?Table or SQL>.CreateBlobStream(<コンポーネント名?Table or SQL>.FieldByName(Sender.FieldName),bmRead);
//BlobMemo := IBTable.CreateBlobStream(IBTable.FieldByName(Sender.FieldName),bmRead);<=Tableでテスト
SL := TStringList.Create;
SL.LoadFromStream(BlobMemo);
if SL.Count > 0 then
Text := SL[0];
BlobMemo.Free;
SL.Free;
end;
複数のMemo項目の GetText で、こちらの環境ではうまくいっていますが・?・?・?・
D2007 + XP
>Procedure bin_GridLowDisplay(Sender: TField; var Text: String; DisplayText: Boolean);
これをクラスのメソッドにすれば問題はすべて解決すると思うけど、
メソッドではマズイという事情でもあるの?
ご意見参考に色々調べて下記で共通化成功しました。
Absolute Databaseを使っているのでTABSBLOBStreamにしないとならなかったようです。
Procedure bin_GridLowDisplay(Sender: TField; var Text: String; DisplayText: Boolean);
var
BlobMemo : TABSBLOBStream;
SL : TStringList;
test,test2 : String;
begin
if Sender is TMemoField then begin
BlobMemo := TABSBLOBStream.Create(TBlobField(Sender),bmRead);
SL := TStringList.Create;
SL.LoadFromStream(BlobMemo);
if SL.Count > 0 then
Text := SL[0];
BlobMemo.Free;
SL.Free;
end;
end;
ありがとうございました。
ツイート | ![]() |