現在選択されている行のさまざまな Blob フィールドのコンテンツを表示する TDBGrid 子孫コンポーネントを作成しました。それぞれが TJvDBRichEdit に含まれています。blob フィールドのコンテンツを表示するためのDrawColumnCellコード:
procedure TMyDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var iPos,iNr,iTop:Integer;
begin
// RBA 01/04/2013 12:10
if not (csDesigning in ComponentState) then
if FDisplayBlobAsRTF then //property to show the blob fields or not
begin
if (gdSelected in State) then
begin
if Column.Field.isblob then
begin
ipos := 0;
iNr := 0;
while (iPos <= Column.Field.DataSet.FieldCount-1)and(Column.Field.DataSet.Fields[ipos].FieldName <> Column.Field.FieldName ) do
begin
if Column.Field.DataSet.Fields[ipos].IsBlob then
inc(iNr);
inc(iPos);
end;
with TJvDBRichEdit(FRichEditList[inr]) do//FRichEditList - TObjectList which contains all the TJvDBRichEdit components, and release them on destroy
begin
Left := Rect.Left + Self.Left + 1;
iTop := Rect.Top + Self.Top + 1;
if iTop + Height > Self.Height then
iTop := iTop - Height;
Top := iTop;
Width := Rect.BottomRight.X - Rect.left;
Visible := true;
end;
end;
end
end;
inherited;
end;
オーバーライドされた LayoutChangedルーチン
procedure TMyDBGrid.LayoutChanged;
var iPos : Integer;
dtDataset : TDataSet;
jvDbRichEdit : TJvDBRichEdit;
begin
if not (csDesigning in ComponentState) then
if FDisplayBlobAsRTF then
begin
dtDataset := GetDataset;//get the dataset assigned to the grid
if dtDataset <> nil then
if dtDataset.State <> dsInactive then
begin
FRichEditList.Clear;
for iPos := 0 to dtDataset.FieldCount-1 do
if dtDataset.Fields[iPos].IsBlob then
begin
jvDbRichEdit := TJvDBRichEdit.Create(nil);
jvDbRichEdit.Parent := Self;
jvDbRichEdit.DataSource := Self.DataSource;
jvDbRichEdit.DataField := dtDataset.Fields[iPos].FieldName;
jvDbRichEdit.Visible := false;
FRichEditList.Add(jvDbRichEdit);
end;
end;
end;
end;
最後に表示されたグリッド行をスクロールすると、問題が発生します。
背後のグリッドを再描画するにはどうすればよいですか? ホール グリッドを再描画してみましたが、ちらつきます。
LE: これは、richedtis の内容を変更することを意図したものではなく、それらを表示することのみを目的としています。