Lazarus
Programming => Databases => Topic started by: BigChimp on August 02, 2011, 02:50:37 pm
-
Hi,
I've got a dbgrid that loads memo fields (unlimited string). I've got dgEditing set to false so I only show data.
The only thing that shows up is (MEMO).
Read the grid reference wiki.
Tried to:
- Show multiline data as in http://wiki.lazarus.freepascal.org/Grids_Reference_Page#Multilines_in_Grids (http://wiki.lazarus.freepascal.org/Grids_Reference_Page#Multilines_in_Grids). No difference
- Modified gridcelleditor.lpi example to show a TMemo using the OnSelectEditor property of the grid (code below)
Two questions:
1. What do I have to do to get the data showing correctly?
2. If I want to use the code below for something else, how do I calculate BoundsRect? There is no aRow property in a dbgrid?
OnSelectEditor code:
procedure TForm1.ResultsGridSelectEditor(Sender: TObject; Column: TColumn;
var Editor: TWinControl);
begin
//GridCellMemo.BoundsRect:=ResultsGrid.CellRect(aCol,aRow);
GridCellMemo.Text:=Column.Field.AsString;
Editor:=GridCellMemo; //GridCellMemo.visible:=true, don't know if it matters
end;
-
I've got a dbgrid that loads memo fields (unlimited string). I've got dgEditing set to false so I only show data.
The only thing that shows up is (MEMO).
Yes, it is how TBlobField.GetText works (uses TField.GetClassDesc).
Two questions:
1. What do I have to do to get the data showing correctly?
I have no experience with this, but I think, that you must hook into drawing cell and draw what you want.
-
Thanks, Lacak2, I've solved problem 2: how to show a TMemo control as an editor in a dbgrid. I've updated the wiki: http://wiki.lazarus.freepascal.org/Grids_Reference_Page#Example:_How_to_set_a_memo_editor_for_dbgrids (http://wiki.lazarus.freepascal.org/Grids_Reference_Page#Example:_How_to_set_a_memo_editor_for_dbgrids)
Comments welcome, there might be a more effective/elegant way of doing things.
-
Hmmm, I managed to get a bit further: now I can let a grid draw nothing in a memo cell - just can't it to draw the proper text.
I'm using this OnDrawColumnCell event procedure in the dbgrid to try and show memo fields:
(updated 16 September with new code)
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;
Attached:
- project source code (hint: when started, load db2secout.txt, then press export)
- screenshot of the problem.
Thanks for any help!
-
Got drawing to work thanks to user137.
See http://lazarus.freepascal.org/index.php/topic,16300.0.html (http://lazarus.freepascal.org/index.php/topic,16300.0.html) for newest code.