3

現在選択されている行のさまざまな 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 の内容を変更することを意図したものではなく、それらを表示することのみを目的としています。

4

0 に答える 0