1

データベースからデータを読み取り、Firemonkey の TGrid を使用してテーブルとして表示するツールを構築しようとしています。TCheckColumn や TPopupColumn などのさまざまな種類の列を使用する必要がありますが、C++ Builder でそれらを使用する方法に関する適切なガイドや例が見つかりません。

とにかく、TGrid のイベント onGetValue でセルの値を設定する TStringColumn,TProgressColumn の使用法を理解することができました。

タイプ TCheckColumn、TImageColumn、および TPopupColumn の列の値を設定する方法を知っている人はいますか?

ありがとうダニエレ

- -アップデート - -

TProgressColumn を使用することができました。これは、フォームのコンストラクターで行うことです。

// 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 メソッドです。

// 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 を使用して列の値を保存した場合

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

次に、メソッド OnGetValue で設定します。

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

1 つのチェックボックスをクリックすると、他のすべてのチェックボックスの状態が変わります。したがって、コンポーネントは正しく機能します...ここでのポイントは、Value を正しい方法で true または false に設定する方法です。

4

3 に答える 3

0

問題を解決するTCheckCellには、次の方法でクラスを再定義します。

#include <FMX.Grid.hpp>
#include <boost/dynamic_bitset.hpp>

class CheckCellClass:public TCheckCell
{
public:
 __fastcall virtual CheckCellClass(System::Classes::TComponent*AOwner):TCheckCell(AOwner)
 {
 };

 virtual System::Rtti::TValue __fastcall GetData(void)
 {
  return TValue::From<bool>(this->IsChecked);
 };

 virtual void __fastcall SetData(const TValue&Value)
 {
  TValue V(Value);
  this->IsChecked=V.AsBoolean();
 };
};

//Redifine TCheckColumn class
class CheckColumnClass:public TCheckColumn
{
private:
 virtual Fmx::Controls::TStyledControl*__fastcall CreateCellControl(void)
 {
  CheckCellClass*Cell=new CheckCellClass(this);
  Cell->OnChange     =&(this->DoCheckChanged);
  return Cell;
 };

public:
__fastcall CheckColumnClass(System::Classes::TComponent*AOwner):TCheckColumn(AOwner)
 {
 };
};

//global Data for Save curent State Cell

boost::dynamic_bitset<unsigned char>FullDiscreteInputs;

Add To Grid In Constuctor
 FullDiscreteInputs.resize(100);
 DiscreteInputsGrid->RowCount=FullDiscreteInputs.size();    
 CheckColumnClass* DiscreteInPutsCheckColumn        =new CheckColumnClass(DiscreteInputsGrid);
 DiscreteInputsGrid->AddObject(CoilsCheckColumn);

void __fastcall TForm1::DiscreteInputsGridGetValue(TObject*Sender, const int Col, const int Row,TValue&Value)
{
 //...

 if(DiscreteInputsGrid->ColumnByIndex(Col)==DiscreteInPutsCheckColumn)
 {
 Value=TValue::From<bool>(FullDiscreteInputs[Row]);
 }
 //...
}

//---------------------------------------------------------------------------
void __fastcall TForm1::DiscreteInputsGridSetValue(TObject*Sender, const int Col, const int Row, const TValue&Value)
{
 TValue V(Value);
 if(DiscreteInputsGrid->ColumnByIndex(Col)==DiscreteInPutsCheckColumn)
 {
 FullDiscreteInputs[Row]=V.AsBoolean();
 }
}
//---------------------------------------------------------------------------
于 2015-05-15T07:36:04.507 に答える
0

C++ コードを示すことはできませんが、Delphi の例は簡単に翻訳できるはずです。

OnGetData および OnSetData イベントをリッスンすることにより、すべてのセル値を同じ方法で取得および設定し、TValue 型の取得/付与値を取得します (XE3 以降)。これは、TValue で適切な型を返す場合にすぎません。

uses System.RTTI;

procedure Form1.Grid1GetValue(Sender: TObject;const Col, Row: Integer;var Value: TValue);
begin
  if Col = 1 then
    Value := TValue.From<Integer>(1)
  else if Col = 2 then
    Value := TValue.From<String>('Hello')
  else if Col = 3 then
    Value := Tvalue.From<Single>(1.0);
end;

procedure Form1.Grid1SetValue(Sender: TObject;const Col, Row: Integer;const Value: TValue);
begin
  if Col = 1 then
    I := Value.As<Integer>
  else if Col = 2 then
    St := Value.As<String>
  else if Col = 3 then
    Si := Value.As<Single>;
end;

私が知る限り、ポップアップ メニューはデータを受け入れたり提供したりできません。

于 2013-03-21T20:27:51.590 に答える