[SOLVED] Showing complete memo text in dbgrid? lazarus / 16-Databases ---------------------------------------------------------------------- BigChimp · 2012-03-11 13:29 Current Lazarus, FPC fixes 2.6 Asked this before but got no further, so trying again... I've got a dbgrid with memo fields (from a DBF file). In many cases, those memo fields contain not that much text at all. By default, I think a memo field shows up as (Memo) in a dbgrid, which is a bit... useless. I would like to show the full text of the cells. If the text is too big, it can be truncatedoptionally: in the selected cell, show scrollbars that allow the user to view the entire cell text Having read the grids wiki page (but without Delphi experience) I've cobbled together this code, which doesn't work - it doesn't seem to paint correctly: Code: [Select]procedure TForm1.ResultsGridDrawColumnCell(Sender: TObject; const Rect: TRect;   DataCol: Integer; Column: TColumn; State: TGridDrawState); // Draw memo text instead of (Memo) // Note: grid DefaultDrawing property must be off to avoid duplicate drawing // To get this, I basically copied the existing DefaultDrawColumnCell procedure // but tested for memo first. If no memo, pass on to default procedure. // Maybe slower, more complicated, but it allows for changes in the // core Lazarus DefaultDrawColumnCell procedure. var   OverrideDraw: boolean; //determine if we're going to override drawing   S: string;   F: TField;   DataRow: Integer; begin   OverrideDraw:=false;   try     F := Column.Field;     if F.DataType = ftMemo then     begin       OverRideDraw:=true;     end;   except     on E: exception do     begin       // We might have an inactive datalink or whatever,       // in that case, pass on our problems to the existing       // procedure.       //showMessage('Exception: ' + E.Classname + '/' + E.Message);       OverRideDraw:=false;     end;   end;   if OverRideDraw=false then   begin     // Call normal procedure to handle drawing for us.     ResultsGrid.DefaultDrawColumnCell(Rect,DataCol,Column,State);   end   else   begin     // Get to work displaying our memo contents     // Basically shamelessly ripped from     // DefaultDrawColumnCell     // maybe fix something for first/header row     if F<>nil then     begin       //DO display memo ;)       S := F.AsString; //DisplayText will only show (Memo)     end     else     begin       S := '';     end;     //Actual drawing, taken from Grids.DrawCellText coding:     ResultsGrid.Canvas.TextRect(Rect,Left,Top, S);   end; end; Help welcome. Project source code can be found under the outputparser directory in https://bitbucket.org/reiniero/db2securityscript/src  (You can download the code as a zip, too) Thanks! ---------------------------------------------------------------------- User137 · 2012-03-11 14:57 Quote from: BigChimp on March 11, 2012, 02:29:06 pmCode: [Select]procedure TForm1.ResultsGridDrawColumnCell(Sender: TObject; const Rect: TRect;   DataCol: Integer; Column: TColumn; State: TGridDrawState); ...     ResultsGrid.Canvas.TextRect(Rect,Left,Top, S); ... Are you sure that's right parameters? Left and Top properties are the coordinates of the Form1, not specific cell you are propably trying to draw. Rect.Left and Rect.Top may give the position where cell is. ---------------------------------------------------------------------- BigChimp · 2012-03-11 16:19 Thanks User137, no I'm not sure at all, I was basically copy-pasting everything I could find... I tried it and it works - thanks a lot! Now I just need to redraw the grid when some event (OnDraw or whatever) fires -  when I display a messagebox, the grid doesn't redraw... Back to the wiki grids page - but at least I've got the right text now. Thanks again! ---------------------------------------------------------------------- christensen · 2016-09-06 19:06 Hi BigChimp, Could you please give detail how do you solve. I have a few dbf tables and some of them contain memo field, usually the last column and i want to display it in TDBGrid. ---------------------------------------------------------------------- engkin · 2016-09-06 19:15 ---------------------------------------------------------------------- LacaK · 2016-09-07 05:35 I have found: http://forum.lazarus.freepascal.org/index.php/topic,16300.0.html or you can play with TField.OnGetText event http://www.freepascal.org/docs-html/fcl/db/tfield.ongettext.html ---------------------------------------------------------------------- christensen · 2016-09-07 06:25 Thanks, I've tried like on the first link, but it returns me empty cell. When i click on the cell it return (MEMO) ---------------------------------------------------------------------- gduck · 2017-03-29 09:08 Change last line! ResultsGrid.Canvas.TextRect(Rect,Rect.Left,Rect.Top, S); ---------------------------------------------------------------------- usef74 · 2019-10-23 11:04 in OnGetText  use below Code: procedure TFrmListKartable.ADOQuery1CommentGetText(Sender: TField;   var Text: string; DisplayText: Boolean); begin  Text:= TField(Sender).AsString; end;