VCB自动保存加载输入控件内容
本文地址:http://txm.tongxinmao.com/Article/Detail/id/475
// ---------------------------------------------------------------------------
#pragma hdrstop
#include "ControlCfg.h"
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <Dialogs.hpp>
#include <System.JSON.hpp>
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#define CFGFILE "ccfg.txt"
typedef struct{
String name;
String className;
String arg1;
String arg2;
}CONTROL_CFG;
static TList *controlList = new TList();
void restoreControl(TComponent *container) {
if (!controlList)
return;
for (int i = 0; i < controlList->Count; i++) {
CONTROL_CFG *cc = (CONTROL_CFG*)controlList->Items[i];
if (cc->className == "TLabel") {
TLabel *c = (TLabel*)container->FindComponent(cc->name);
c->Caption = cc->arg1;
}
if (cc->className == "TButton") {
TButton *c = (TButton*)container->FindComponent(cc->name);
c->Caption = cc->arg1;
}
if (cc->className == "TCheckBox") {
TCheckBox *c = (TCheckBox*)container->FindComponent(cc->name);
c->Checked = cc->arg1 == "Checked" ? true : false;
}
if (cc->className == "TComboBox") {
TComboBox *c = (TComboBox*)container->FindComponent(cc->name);
c->ItemIndex = cc->arg1.ToInt();
}
if (cc->className == "TEdit") {
TEdit *c = (TEdit*)container->FindComponent(cc->name);
c->Text = cc->arg1;
}
if (cc->className == "TMemo") {
TMemo *c = (TMemo*)container->FindComponent(cc->name);
c->Text = cc->arg1;
}
if (cc->className == "TRichEdit") {
TRichEdit *c = (TRichEdit*)container->FindComponent(cc->name);
c->Text = cc->arg1;
}
// Form1-> PrintMsg(String().sprintf(L"控件类型:%s 名称:%s 属性:%s",cc->className.c_str(),cc->name.c_str(),cc->arg1.c_str()));
}
}
void EnumerateAll(TComponent *container) {
// Enumarate its children
for (int i = 0; i < container->ComponentCount; i++) {
// extract the control at index i
TComponent *child = container->Components[i];
if (child->InheritsFrom(__classid(TComponent)))
// this check is optional
{
TControl *control = (TControl*)child;
TClass c = control->ClassType();
String className = c->ClassName();
String name = control->Name;
String property = "";
if (control->ClassNameIs("TLabel")) {
TLabel *pc = dynamic_cast<TLabel*>(control);
property = (pc->Caption);
}
if (control->ClassNameIs("TButton")) {
TButton *pc = dynamic_cast<TButton*>(control);
property = (pc->Caption);
}
if (control->ClassNameIs("TEdit")) {
TEdit *pc = dynamic_cast<TEdit*>(control);
property = (pc->Text);
}
if (control->ClassNameIs("TMemo")) {
TMemo *pc = dynamic_cast<TMemo*>(control);
property = (pc->Text);
}
if (control->ClassNameIs("TRichEdit")) {
TRichEdit *pc = dynamic_cast<TRichEdit*>(control);
property = (pc->Text);
}
if (control->ClassNameIs("TComboBox")) {
TComboBox *pc = dynamic_cast<TComboBox*>(control);
property = (pc->ItemIndex);
}
if (control->ClassNameIs("TCheckBox")) {
TCheckBox *pc = dynamic_cast<TCheckBox*>(control);
property = (pc->Checked ? "Checked" : "noChecked");
}
CONTROL_CFG *cc = new CONTROL_CFG;
cc->name = name;
cc->className = className;
cc->arg1 = property;
controlList->Add(cc);
}
}
}
static String getExePath()
{
return ExtractFilePath( ParamStr ( 0 ) );
}
// http://www.cppfans.com/cbknowledge/skills/files/json.asp
void loadcfg(TComponent *container) {
if(!FileExists(getExePath()+CFGFILE)) return;
TStrings *ts = new TStringList();
ts->LoadFromFile(getExePath()+CFGFILE);
controlList->Clear();
UnicodeString jsonstr = ts->GetText();
TJSONValue *lpJson = System::Json::TJSONObject::ParseJSONValue(jsonstr);
if(lpJson==NULL)return;
TJSONArray* lpArray = dynamic_cast<TJSONArray*>(lpJson);
for (int i = 0; i < lpArray->Count; i++) {
CONTROL_CFG *cc = new CONTROL_CFG;
TJSONValue *lpItem = lpArray->Items[i];
TJSONObject *lpJSONObject = dynamic_cast<TJSONObject*>(lpItem);
// lpItem 可能是结构体、数组、或者简单的值
TJSONValue *lpValue = lpJSONObject->Values[L"name"];
if (lpValue) // 如果有 strval 这个关键字
{
// 只要不是 TJSONObject 和 TJSONArray 就能用 Value() 获取到值
cc->name = lpValue->Value();
}
lpValue = lpJSONObject->Values[L"cname"];
if (lpValue)
{
cc->className = lpValue->Value();
}
lpValue = lpJSONObject->Values[L"arg1"];
if (lpValue)
{
cc->arg1 = lpValue->Value();
}
lpValue = lpJSONObject->Values[L"arg2"];
if (lpValue)
{
cc->arg2 = lpValue->Value();
}
controlList->Add(cc);
}
delete lpJson;
restoreControl(container);
}
void savecfg(TComponent *container) {
EnumerateAll(container);
TJSONArray *lpStrings = new TJSONArray;
for (int i = 0; i < controlList->Count; i++) {
CONTROL_CFG *cc = (CONTROL_CFG*)controlList->Items[i];
TJSONObject *lpJson = new TJSONObject;
lpJson->AddPair(L"name", cc->name);
lpJson->AddPair(L"cname", cc->className);
lpJson->AddPair(L"arg1", cc->arg1);
lpJson->AddPair(L"arg2", cc->arg2);
lpStrings->Add(lpJson);
}
String str = lpStrings->ToString();
TStrings *ts = new TStringList();
ts->SetText(str.c_str());
ts->SaveToFile(CFGFILE);
delete lpStrings;
}
/*
void PrintControl(TControl *control)
{
if(control==NULL || control==Form1)
{
controlList->Clear();
Form1-> PrintMsg("bianli form:"+ String(Form1-> ControlCount));
for(int i=0;i< Form1-> ControlCount;i++)
{ // Form1-> PrintMsg(Form1-> Controls[i]->Name);
PrintControl(Form1-> Controls[i]);
}
return;
}
TClass c = control->ClassType();
String className = c->ClassName();
String name = control->Name;
String property="";
if(control-> ClassNameIs("TEdit"))
{
TEdit *pc = dynamic_cast<TEdit*>(control);
property=(pc->Text);
}
if(control-> ClassNameIs("TMemo"))
{
TMemo *pc = dynamic_cast<TMemo*>(control);
property= (pc->Text);
}
if(control-> ClassNameIs("TComboBox"))
{
TComboBox *pc = dynamic_cast<TComboBox*>(control);
property= (pc->ItemIndex);
}
if( control-> ClassNameIs("TPanel"))
{
TPanel *pPanel = dynamic_cast<TPanel*>(control);
for(int i=1;i< pPanel-> ControlCount;i++)
{
PrintControl(pPanel-> Controls[i]);
}
}
if( control-> ClassNameIs("TGroupBox"))
{
TGroupBox *pb = dynamic_cast<TGroupBox*>(control);
for(int i=1;i< pb-> ControlCount;i++)
{
PrintControl(pb-> Controls[i]);
}
}
if( control-> ClassNameIs("TPageControl"))
{
TPageControl *pb = dynamic_cast<TPageControl*>(control);
for(int i=1;i< pb-> ControlCount;i++)
{
PrintControl(pb-> Controls[i]);
}
}
if( control-> ClassNameIs("TTabSheet"))
{
TTabSheet *pb = dynamic_cast<TTabSheet*>(control);
for(int i=1;i< pb-> ControlCount;i++)
{
PrintControl(pb-> Controls[i]);
}
}
CONTROL_CFG *cc = new CONTROL_CFG;
cc->name = name;
cc->className = className;
cc->arg1 = property;
controlList->Add(cc);
}
*/
/*
for(iFormIdx=0; iFormIdx<Screen->FormCount; iFormIdx++)
{
TForm *pForm = Screen->Forms[iFormIdx];
for( int i=0;i<Application->ComponentCount;i++)
{
((TEdit *)GroupBox1->FindChildControl("Edit" + IntToStr(i)))->Text = "我被改了";
((TEdit *)FindComponent("Edit" + IntToStr(i)))->Text = "我被改了";
Components TCompont* 目前Form上指向所有控件的数组
Controls TControl* 目前Form上指向某一子区域上所有控件的数组
*/上一篇:使用BluetoothHidDevice将安卓手机同时模拟成鼠标和键盘
下一篇:PHP RSSI 距离计算