DBGridにmemo型表示

解決


たけよし  2009-11-24 18:55:28  No: 36229

こんにちは。

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;


う〜ん  2009-11-25 03:58:27  No: 36230

if Sender is TBlobField then begin
   BlobMemo := TBlobStream.Create(Sender as TBlobField, bmRead);
   ...
としてみたら?


たけよし  2009-11-25 13:24:22  No: 36231

やってみましたが、同じエラーが出てダメでした…。


maru3  2009-11-25 19:05:04  No: 36232

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は環境がありません・・。


たけよし  2009-11-25 20:19:00  No: 36233

1案はコンパイルエラーが出てダメでした。(TBlobStreamが未定義の識別子)

2案はうまく行きました!
ただ、同じmemo型項目があと30個あり、なんとか共通ルーチン化したいところです。


maru3  2009-11-25 20:39:15  No: 36234

var
  BlobMemo : TStream; <---
  SL : TStringList;
begin
BlobMemo := Tableのコンポーネント名.TStream.Create(TBlobField Sender),bmRead);

TBlobStream--->TStream・・・ では?


たけよし  2009-11-25 21:08:27  No: 36235

同じくコンパイルエラーです。
Tableのコンポーネント名.TStreamというメソッドが無いようです。


ぽむぽむ  2009-11-26 22:46:26  No: 36236

案2がいいのであれば、

> BlobMemo := IBTable.CreateBlobStream(IBTable.FieldByName('フィールド名'),bmRead);
  ↓
BlobMemo := IBTable.CreateBlobStream(IBTable.FieldByName(Sender.FieldName),bmRead);

これだけのことじゃないの?


たけよし  2009-11-26 23:34:53  No: 36237

E2076 このメソッドの呼び方はクラスメソッドの場合に限られます

とコンパイルエラーになってしまいます。


まだ未解決なら  2009-11-27 17:48:08  No: 36238

自分で試した(コンパイルエラーがでる)コードをここに提示してみたら?


たけよし  2009-11-27 18:02:50  No: 36239

> 自分で試した(コンパイルエラーがでる)コードをここに提示してみたら?

現在こうなっています。

//メモ項目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;


エラーの原因  2009-11-27 20:04:06  No: 36240

>TABSQuery
これはクラス型の識別子だよね。エラーの原因はこれ。
クラスのインスタンスの識別子を書かなきゃ。


たけよし  2009-11-27 20:56:00  No: 36241

ありがとうございます。
つたない知識で下記のようにしたのですが、前述のコンパイルエラーがでなくなった代わりに、
実行時に「”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;


そういわれても  2009-11-27 21:28:27  No: 36242

勘違いかどうかは本人以外知る由もなし。
見つからない項目名がその一つだけなら、それを自分でよく再確認するしかないんじゃないの?


それは当然  2009-11-27 21:41:02  No: 36243

>ABSTable := TABSQuery.Create(Sender);
この行が本当にここにあるなら、見つからないのは当たり前。
作成したばかりのモノには項目など何もないし…


maru3  2009-11-27 23:57:42  No: 36244

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


とりあえず  2009-11-30 07:00:45  No: 36245

>Procedure bin_GridLowDisplay(Sender: TField; var Text: String; DisplayText: Boolean);
これをクラスのメソッドにすれば問題はすべて解決すると思うけど、
メソッドではマズイという事情でもあるの?


たけよし  2009-12-02 22:22:18  No: 36246

ご意見参考に色々調べて下記で共通化成功しました。
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;

ありがとうございました。


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

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






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