DBGridにmemo型表示

解決


たけよし  2009-11-24 09:55:28  No: 36229  IP: 192.*.*.*

こんにちは。

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-24 18:58:27  No: 36230  IP: 192.*.*.*

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

編集 削除
たけよし  2009-11-25 04:24:22  No: 36231  IP: 192.*.*.*

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

編集 削除
maru3  2009-11-25 10:05:04  No: 36232  IP: 192.*.*.*

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 11:19:00  No: 36233  IP: 192.*.*.*

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

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

編集 削除
maru3  2009-11-25 11:39:15  No: 36234  IP: 192.*.*.*

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

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

編集 削除
たけよし  2009-11-25 12:08:27  No: 36235  IP: 192.*.*.*

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

編集 削除
ぽむぽむ  2009-11-26 13:46:26  No: 36236  IP: 192.*.*.*

案2がいいのであれば、

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

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

編集 削除
たけよし  2009-11-26 14:34:53  No: 36237  IP: 192.*.*.*

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

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

編集 削除
まだ未解決なら  2009-11-27 08:48:08  No: 36238  IP: 192.*.*.*

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

編集 削除
たけよし  2009-11-27 09:02:50  No: 36239  IP: 192.*.*.*

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

現在こうなっています。

//メモ項目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 11:04:06  No: 36240  IP: 192.*.*.*

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

編集 削除
たけよし  2009-11-27 11:56:00  No: 36241  IP: 192.*.*.*

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

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

編集 削除
それは当然  2009-11-27 12:41:02  No: 36243  IP: 192.*.*.*

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

編集 削除
maru3  2009-11-27 14:57:42  No: 36244  IP: 192.*.*.*

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-29 22:00:45  No: 36245  IP: 192.*.*.*

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

編集 削除
たけよし  2009-12-02 13:22:18  No: 36246  IP: 192.*.*.*

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

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

編集 削除