如何把字符串转换成为DELPHI的语句?(200分)

  • 主题发起人 主题发起人 lmtfw
  • 开始时间 开始时间
L

lmtfw

Unregistered / Unconfirmed
GUEST, unregistred user!
FORM上有许多组件,如EDIT,DBGRID,BUTTON等,我从数据库中读出一段字符串,如:EDIT1.TEXT:='1234'
请问,如何才能将这个字符串转换成语句执行,将界面上的EDIT1的值赋值为‘1234’
当然,读出的字符串中也许包含其他类型控件赋值。
 
其实很好做:
1.你的组件名称,如:edit1可改成表中的对应字段名称FName
下面是我的软件中的代码:
var
I: Integer; vCompName: String;
begin
if gdb1.DataController.DataSet.IsEmpty then exit;

CustListLrForm:=TCustListLrForm.create(self);

Try
Try
CustListLrForm.Status := 2 ;

CustListLrForm.vItemid := Gdb1.DataController.DataSet.fieldbyname('FItemid').AsInteger;
For i:= 0 to CustListLrForm.ComponentCount - 1 do
begin
vCompName := CustListLrForm.CompOnents.Name;

if (CustListLrForm.CompOnents is TcxTextEdit) then
TcxTextEdit(CustListLrForm.FindComponent(vCompName)).Text := Gdb1.DataController.DataSet.fieldbyname(vCompName).AsString
else
if (CustListLrForm.CompOnents is TcxCheckBox) then
TcxCheckBox(CustListLrForm.FindComponent(vCompName)).Checked := StrToBoolean(Gdb1.DataController.DataSet.fieldbyname(vCompName).AsString)
else
if (CustListLrForm.CompOnents is TcxSpinEdit) then
TcxSpinEdit(CustListLrForm.FindComponent(vCompName)).Value := Gdb1.DataController.DataSet.fieldbyname(vCompName).AsInteger
else
if (CustListLrForm.CompOnents is TcxComboBox) and
(CustListLrForm.CompOnents.Tag=1) then
TcxComboBox(CustListLrForm.FindComponent(vCompName)).Text := Gdb1.DataController.DataSet.fieldbyname(vCompName).AsString
else
if (CustListLrForm.CompOnents is TcxComboBox) and
(CustListLrForm.CompOnents.Tag=2) then
TcxComboBox(CustListLrForm.FindComponent(vCompName)).ItemIndex := Gdb1.DataController.DataSet.fieldbyname(vCompName).AsInteger
else
if (CustListLrForm.CompOnents is TcxDateEdit) and
(CustListLrForm.CompOnents.Tag=1) then
TcxDateEdit(CustListLrForm.FindComponent(vCompName)).Date := Gdb1.DataController.DataSet.fieldbyname(vCompName).AsDateTime;



end;

CustListLrForm.showmodal;
aRefreshExecute(Sender);
Except
End;
Finally
CustListLrForm.Free;
end;

end;
 
楼上的兄弟,我数据库中读过来的值有可能是许多别的控件的不同属性啊,比如RADIO.CAPTION等等,如果按照这个方法岂不是非常繁琐,判断很多?
 
用 for I :=0 to AControl.ControlCount - 1 do
begin
if AControl.Controls is TEDIT then

////,TDBGRID,TBUTTONthen
 
把EDIT1.TEXT:='1234'分为三个字段, 控件名称 componentName, 控件属性 property, 控件属性值 value,
procedure TForm1.Button3Click(Sender: TObject);

var
ComponentName : string;
strProperty : string;
strValue : String;
PropInfo : PPropInfo;
StrProp : String;

procedure SetComponentValue;
var
i : Integer;
begin

for I:=0 to Self.ComponentCount - 1 do
begin
if Components.Name = ComponentName then
begin
PropInfo := GetPropInfo(Components.classinfo, Strproperty);
if (PropInfo <> nil) and (PropInfo.Name = strProperty) then
begin
SetPropValue(Components,strProperty, strValue);
end;
end;


end;

end;

begin
with query1 do
begin
while not eof do
begin
ComponentName := fieldbyName('componentName').AsStirng;
strProperty := fieldbyName('property').AsStirng
strValue := fieldbyName('value').AsStirng
SetComponentValue;
next;
end;
end;
 
不如自己按数据库的数据创建这些组件,再赋值.
 
这就是编译语言比解释语言差的地方。
 
i listening
 
ifiles讲的是正确的。我基于他的思路重写了一下
function TfmMain.SetComponentValue(const AComponentName, AStrProperty, AStrValue: string): Boolean;
var
PropInfo: PPropInfo;
AComponent: TComponent;
begin
Result := False;
AComponent := Self.FindComponent(AComponentName);
if AComponent = nil then Exit;
PropInfo := GetPropInfo(AComponent, AStrproperty);
if (PropInfo <> nil) and (PropInfo.Name = AStrProperty) then
begin
try
SetPropValue(AComponent, AStrProperty, AStrValue);
except
Exit;
end;
end
else Exit;
Result := True;
end;
 
下载个pascal语言解释控件吧,就像fastreport内置解释器一样。解析你数据库中存的程序。
 
庆五一,返现金,送红包!活动已经停止
为庆祝五一节日,同时感谢广大支持soho之家的朋友。SOHO之家现特举行以下活动:
活动时间:2006年4月23日~2006年5月7日24点
活动目的:给希望加入的会员更多利益,鼓励和奖励新会员!给老会员更多奖励,并迅速扩充你的团队!
活动内容:
活动一:加入返现金活动!
凡在4月23日~5月7日之间付费加入的新会员,将得到10~50元不等的现金奖励!
4月23日~4月30日 加入,奖励50元( 由一、二级上级分别返赠20元 30元)
5月01日~5月03日 加入,奖励30元( 由一、二级上级分别返赠20元 10元)
5月04日~5月07日 加入,奖励10元( 由一级上级返赠10元)
操作办法:会员汇款仍然按正常金额汇款150。银行付费的登记汇款,开通时系统自动给奖金。在线支付的自动开通,管理员会手动给奖金。

活动二: 优秀会员送红包!
在4月23日~5月7日之间,发展直接下级每超过10个,总站给予100元红包奖励!比如,你在这期间发展了100名直接下级,除了你自己的5000元提成外,总站再另外给予1000元的额外红包奖励!
操作方法:5 月8日~5月10日 联系qq 277341915 进行领取。

以上活动自4月23日开始执行,有任何问题可联系管理员。
请会员互相转告,务必每个会员都知晓本期活动,可在自己网站上进行公告以吸引新人加入,提高自己的业绩!
请大家迅速联系自己的临时代理,抓紧这个机遇转正!并让他们也抓紧这个机遇发展!

以上活动已于2006年4月24日24点停止!!
注册地址:http://3711.9soho.com
 
多谢几位,特别是ifiles的想法,还有godlord911的整理,目前思路比较清晰了。但数据库中控件有可能是TADOQUERY等数据库控件,而且有参数的赋值,比如
ADOQUERY1.PARAMERITERS.PARAMBYNAME('参数').value='值'
大家是否有更好的想法?
请大家继续讨论
 
yacc & lex
自己做个简单的编译器(我正在考虑中呢,呵呵)
 
后退
顶部