簡體   English   中英

如何在 Delphi 上使用 onDrawColumnCell 更改單元格文本而不使用 textout?

[英]How to use onDrawColumnCell to change cell text without using textout on Delphi?

我想問一下是否有另一種方法可以在不使用TextOut()的情況下更改單元格文本? 使用TextOut()需要我不想混入的坐標。 此外,我只想更改文本並保留其他所有內容,如顏色、字體、alignment 等。

我的目的是改變不同場景中文本的顯示。 例如:

  • 我可能想在不同的列中以不同的格式顯示日期字段,例如一列顯示在MM/yyyy中,另一列顯示在MM/dd/yyyy中。
  • 如果數字高於或低於某個閾值,我可能想顯示一些具有整數/浮點數據類型的行,並帶有顯示“太高”或“太低”的文本。
  • 我可能想用我認為合適的一些文本或數字交換 boolean true/false。
  • 或者,也許只是在某些條件下空白一些單元格。

我知道如果TDBGrid是“可編輯的”,這將是進行編輯的一項艱巨挑戰。 所以我打算在不可編輯的網格中使用任何解決方案。 而且,我不想轉向TStringGrid ,因為我發現TDBGrid很容易處理數據集。

順便說一句,我正在使用 Delphi 7。

對於僅在特定條件下將特定單元格留空,是否可以發出“退出”以跳過將單元格值顯示到單元格本身?

喜歡:

procedure Tform1.dbgrdDrawColumnCell(Sender: TObject;  const Rect: TRect; DataCol: Integer; Column: TColumn;  State: TGridDrawState);
begin
  if (Column.fieldname = 'total') and (column.field.value=0) then 
    exit 
  else
    dbgrdsku.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

如果您正在使用TDBGrid和數據源,在直接選擇在Grid中進行更改之前,請檢查在數據源(在TFields上)中進行更改是否有用。

使用Datasource不會花費那么多資源進行繪畫。 到達該點(繪制)后,數據可能已經更改。

您可以在TDataset后代(TQuery、TADOQuery、TFDQuery 等)上創建TFields ,並使用OnGetText事件更改要繪制的文本。 更簡單更好。

如果你是這樣的兩個字段:

在此處輸入圖像描述

使用像這樣使用兩個字段的OnGetText的簡單代碼:

procedure TForm3.ADOQuery1DatosGrupoGetText(Sender: TField; var Text: string;  DisplayText: Boolean);
begin
  // too hight for number greater than 5
  if (not Sender.IsNull) then
    if (Sender.AsInteger > 5) then
      Text := 'too hight!'
    else
      Text := Sender.AsString;
end;

procedure TForm3.ADOQuery1fechaGetText(Sender: TField; var Text: string;  DisplayText: Boolean);
begin
  // Change the date format
  if (not Sender.IsNull) then
    Text := formatDateTime('MM/yyyy', Sender.AsDateTime)
end;

你得到了這個結果:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM