We help IT Professionals succeed at work.

DBGrid/TField and memofields

alijakob
alijakob asked
on
Medium Priority
345 Views
Last Modified: 2010-04-06
Hi

I'm trying to print/display memofields from a DBGrid, but I just seem to get stuck whatever I do to read the memofield.

I the DBGrid (wwDBGrid) to display columns from SQL-statements (which the
end-user defines) and would then like to print the grid. I've only got a
problem with the memofields-columns (which displays just displays "(Memo)").

Is this the correct way to do it? And what do I need to display/print the memofield?

   if Fields[FieldNo].DataType = ftMemo then
   begin
     with Fields[FieldNo] do
     begin
       GetMem(TheField, Datasize);   { Allocate space }
       if GetData(TheField) then
       begin

          how do I use the "TheField"?
          how can I extract the data?


       end;
       FreeMem(TheField,DataSize);
     end;
   end;

I just think I have tried every possible way to extract the data from
"TheField", but I still haven't got the hang of it.

Can you please help me?

Jakob Hoffmann

Comment
Watch Question

Commented:
why don´t you use InfoPower or DBpower or any other vcl that
has this special dbgrid with memos?
just check their demo´s

Commented:
alijakob,

I have a better ***Free*** solution but really could use the points - depending on the size of the MEMO field's data.

Please assess hkelmer's answer if you will.

Zonnald

Author

Commented:
Hello

I have checked the InfoPower demos - there's no information about processing the contents of memofields.

My application is based on the InfoPower wwDBGrids where I do use the facility to display memofields. Using the wwDBGrids, it's not possible to print/use the contents of the memofields directly.

I have however, found a solution to my problems which seems to work - it'll only show the first 255 characters of the memofield (but the whole string is there!):

FieldSize   : LongInt;      { Will hold the fieldsize }
bstTheField : TBlobStream;  { The connection between us and the memofield }
TheField    : PChar;        { Will hold the contents read from the memofield }

bstTheField := TBlobStream.Create((Fields[FieldNo] as TMemoField),bmRead);
FieldSize   := bstTheField.Seek(0,2);  { Go to end of memofield to find size }
GetMem(TheField,FieldSize + 1);  { Allocate memory for contents }
if (TheField = nil) then raise Exception.Create('Not enough memory');
bstTheField.Seek(0,0);  { Go to start of field before reading contents }
FillChar(TheField^,FieldSize + 1,#0);  { Initialize the string }
bstTheField.Read(TheField^,FieldSize);  { Read contents of field }
showmessage('memo='+strpas(TheField)); {only shows the first 255 characters}

Jakob
Commented:
I'm gonna step out on a limb here and hope that this is a sensible answer.  I am using a DBCntrlGrid very successfully for this purpose.  It is a very good solution.

The DBCtrlGrid lets to put compnents of your own choice on every 'record' of the dataset.  This includes a DBMemo component.  It kind of like designing your own little form for each record.  It is very slick and I find the result look better than a plain DBGrid.

Hope this is acceptable,

Ian C.

Not the solution you were looking for? Getting a personalized solution is easy.

Ask the Experts
Access more of Experts Exchange with a free account
Thanks for using Experts Exchange.

Create a free account to continue.

Limited access with a free account allows you to:

  • View three pieces of content (articles, solutions, posts, and videos)
  • Ask the experts questions (counted toward content limit)
  • Customize your dashboard and profile

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.