您好,登錄后才能下訂單哦!
在Delphi XE中如何使用TComboBox作為單元格編輯器,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
需要進行以下幾步:
創建StringGrid,在OnSelectCell事件中顯示ComboBox覆蓋單元格作為編輯器
創建ComboBox,將其Parent設置為StringGrid,并將StringGrid的行高設置為ComboBox的高度
處理ComboBox的OnChange事件,修改StringGrid單元格的值
處理ComboBox的OnExit事件,隱藏ComboBox
創建新單元,定義同名類TStringGrid繼承Vcl.Grids.TStringGrid并重寫其WMCommand方法
在使用StringGrid的單元頭部引用新單元,必須放在Vcl.Grids之后
以下是示例代碼:
單元1:
點擊(此處)折疊或打開
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes,
Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, Vcl.Grids,
//必須將重定義的TStringGrid單元引用放置在Vcl.Grids之后
Unit2;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
private
FComboBox: TComboBox;
procedure OnComboBoxChange(Sender: TObject);
procedure OnComboBoxExit(Sender: TObject);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
//創建ComboBox,也可以直接拖拽到Form
//此處只需要設置Parent := StringGrid1
FComboBox := TComboBox.Create(StringGrid1);
FComboBox.Parent := StringGrid1;
FComboBox.Items.Add('Item1');
FComboBox.Items.Add('Item2');
FComboBox.OnChange := OnComboBoxChange;
FComboBox.OnExit := OnComboBoxExit;
FComboBox.Visible := False;
//ComboBox高度是固定不能改變的
//因此設置StringGrid1的行高與ComboBox高度一致
StringGrid1.DefaultRowHeight := FComboBox.Height;
end;
procedure TForm1.OnComboBoxChange(Sender: TObject);
begin
StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] := FComboBox.Text;
end;
procedure TForm1.OnComboBoxExit(Sender: TObject);
begin
FComboBox.Visible := False;
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
var
ARect: TRect;
begin
//示例代碼僅在第二列中使用ComboBox作為編輯器
if CanSelect and (ACol = 1) then
begin
FComboBox.ItemIndex := FComboBox.Items.IndexOf
(StringGrid1.Cells[ACol, ARow]);
//使ComboBox顯示并覆蓋住選中單元格
ARect := StringGrid1.CellRect(ACol, ARow);
FComboBox.Left := ARect.Left;
FComboBox.Top := ARect.Top;
FComboBox.Width := ARect.Right - ARect.Left;
FComboBox.Visible := True;
FComboBox.SetFocus;
end;
end;
end.
單元2:
點擊(此處)折疊或打開
unit Unit2;
interface
uses
Vcl.Grids, Winapi.Windows, Winapi.Messages, Vcl.Controls;
type
TStringGrid = class(Vcl.Grids.TStringGrid)
private
procedure WMCommand(var AMessage: TWMCommand); message WM_COMMAND;
end;
implementation
{ TStringGrid }
procedure TStringGrid.WMCommand(var AMessage: TWMCommand);
begin
//如果當前是StringGrid內置編輯框,調用父類方法
//否則向控件發送CN_COMMAND事件
if (InplaceEditor <> nil) and (AMessage.Ctl = InplaceEditor.Handle) then
inherited
else if AMessage.Ctl <> 0 then
begin
AMessage.Result := SendMessage(AMessage.Ctl, CN_COMMAND,
TMessage(AMessage).WParam, TMessage(AMessage).LParam);
end;
end;
end.
說明:
TStringGrid只支持內置的輸入框做為單元格編輯器,所以只好放置一個ComboBox并覆蓋住要編輯的單元格
TStringGrid祖先類TCustomGrid在WMCommand方法中限制了只處理InplaceEditor,所以需要重寫這個方法
也可以繼承TStringGrid而不是使用同名類,再全部動態創建,但是太麻煩而且基本沒什么區別
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。