https://community.embarcadero.com/index.php/blogs/entry/firedac-in-memory-dataset-tfdmemtable

ClientDataSet FieldDefs Add Field CreateDataSet 动态创建字段

  FDMemTable1.Close();
FDMemTable1.FieldDefs.Clear();
FDMemTable1.FieldDefs.Add('ID', ftInteger, 0, True);
FDMemTable1.FieldDefs.Add('Name', ftString, 20, false);
FDMemTable1.CreateDataSet();
FDMemTable1.AppendRecord([101, 'aaa']);
FDMemTable1.AppendRecord([102, 'bbb']);
FDMemTable1.AppendRecord([103, 'ccc']);

  TFDMemTable *table= new TFDMemTable();

delete table;

void __fastcall TForm1::createField()
{
ClientDataSet1->Close(); ClientDataSet1->Fields->Clear();
ClientDataSet1->FieldDefs->Clear(); ClientDataSet1->Open();
ClientDataSet1->Close();
for(int i = ;i < ClientDataSet1->Fields->Count ;i++)
ClientDataSet1->Fields->Fields[]->Free();//释放所有的静态字段 for(int i = ;i < ClientDataSet1->FieldDefs->Count ;i++)
ClientDataSet1->FieldDefs->Items[i]->CreateField(ClientDataSet1); TBooleanField *NewField;
NewField = new TBooleanField(ClientDataSet1);
NewField->FieldName="SelectMe";
NewField->DisplayLabel = "选择";
NewField->FieldKind=fkInternalCalc;
NewField->DataSet=ClientDataSet1;
NewField->Index = ;
ClientDataSet1->Open();
}
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
        sql = "select  from TABLE1 ";
        this->ADOQuery1->Close();
        this->ADOQuery1->SQL->Clear();
        this->ADOQuery1->SQL->Add(this->sql);
        this->ADOQuery1->Open();
        this->createField();
}
  cds1->Close();
cds1->FieldDefs->Clear();
cds1->FieldDefs->Add("ID", ftInteger, , true);
cds1->FieldDefs->Add("Name", ftString, , false);
cds1->FieldDefs->Add("DT", ftDateTime, , false);
cds1->CreateDataSet();
cds1->AppendRecord( ARRAYOFCONST((,"aaa",Now().DateTimeString() )));
cds1->AppendRecord( ARRAYOFCONST((,"bbb",Now().DateTimeString() )));
cds1->AppendRecord( ARRAYOFCONST((,"ccc",Now().DateTimeString() )));
  ClientDataSet1.Close();
ClientDataSet1.FieldDefs.Clear();
ClientDataSet1.FieldDefs.Add('ID', ftInteger, , true);
ClientDataSet1.FieldDefs.Add('Name', ftString, , false);
ClientDataSet1.FieldDefs.Add('DT', ftDateTime, , false);
ClientDataSet1.FieldDefs.Add('chk', ftBoolean, , false);
ClientDataSet1.CreateDataSet();
ClientDataSet1.Open;
ClientDataSet1.Append;
ClientDataSet1.FieldByName('id').Value := ;
ClientDataSet1.FieldByName('name').Value := 'abc';
ClientDataSet1.FieldByName('dt').Value := Now;
ClientDataSet1.Post;
ClientDataSet1.AppendRecord([,'bbb',Now()]);
ClientDataSet1.AppendRecord([,'ccc',Now()]);
CreateDataSet
FDMemTable1->Close();
FDMemTable1->FieldDefs->Clear();
FDMemTable1->FieldDefs->Add("ID", ftInteger, , true);
FDMemTable1->FieldDefs->Add("Name", ftString, , false);
FDMemTable1->FieldDefs->Add("DT", ftDateTime, , false);
FDMemTable1->CreateDataSet();
FDMemTable1->AppendRecord(ARRAYOFCONST((, "aaa", Now().DateTimeString())));
FDMemTable1->AppendRecord(ARRAYOFCONST((, "bbb", Now().DateTimeString())));
FDMemTable1->AppendRecord(ARRAYOFCONST((, "ccc", Now().DateTimeString())));
FDMemTable1->First();

AddFieldDef

with CDS2 do
begin
with FieldDefs.AddFieldDef do
begin
DataType := ftInteger;
Name := 'Field1';
end;
with FieldDefs.AddFieldDef do
begin
DataType := ftString;
Size := ;
Name := 'Field2';
end;
with IndexDefs.AddIndexDef do
begin
Fields := 'Field1';
Name := 'IntIndex';
end;
CreateDataSet;

C++也可以这样写

TVarRec row[] = {user, password, purview, "", 0};
 int value_size =8;
 
qry->AppendRecord(row, value_size);

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
TFieldDefs *pDefs = CDS2->FieldDefs;
TFieldDef *pDef = pDefs->AddFieldDef();
pDef->DataType = ftInteger;
pDef->Name = "Field1"; pDef = pDefs->AddFieldDef();
pDef->DataType = ftString;
pDef->Size = ;
pDef->Name = "Field2"; TIndexDef *pIDef = CDS2->IndexDefs->AddIndexDef();
pIDef->Fields = "Field1";
pIDef->Name = "IntIndex"; CDS2->CreateDataSet();
}

2016.8.25  FDMemTable 试验成功 ,三种创建的方式都最终成了InternalCalcField字段。

ClientDataSet1->Close();

    ClientDataSet1->Fields->Clear();
ClientDataSet1->FieldDefs->Clear(); TFieldDef *fd;
fd = ClientDataSet1->FieldDefs->AddFieldDef();
fd->InternalCalcField = true;
fd->Name = "calc1";
fd->DataType = ftString;
fd->Size = ; fd = ClientDataSet1->FieldDefs->AddFieldDef();
fd->InternalCalcField = true;
fd->Name = "flag";
fd->DataType = ftBoolean; ClientDataSet1->FieldDefs->Add("ID", ftString, , false);
ClientDataSet1->FieldDefs->Add("Name", ftString, , false);
ClientDataSet1->FieldDefs->Add("DT", ftString, , false);
ClientDataSet1->FieldDefs->Add("my", ftString, , false);
ClientDataSet1->FieldDefs->Find("my")->InternalCalcField = true; for(int i = ;i < ClientDataSet1->FieldDefs->Count ;i++)
ClientDataSet1->FieldDefs->Items[i]->CreateField(ClientDataSet1); TBooleanField *NewField;
NewField = new TBooleanField(ClientDataSet1);
NewField->FieldName="SelectMe";
NewField->DisplayLabel = "选择";
NewField->FieldKind=fkInternalCalc;
NewField->DataSet=ClientDataSet1; // ClientDataSet1->CreateDataSet(); 有了上面的CreateField,此句可不要。仅此句还不能创建fkInternalCalc字段,创建变成了fkData
ClientDataSet1->Open(); for (int i = ; i < ClientDataSet1->Fields->Count; i++)
{ ClientDataSet1->Fields->Fields[i]->FieldName;
ClientDataSet1->Fields->Fields[i]->FieldKind;
}

如果dfm窗体文件定义了字段,那么不用createDataSet了,只要open就可以了。

object ds1: TFDMemTable
    OnCalcFields = ds1CalcFields
    FieldDefs = <>
    CachedUpdates = True
    IndexDefs = <>
    FetchOptions.AssignedValues = [evMode]
    FetchOptions.Mode = fmAll
    ResourceOptions.AssignedValues = [rvSilentMode]
    ResourceOptions.SilentMode = True
    UpdateOptions.AssignedValues = [uvCheckRequired, uvAutoCommitUpdates]
    UpdateOptions.CheckRequired = False
    UpdateOptions.AutoCommitUpdates = True
    StoreDefs = True
    Left = 352
    Top = 160
    object ds1Field: TDateTimeField
      FieldName = aaa
    end
    object ds1Field2: TStringField
      FieldName = bbb
    end
    object ds1Field3: TStringField
      FieldName = ccc
    end

ds1->Close();

ds1->Open();

内存表 FDMemTable ClientDataSet CreateDataSet 动态创建字段的更多相关文章

  1. odoo 动态创建字段的方法

    动态创建字段并非一个常见的的需求,但某些情况下,我们确实又需要动态地创建字段. Odoo 中创建字段的方法有两种,一种是通过python文件class中进行定义,另一种是在界面上手工创建,odoo通过 ...

  2. DevExpress GridControl 动态创建字段及主细关系表过程

    原文地址:http://hi.baidu.com/qdseashore/item/38f1153e9d0143637d034b7a 在做项目中,往往需要在查询基类模板窗口内做主细关系Grid,引用一下 ...

  3. delphi 新版内存表 FDMemTable

    c++builder XE 官方demo最全60多个 http://community.embarcadero.com/blogs?view=entry&id=8761 FireDAC.Com ...

  4. C#动态创建和动态使用程序集、类、方法、字段等

    C#动态创建和动态使用程序集.类.方法.字段等 分类:技术交流 (3204)  (3)   首先需要知道动态创建这些类型是使用的一些什么技术呢?其实只要相关动态加载程序集呀,类呀,都是使用反射,那么动 ...

  5. kbmMemTable关于内存表的使用,以及各种三层框架的评价

    关于内存表的使用(kbmMemTable) 关于内存表的使用说明一. Delphi使用内存表1.1 Delphi创建内存表步骤:1. 创建一个Ttable实例.2. 设置一个DataBaseName为 ...

  6. 关于Delphi内存表的使用说明

    关于Delphi内存表的使用说明: 1.建立临时表  数据输入是开发数据库程序的必然环节.在Client/Server结构中,客户端可能要输入一批数据后,再向服务器的后台数据库提交,这就需要在本地(客 ...

  7. silverlight依据json字符串动态创建实体类

    1.接收json字符串: //用JsonValue转换json字符串是为了之后获得json字符串的每行数据和每一列的列名 JsonValue jv = JsonValue.Parse(json);   ...

  8. 022. ASP.NET为DataSet中数据集添加关系及动态创建主子表和添加主子表关系

    protected void Page_Load(object sender, EventArgs e) { string connectionString = "server=.;data ...

  9. YII2框架动态创建表模型

    YII2框架动态创建表模型 在YII2中,每个表对应一个model类 在开发过程中,我们在填写一个大型表单的时候,表单里有N个select下拉列表,每个下拉select来自于不同的表: 如果要在程序里 ...

随机推荐

  1. 2243: [SDOI2011]染色 树链剖分+线段树染色

    给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如“112221”由3段组 ...

  2. <p>1、查询端口号占用,根据端口查看进程信息</p>

    2017年6月份的时候,我就着手在公司推广git,首先我自己尝试搭建了GitLab来管理代码,并且通过以下博客记录了GitLab的搭建,以及GitLab备份,GitLab升级等事情. git学习——& ...

  3. POJ 3414 Pots 暴力,bfs 难度:1

    http://poj.org/problem?id=3414 记录瓶子状态,广度优先搜索即可 #include <cstdio> #include <cstring> #inc ...

  4. bzoj1176

    题解: 和上一题差不多 就加上一个初始值 代码: #include<bits/stdc++.h> ; using namespace std; int n,m,cnt,s,sum[N],a ...

  5. scrollTop和scrollLeft属性

    外层元素的高度值是200px,内层元素的高度值是300px.很明显,“外层元素中的内容”高过了“外层元素”本身.当向下拖动滚动条时,有部分内容会隐没在“外层元素的上边界”之外,scrollTop就等于 ...

  6. scikit-learn 学习笔记-- Generalized Linear Models (一)

    scikit-learn 是非常优秀的一个有关机器学习的 Python Lib,包含了除深度学习之外的传统机器学习的绝大多数算法,对于了解传统机器学习是一个很不错的平台.每个算法都有相应的例子,既可以 ...

  7. Buildroot 打包文件系统流程跟踪

    /********************************************************************************* * Buildroot 打包文件系 ...

  8. I.MX6 Android mmm convenient to use

    # # 主要是记录mmm的简便自动化执行方式,为了减少键盘输入 # ]; then echo echo " Usage: ./remmm.sh <source dirctory> ...

  9. Vitya in the Countryside

    Every summer Vitya comes to visit his grandmother in the countryside. This summer, he got a huge war ...

  10. Chrome 上传时打开对话框非常慢

    Chrome 上传时打开对话框非常慢 先说解决方法,将 Chrome 中这个选项关闭,打开会飞快. 如果只是图片之类是不会的,但是有 zip apk 之类的就会慢. 主要原因还是 Chrome 太安全 ...