运行字符串里的命令!!(100分)

  • 主题发起人 主题发起人 junymail
  • 开始时间 开始时间
J

junymail

Unregistered / Unconfirmed
GUEST, unregistred user!
[?][?]
我在程序中要用以下方法:
如:有一字符串变量 str:string;
str:='edit1.text:=''YES''';
我要在运行期执行 str 内的语句,如何达到目的?
请教高手. 100元

 
WinExec、Shellexecute、ShellexecuteEx
 
错了,不对!
 
那肯定要做一个词法分析了,
例如
if (parse(str))='xxxx')
begin
edit1.txt = 'yes';
end;
 
同时需要使用FindComponent来确定控件。
 
这个肯定要一个解释程序
 
我看你是想解释执行DELPHI程序吧?可以用Dream Scripter。
你可以去www.dream-com.com下载Demo
 
你们可能搞错了.
我要执行字符串内的语句.
 
没错,就是要执行Edit1.Text:='aa',但是这些都是动态的。
但是这样真的很难。
理论上是可以的。
首先,找“=”,然后,找“.”,就能够确定几个要素了。
最后,使用findComponent确定元件,然后需要赋给属性了,这个暂时没相通。
 
你到底要干什么?把你的需求写清楚!
如果只是实现对于一个已经存在的组件的一个赋值的话,那么用yzshi的方法就可以了。
 
我的想法还缺一步,如何给寻找属性。
 
{-----------------------------------------------------------------------------
Procedure: GetPropertyValue
Author: LiYaLei(liyaeli@163.net)
Date: 2001-11-29 16:02:07
Arguments:
Instance: TObject;
PropInfo: PPropInfo // 属性的指针获取方法GetPropInfo(TClass.ClassINfo,PropertyName)
Result: string
Purpose: 得到一个对象的属性值
History:
-----------------------------------------------------------------------------}

function GetPropertyValue(Instance: TObject
PropInfo: PPropInfo): string;
var
ClassName : string;
begin
Result := '';
if PropInfo <> nil then
begin
ClassName := PropInfo^.PropType^.Name;
if ClassName = 'TDateTime' then
begin
if GetFloatProp(Instance, PropInfo) <> 0 then
Result := FormatDateTime('yyyy''年''m''月''d''日''h''时''n''分''',
GetFloatProp(Instance, PropInfo))
end
else
if ClassName = 'TPicture' then
Result := 'TPicture'
else
if ClassName = 'Double' then
Result := FloatToStr(GetFloatProp(Instance, PropInfo))
else
Result := GetStrProp(Instance, PropInfo);
end;
end;

{-----------------------------------------------------------------------------
Procedure: GetPropertyNames
Author: LiYaLei(liyaeli@163.net)
Date: 2001-11-29 16:06:03
Arguments:
pti: PTypeInfo;//类信息的指针,获取方法TCalss.ClassInfo
sList: TStrings
Result: None
Purpose: 得到一个对象的属性列表
History:
-----------------------------------------------------------------------------}

procedure GetPropertyNames(pti: PTypeInfo
sList: TStrings);
var
ppi : PPropInfo;
pProps : PPropList;
nProps, i : Integer;
ptd : PTypeData;
begin
ptd := GetTypeData(pti);
nProps := ptd^.PropCount;
if nProps > 0 then
begin

GetMem(pProps, SizeOf(PPropInfo) * nProps);
try
GetPropInfos(pti, pProps);
// SortPropList(pProps,nProps);

for i := 0 to nProps - 1 do
begin
ppi := pProps;
sList.Add(ppi.Name);

end;
finally
FreeMem(pProps);
end;
end;
end;
 
可能要分析字串。
另外,你的edit1.txt变不变?
问题表述不是很清楚啊。
就你的那个例子应该是可以解决的,如果Tedit不变也好办一点。
比如,你可以写一个参数为Tedit的过程,然后为Tedit的Text属性赋值。
而值则通过分析str的内容得来。
如果连edit也变,恐怕就不好写了。
随便说说,姑妄听之。呵呵。
 

s := TStringList.Create;
try
GetPropertyNames(TGZP.ClassInfo, s);
for i := 0 to s.Count - 1 do
begin
PropInfo := GetPropInfo(TGZP.ClassInfo,
s);
if Uppercase(s) = 'GZNRT' then
// if PropInfo^.PropType^.Name = 'TPicture' then
begin
//通过动属性访问,获取属性值
Pic := TPicture(GetObjectProp(TObject(Data), PropInfo));
if pic.Graphic <> nil then
begin
pic.SaveToFile(FTempBmp);
v := Word.Selection.InlineShapes.AddPicture(FTempBmp);
if v.Height > 201 then
v.Height := 201;
end;
end
else
Word.Selection.TypeText(GetPropertyValue(TObject(Data), PropInfo));
end;
end;
finally
s.Free;
end;
 
如果是简单的只是对属性赋值,我上面的方法稍加更改就可以了,
上面的方法是读出所有的属性值,写属性值的话,也应该差不多
 
我觉得如果是要执行字符串中所代表的命令,可以直接把STR的值在程序中赋给所要执行它的
语句就行了,我是看不懂,你倒底想问什么啊,请明确你的问题啊!
 
不好意思.可能我还没有把问题讲透.再试一下.
我需要一个过程,此过程可以在程序运行期按不同的情况给不同的 label.caption
付值 如当 i:=1 给 label1.caption:='yes'
i:=2 label2.caption:='yes'
i:=3 label3.caption:='yes'

因为结构庞大,我不想用 case if 等条件语句 , 而想用循环语句

var str:string;
str:='label'+inttostr(i)+'.caption:=''yes''';

但是此时我无法运行 str 串中的语句, 即运行 label1.caption:='yes'
如何可以把字符串中的变量当作运行期的语句来执行是现在的关键,
各位大侠请多多指教!






 
分析STR,判断属性,执行相应代码!
 
设定各LABEL的TAG的值

FOR I:=1 TO COUNT DO
BEGIN
IF tLABEL(SENDER).TAG=I THEN
TLABEL(SENDER).CAPTION := 'YES';
END;
 
sanming 你好

你的法子不错,可惜的是 tLABEL(SENDER).TAG=I 无法实现

各位还有办法吗?
 
后退
顶部