var v :variant; begin v := '123'; //现在是字符串变量 ShowMessage(v); v := 123; //现在是integer型变量 v := v + 123; //可以直接相加 end; variant变量就是这样使用的
我的目的不是对变量的类型进行变换,而是由形参的值对同类变量名进行赋值。 本人的部份代码如下: procedure TfrmMenu1.DblClickCx(var Lx: String; BB: String; DGrd: TwwDBGrid); var DG1,DG2:String; begin if (DGrd.Fields[0].AsString='') or (DGrd.Fields[1].AsString='') then exit //若DBGrid1中无数据则退出 else begin DG1:=DGrd.Fields[0].AsString; DG2:=DGrd.Fields[1].AsString; //下面这段代码就是我提出的问题想达到的目的,也就是用更简单的代码完成相同功能 if Lx='X' then begin Xz8:=0; XNom:=0; Xjje:=0; end; if Lx='G' then begin Gx8:=0; GNom:=0; GJje:=0; end; if Lx= ...... end;
定义结构,再运用指针,可达到您想要的目的 T : record z8:.integer; Nom:integer; jje:integer; end; var x,g,k:t; p:^t; ... if Lx='X' then begin p:=x; end; if Lx='G' then begin p:=g; end; if Lx= ...... p.z8:=0; p.Nom:=0; p.jje:=0;
变通一下 procedure TForm1.Button3Click(Sender: TObject); type tr=Record Name:string[2];//存储变量名 value:^Integer;//存储变量值的指针 end; var Gx,Gy,Fx,Fy,i:integer;//变量 Temp:array[1..4] of Tr;//变量的信息(名,指针) FInput,FName:string;begin Finput:='G';//设传回来的值是'G' Temp[1].Name:='Gx'; Temp[1].value:=@Gx; Temp[2].Name:='Gy'; Temp[2].value:=@Gy; Temp[3].Name:='Fx'; Temp[3].value:=@Fx; Temp[4].Name:='Fy'; Temp[4].value:=@Fy; For i:=1 to 4 do begin //依次检查变量名,如第一个字符等于传回的字符,则赋0或进行其他操作 FName:=Temp[i].Name; if LeftStr(Fname,1)=FInput then Temp[i].value^:=0; end; end;
if Lx='X' then begin Xz8:=0; XNom:=0; Xjje:=0; end; if Lx='G' then begin Gx8:=0; GNom:=0; GJje:=0; end; if Lx= ...... end; 这段代码完全脱胎于解释型语言如Vfox,Vb,pascal程序编译完成后,象Gx8,Xz8这样的变量名称已被二进制地址值所代换。pascal是一个强类型检测语言,变更没有定义是不可能赋值的,你上面的代码能够运行的前提是Gx8、Xz8这些变量已经定义,你仅仅是通过一定的标志选择对不同的变量进行赋值。做为一种替换式的实现方式你可以用 yesxwl() 提供的方式,但改进一下 PDynVar=^DynVar; DynVar=Record varName:string[8]; varPointer:pointer; end;//定义结构,将名称和变动值的指针相关联procedure TForm1.Button1Click(Sender: TObject); var dynVars:TList; ptmp:PDynVar; str:string; lx:string; begin lx:='G'; str:='这是一个测试串'; dynVars:=TList.Create; if lx='G' then begin new(ptmp); ptmp.varName:=lx+'08'; ptmp.varPointer:=@str; dynVars.Add(ptmp); end else if lx='X' then begin new(ptmp); ptmp.varName:=lx+'08'; ptmp.varPointer:=@str; dynVars.Add(ptmp); end; with PDynVar(dynVars[0])^ do ShowMessage(format('Var name:%s,value:%s',[varName,pchar(VarPointer^)])); end;使用TList类来管理动态生成的变量序列,可以减少维护的工作量,而简洁明快。
它只能生成局部变量过程结束后就释放
x,y设置成变体变量,
在过程中处理: 将x 转化成string;x:=x+'string' 并赋初值为空;
将y 转化成sting;y:=y+'nm',将y转化成real 并赋初值为0;
我的意思是在此过程中是通过Lx参数来决定对哪些变量赋值。
例如:LX=G 那么就对以G开头的变量赋值。LX=K就对以K开头的变量赋值,以此类推。因为在这个过程中不需要对所有变量赋值,过程结束后已赋值的变量将保持不变。
对于编译器而言,变量是一种占位符,他最终被转换成内存地址:[eax],[ebx],[$400]等。
procedure genral(const var)
var
var+string:string;
begin
end;
你觉的这样的代码可能吗?
我建议你使用varaint变体变量,并利用其自身的v_type属性来控制其类型,只是这样的变量占的间有些大。
我对Delphi不很精通,你提的使用varaint变体变量本人不知如何使用。
v :variant;
begin
v := '123'; //现在是字符串变量
ShowMessage(v);
v := 123; //现在是integer型变量
v := v + 123; //可以直接相加
end;
variant变量就是这样使用的
本人的部份代码如下:
procedure TfrmMenu1.DblClickCx(var Lx: String; BB: String; DGrd: TwwDBGrid);
var
DG1,DG2:String;
begin
if (DGrd.Fields[0].AsString='') or (DGrd.Fields[1].AsString='') then
exit //若DBGrid1中无数据则退出
else
begin
DG1:=DGrd.Fields[0].AsString;
DG2:=DGrd.Fields[1].AsString;
//下面这段代码就是我提出的问题想达到的目的,也就是用更简单的代码完成相同功能
if Lx='X' then
begin
Xz8:=0;
XNom:=0;
Xjje:=0;
end;
if Lx='G' then
begin
Gx8:=0;
GNom:=0;
GJje:=0;
end;
if Lx= ...... end;
var
tempStr: String;
begin
tempStr := Lx+','+Value1+','+Value2;
// 这个tempStr不就是你要的东东吗?
// 不知道我这样理解对不对
// hehe^^ 这个方法好不好??
end;
var
tempStr: String;
begin
tempStr := Lx+','+Value1+','+Value2;
// 这个tempStr不就是你要的东东吗?
// 不知道我这样理解对不对
// hehe^^ 这个方法好不好??
end;
T : record
z8:.integer;
Nom:integer;
jje:integer;
end;
var
x,g,k:t;
p:^t;
... if Lx='X' then
begin
p:=x;
end;
if Lx='G' then
begin
p:=g;
end;
if Lx= ...... p.z8:=0;
p.Nom:=0;
p.jje:=0;
procedure TForm1.Button3Click(Sender: TObject);
type
tr=Record
Name:string[2];//存储变量名
value:^Integer;//存储变量值的指针
end;
var
Gx,Gy,Fx,Fy,i:integer;//变量
Temp:array[1..4] of Tr;//变量的信息(名,指针)
FInput,FName:string;begin
Finput:='G';//设传回来的值是'G'
Temp[1].Name:='Gx';
Temp[1].value:=@Gx;
Temp[2].Name:='Gy';
Temp[2].value:=@Gy;
Temp[3].Name:='Fx';
Temp[3].value:=@Fx;
Temp[4].Name:='Fy';
Temp[4].value:=@Fy;
For i:=1 to 4 do
begin //依次检查变量名,如第一个字符等于传回的字符,则赋0或进行其他操作
FName:=Temp[i].Name;
if LeftStr(Fname,1)=FInput then
Temp[i].value^:=0;
end;
end;
begin
Xz8:=0;
XNom:=0;
Xjje:=0;
end;
if Lx='G' then
begin
Gx8:=0;
GNom:=0;
GJje:=0;
end;
if Lx= ...... end;
这段代码完全脱胎于解释型语言如Vfox,Vb,pascal程序编译完成后,象Gx8,Xz8这样的变量名称已被二进制地址值所代换。pascal是一个强类型检测语言,变更没有定义是不可能赋值的,你上面的代码能够运行的前提是Gx8、Xz8这些变量已经定义,你仅仅是通过一定的标志选择对不同的变量进行赋值。做为一种替换式的实现方式你可以用 yesxwl() 提供的方式,但改进一下
PDynVar=^DynVar;
DynVar=Record
varName:string[8];
varPointer:pointer;
end;//定义结构,将名称和变动值的指针相关联procedure TForm1.Button1Click(Sender: TObject);
var
dynVars:TList;
ptmp:PDynVar;
str:string;
lx:string;
begin
lx:='G';
str:='这是一个测试串';
dynVars:=TList.Create;
if lx='G' then begin
new(ptmp);
ptmp.varName:=lx+'08';
ptmp.varPointer:=@str;
dynVars.Add(ptmp);
end
else
if lx='X' then begin
new(ptmp);
ptmp.varName:=lx+'08';
ptmp.varPointer:=@str;
dynVars.Add(ptmp);
end;
with PDynVar(dynVars[0])^ do
ShowMessage(format('Var name:%s,value:%s',[varName,pchar(VarPointer^)]));
end;使用TList类来管理动态生成的变量序列,可以减少维护的工作量,而简洁明快。
怎么不好好看看我的,我的就是一个字符串啦 hehe^^