这个问题似乎已经得到了回答,可能是MonkeyStyler/Mike,然而,由于我使用的是Delphi 10西雅图,如果代码和指南不再起作用。具体来说
火猴栅格基础
无法工作,因为ApplyStyling事件处理程序现在只调用一次(在列create)
我想向TCombobox或TComboboxEdit列添加aTGrid。
type
TComboColumn = Class(TColumn)
protected
function CreateCellControl: TStyledControl; override; // works!
End;..。
Grid1.AddObject(TComboColumn.Create(Grid1)); ..。
function TComboColumn.CreateCellControl: TStyledControl;
begin
Result := TComboBox.Create(Self);
TComboBox(Result).Items.Add('A');
TComboBox(Result).Items.Add('B');
TComboBox(Result).Items.Add('C');
TComboBox(Result).OnChange := DoTextChanged; // strange hooks
end;这将在网格中创建combobox列,但在每一行中都是相同的组合框,我不知道如何添加适用于这里的GetValue和SetValue方法。
发布于 2015-10-03 12:29:37
你需要做很多事。让我们开始吧。首先,您需要声明一些数据类型,以存储ComboBox列的值。
TComboRecord = record
FieldValues: array of string;
ItemSelected: integer;
function Selected: string;
end;
...
{ TComboRecord }
function TComboRecord.Selected: string;
begin
Result := FieldValues[ItemSelected];
end;并使用一些数据填充TList<TComboRecord>。
var
ComboData: TList<TComboRecord>;
procedure PopulateComboData(Rows: cardinal);
implementation
procedure PopulateComboData(Rows: cardinal);
var
RowI: cardinal;
i: cardinal;
ComR: TComboRecord;
begin
for RowI := 1 to Rows do
begin
Setlength(ComR.FieldValues, random(5) + 1);
for i := 0 to length(ComR.FieldValues) - 1 do
ComR.FieldValues[i] := inttostr(random(64000));
ComR.ItemSelected := 0;
ComboData.Add(ComR);
end;
end;
initialization
ComboData := TList<TComboRecord>.Create;
finalization
ComboData.Free;您需要创建一个TComboBox优势,以便它能够存储和操作TComboRecord类型数据。
TComboBoxCell = class(TComboBox)
private
FComboData: TComboRecord;
procedure SetComboData(const Value: TComboRecord);
function GetComboData: TComboRecord;
protected
procedure SetData(const Value: TValue); override;
public
property ComboData: TComboRecord read GetComboData write SetComboData;
end;
...
{ TComboBoxCell }
function TComboBoxCell.GetComboData: TComboRecord;
begin
FComboData.ItemSelected:=ItemIndex;
result:=FComboData;
end;
procedure TComboBoxCell.SetComboData(const Value: TComboRecord);
var
s: string;
begin
FComboData := Value;
Items.Clear;
for s in Value.FieldValues do
Items.Add(s);
ItemIndex := Value.ItemSelected;
end;
procedure TComboBoxCell.SetData(const Value: TValue);
begin
inherited;
ComboData := Value.AsType<TComboRecord>
end;而不是需要继承一个新的类表单TColumn。
TComboColumn = class(TColumn)
protected
procedure DoComboChanged(Sender: TObject);
function Grid: TComboExtendedGrid; overload;
function CreateCellControl: TStyledControl; override;
end;
...
{ TComboColumn }
function TComboColumn.CreateCellControl: TStyledControl;
begin
Result := TComboBoxCell.Create(Self);
TComboBoxCell(Result).OnChange := DoComboChanged;
end;
procedure TComboColumn.DoComboChanged(Sender: TObject);
var
P: TPointF;
LGrid: TComboExtendedGrid;
begin
LGrid := Grid;
if not Assigned(LGrid) then
Exit;
if FUpdateColumn then
Exit;
if FDisableChange then
Exit;
P := StringToPoint(TFmxObject(Sender).TagString);
LGrid.SetValue(Trunc(P.X), Trunc(P.Y),
TValue.From<TComboRecord>(TComboBoxCell(Sender).ComboData));
if Assigned(LGrid.FOnEditingDone) then
LGrid.FOnEditingDone(Grid, Trunc(P.X), Trunc(P.Y));
end;
function TComboColumn.Grid: TComboExtendedGrid;
var
P: TFmxObject;
begin
Result := nil;
P := Parent;
while Assigned(P) do
begin
if P is TCustomGrid then
begin
Result := TComboExtendedGrid(P);
Exit;
end;
P := P.Parent;
end;
end;现在我们必须对TGrid类进行子类型,同时还必须通过Grid函数获得它的处理程序,并且需要访问protected FOnEditingDone变量。
TComboExtendedGrid = class(TGrid)
private
FOnEditingDone: TOnEditingDone;
protected
procedure SetValue(Col, Row: integer; const Value: TValue); override;
end;
{ TComboExtendedGrid }
procedure TComboExtendedGrid.SetValue(Col, Row: integer; const Value: TValue);
begin
inherited;
end;最后,我们需要在表单单元中设置必要的创建和事件处理机制。向from声明中添加列变量。
protected
CCColumn:TComboColumn;填充ComboData并创建列:
procedure TForm1.Button1Click(Sender: TObject);
begin
PopulateComboData(Grid2.RowCount);
CCColumn:=TComboColumn.Create(Grid2);
CCColumn.Parent := Grid2;
CCColumn.Header := 'CB';
end;并处理这些事件:
procedure TForm1.Grid2GetValue(Sender: TObject; const Col, Row: Integer;
var Value: TValue);
begin
case Col of
6{Combo Column Number}: Value:=TValue.From<TComboRecord>(ComboData[Row])
end;
end;
procedure TForm1.Grid2SetValue(Sender: TObject; const Col, Row: Integer;
const Value: TValue);
begin
case Col of
6{Combo Column Number}: ShowMessage(Value.AsType<TComboRecord>.Selected);
end;
end;不要忘记将更改(如果需要)传递到ComboData列表。当前处理程序不会为您执行此操作。我更喜欢在Grid2SetValue事件处理程序中这样做。
发布于 2015-10-10 16:29:56
下面是将组合框添加到FMX TGrid的简单方法。当然,这个解决方案在每个组合中都有相同的项,但这是我现在所能达到的全部目标。
type
TComboColumn = class(TPopupColumn)
function CreateCellControl: TStyledControl; override;
end;..。
function TComboColumn.CreateCellControl: TStyledControl;
var
ComR: TComboRecord;
i: Integer;
begin
Result := TComboBoxCell.Create(self);
// now they all have the same drop-down values
ComR := frmMain.ComboData[0];
for i := 0 to Length(ComR.FieldValues) do
TComboBoxCell(Result).Items.Add(ComR.FieldValues[i]);
end..。只是为了连续性
procedure TfrmMain.FormCreate(Sender: TObject);
begin
AGrid := TComboExtendedGrid.Create(Self);
AGrid.Parent := Self;
AGrid.Align := TAlignLayout.Client;
AGrid.Options := AGrid.Options + [TGridOption.AlwaysShowEditor];
AGrid.OnGetValue := AGridGetValue;
AGrid.OnSetValue := AGridSetValue;
AGrid.RowCount := 5;
ComboData := TList<TComboRecord>.Create;
PopulateComboData(AGrid.RowCount);
CCColumn := TComboColumn.Create(AGrid);
CCColumn.Parent := AGrid;
CCColumn.Header := 'Combohere';
end;https://stackoverflow.com/questions/32920219
复制相似问题