Firemonkey:在Embarcadero C ++ Builder XE3上使用TGrid [英] Firemonkey: TGrid usage on Embarcadero C++ Builder XE3

查看:184
本文介绍了Firemonkey:在Embarcadero C ++ Builder XE3上使用TGrid的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试构建一个工具,该工具使用Firemonkey中的TGrid从数据库读取数据并将其显示为表格.我需要使用不同类型的列,例如TCheckColumn和TPopupColumn,但是找不到任何有关如何在C ++ Builder中使用它们的良好指南或示例.

I'm try to build a tool that reads data from a database and displays it as a table using a TGrid in Firemonkey. I need to use different types of columns like TCheckColumn and TPopupColumn but can't find any good guide or example on how to use them in C++ Builder.

无论如何,我设法理解了TStringColumn,TProgressColumn在TGrid事件onGetValue中设置单元格值的用法.

Any way, I managed to understand the usage of the TStringColumn,TProgressColumn setting the Value of the cell in the TGrid's event onGetValue.

你们中的任何人都知道如何为TCheckColumn,TIm​​ageColumn和TPopupColumn类型的列设置Value吗?

Does any one of you know how to set the Value for columns of type TCheckColumn, TImageColumn and TPopupColumn?

谢谢 丹尼尔(Daniele)

thanks Daniele

-更新---

我设法使用了TProgressColumn.这是我在表单的构造函数中所做的:

I managed to use the TProgressColumn. This is what I do in the Form's constructor:

// TStringColumn
Grid1->AddObject(new TStringColumn(this));
// TCheckColumn
TCheckColumn* c = new TCheckColumn(this);
Grid1->AddObject(c);
// TPopupColumn
// list of values
TStringList * l = new TStringList(NULL);
l->Add(L"First");
l->Add(L"Second");
l->Add(L"Third");
TPopupColumn* p = new TPopupColumn(this);
// adding the list to the PopupColumn
p->Items = l;
Grid1->AddObject(p);
// TProgressColumn
Grid1->AddObject(new TProgressColumn (this));
Grid1->RowCount = 3 ;

这是Grid1GetValue方法:

and this is the Grid1GetValue method:

// TStringColumn
if(Col == 0) Value = TValue::From<String>(Row);
// TCheckColumn  !! Can't make it work
if(Col == 1) Value = TValue::From<Boolean>(true);
// TPopupColumn
if(Col == 2)    Value = TValue::From<int>(2);
// TProgressColumn
if(Col == 3)    Value = TValue::From<double>(50.0);

-更新---

如果我使用OnSetValue方法保存列的值

if I save the value of the column using the method OnSetValue

void __fastcall TForm1::Grid1SetValue(...)
{
if(Col == 1) check = Value;
}

,然后使用OnGetValue方法设置它:

and then set it with the method OnGetValue:

void __fastcall TForm1::Grid1GetValue(...)
{
// TCheckColumn  !! Can't make it work
if(Col == 1) Value = check;// TValue::From<Boolean>(true);
}

单击一个复选框后,所有其他复选框都会更改状态.因此该组件可以正常工作...现在的重点是如何以正确的方式将Value设置为true或false.

After I click on one checkbox all the other checkboxes change state. So the component works correctly... now the point is how to set the Value to true or false in the right way.

推荐答案

TGris不存储任何数据,您应该创建自己的数据存储.

TGris does not store any data, you should create your own datastorage.

示例:带有TCheckColumn,TStringColumn和TPopupColumn的TGrid

Example: TGrid with TCheckColumn, TStringColumn and TPopupColumn

type
  TField = record
    Checked:  Boolean;
    Name:     string;
    Column:   Byte;
  end;

var
  Fields: TList<TField>;

function SetField(const AChecked: Boolean; const AName: string; const AColumn: Byte): TField;
begin
  with Result do begin
    Checked := AChecked;
    Name    := AName;
    Column  := AColumn;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  Fields := TList<TField>.Create;
  Fields.Add(SetField(True, 'Name', 1));
  Fields.Add(SetField(True, 'Login', 2));
  Fields.Add(SetField(True, 'Password', 3));
  for I := 1 to Fields.Count do
    PopupColumn1.Items.Add('Column ' + IntToStr(I));
  gdFields.RowCount := Fields.Count;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Fields.Free;
end;

procedure TFormExport.gdFieldsGetValue(Sender: TObject; const Col, Row: Integer; var Value: TValue);
begin
  case gdFields.Columns[Col].TabOrder of
    0:  Value := Fields[Row].Checked;
    1:  Value := Fields[Row].Name;
    2:  Value := Fields[Row].Column - 1;
  end;
end;

procedure TFormExport.gdFieldsSetValue(Sender: TObject; const Col, Row: Integer; const Value: TValue);
var
  FRec: TField;
begin
  FRec := Fields[Row];
  case gdFields.Columns[Col].TabOrder of
    0:  FRec.Checked := Value.AsBoolean;
    1:  FRec.Name    := Value.AsString;
    2:  FRec.Column  := Value.AsInteger + 1;
  end;
  Fields[Row] := FRec;
end;

现在,在编辑TGrid之后,将更改数据存储中的所有数据,但可能是TGrid中的错误-更改PopupColumn之后从未收到OnSetValue

Now all data from your datastorage will be changed after editing your TGrid, but possible bug in TGrid - never received OnSetValue after changing PopupColumn

这篇关于Firemonkey:在Embarcadero C ++ Builder XE3上使用TGrid的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆