将 TEdit.Text 转换为字符串数组,Delphi
Convert TEdit.Text to array of string, Delphi
此代码更改 IP 地址没有问题
function ArrayToVarArray(Arr : Array Of string):OleVariant; overload;
var
i : integer;
begin
Result :=VarArrayCreate([0, High(Arr)], varVariant);
for i:=Low(Arr) to High(Arr) do
Result[i]:=Arr[i];
end;
procedure SetStaticIP();
Const
wbemFlagForwardOnly = [=12=]000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
vIPAddress : OleVariant;
vSubnetMask : OleVariant;
vDefaultIPGateway : OleVariant;
vGatewayCostMetric : OleVariant;
begin
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=True','WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
vIPAddress := ArrayToVarArray(['192.168.2.22']);
vSubnetMask := ArrayToVarArray(['255.255.255.0']);
if FWbemObject.EnableStatic(vIPAddress, vSubnetMask) = 0 then
begin
vDefaultIPGateway := ArrayToVarArray(['192.168.2.2']);
vGatewayCostMetric := ArrayToVarArray(['1']);
FWbemObject.SetGateways(vDefaultIPGateway,vGatewayCostMetric);
end;
VarClear(vIPAddress);
VarClear(vSubnetMask);
VarClear(vDefaultIPGateway);
VarClear(vGatewayCostMetric);
FWbemObject:=Unassigned;
end;
end;
但我想让用户输入(IP、子网、网关)
所以我把代码改成了这样
function ArrayToVarArray(Arr : Array Of string):OleVariant; overload;
var
i : integer;
begin
Result :=VarArrayCreate([0, High(Arr)], varVariant);
for i:=Low(Arr) to High(Arr) do
Result[i]:=Arr[i];
end;
procedure SetStaticIP(IP, Subnet, Gateway: array of string);
Const
wbemFlagForwardOnly = [=13=]000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
vIPAddress : OleVariant;
vSubnetMask : OleVariant;
vDefaultIPGateway : OleVariant;
vGatewayCostMetric : OleVariant;
begin
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=True','WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
vIPAddress := ArrayToVarArray(IP);
vSubnetMask := ArrayToVarArray(Subnet);
if FWbemObject.EnableStatic(vIPAddress, vSubnetMask) = 0 then
begin
vDefaultIPGateway := ArrayToVarArray(Gateway);
vGatewayCostMetric := ArrayToVarArray(['1']);
FWbemObject.SetGateways(vDefaultIPGateway,vGatewayCostMetric);
end;
VarClear(vIPAddress);
VarClear(vSubnetMask);
VarClear(vDefaultIPGateway);
VarClear(vGatewayCostMetric);
FWbemObject:=Unassigned;
end;
end;
但是已经不行了
我发现我必须将输入文本转换为 array of string
,
所以我这样做了
procedure TForm1.BtnApplyClick(Sender: TObject);
var
IP, Subnet, Gateway: array of string;
I: Integer;
begin
SetLength(IP, EdtIP.GetTextLen);
for I := 0 to EdtIP.GetTextLen do IP[I] := Copy(EdtIP.Text, I, 1);
SetLength(Subnet, EdtSubnet.GetTextLen);
for I := 0 to EdtSubnet.GetTextLen do Subnet[I] := Copy(EdtIP.Text, I, 1);
SetLength(Gateway, EdtGateway.GetTextLen);
for I := 0 to EdtGateway.GetTextLen do Gateway[I] := Copy(EdtIP.Text, I, 1);
SetStaticIP(IP, Subnet, Gateway);
end;
但是还是不行,我找不到哪里错了!
有什么想法可以让这段代码正常工作吗?
我找到了答案
procedure TForm1.BtnApplyClick(Sender: TObject);
var
IP, Subnet, Gateway: array of string;
begin
SetLength(IP, 1);
SetLength(Subnet, 1);
SetLength(Gateway, 1);
IP[0] := EdtIP.Text ;
Subnet[0] := EdtSubnet.Text ;
Gateway[0] := EdtGateway.Text ;
SetStaticIP(IP, Subnet, Gateway);
end;
像这样使用开放数组构造函数:
procedure TForm1.BtnApplyClick(Sender: TObject);
begin
SetStaticIP([EdtIP.Text], [EdtSubnet.Text], [EdtGateway.Text]);
end;
这是最简洁的函数调用方式。
此代码更改 IP 地址没有问题
function ArrayToVarArray(Arr : Array Of string):OleVariant; overload;
var
i : integer;
begin
Result :=VarArrayCreate([0, High(Arr)], varVariant);
for i:=Low(Arr) to High(Arr) do
Result[i]:=Arr[i];
end;
procedure SetStaticIP();
Const
wbemFlagForwardOnly = [=12=]000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
vIPAddress : OleVariant;
vSubnetMask : OleVariant;
vDefaultIPGateway : OleVariant;
vGatewayCostMetric : OleVariant;
begin
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=True','WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
vIPAddress := ArrayToVarArray(['192.168.2.22']);
vSubnetMask := ArrayToVarArray(['255.255.255.0']);
if FWbemObject.EnableStatic(vIPAddress, vSubnetMask) = 0 then
begin
vDefaultIPGateway := ArrayToVarArray(['192.168.2.2']);
vGatewayCostMetric := ArrayToVarArray(['1']);
FWbemObject.SetGateways(vDefaultIPGateway,vGatewayCostMetric);
end;
VarClear(vIPAddress);
VarClear(vSubnetMask);
VarClear(vDefaultIPGateway);
VarClear(vGatewayCostMetric);
FWbemObject:=Unassigned;
end;
end;
但我想让用户输入(IP、子网、网关) 所以我把代码改成了这样
function ArrayToVarArray(Arr : Array Of string):OleVariant; overload;
var
i : integer;
begin
Result :=VarArrayCreate([0, High(Arr)], varVariant);
for i:=Low(Arr) to High(Arr) do
Result[i]:=Arr[i];
end;
procedure SetStaticIP(IP, Subnet, Gateway: array of string);
Const
wbemFlagForwardOnly = [=13=]000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
vIPAddress : OleVariant;
vSubnetMask : OleVariant;
vDefaultIPGateway : OleVariant;
vGatewayCostMetric : OleVariant;
begin
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=True','WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
vIPAddress := ArrayToVarArray(IP);
vSubnetMask := ArrayToVarArray(Subnet);
if FWbemObject.EnableStatic(vIPAddress, vSubnetMask) = 0 then
begin
vDefaultIPGateway := ArrayToVarArray(Gateway);
vGatewayCostMetric := ArrayToVarArray(['1']);
FWbemObject.SetGateways(vDefaultIPGateway,vGatewayCostMetric);
end;
VarClear(vIPAddress);
VarClear(vSubnetMask);
VarClear(vDefaultIPGateway);
VarClear(vGatewayCostMetric);
FWbemObject:=Unassigned;
end;
end;
但是已经不行了
我发现我必须将输入文本转换为 array of string
,
所以我这样做了
procedure TForm1.BtnApplyClick(Sender: TObject);
var
IP, Subnet, Gateway: array of string;
I: Integer;
begin
SetLength(IP, EdtIP.GetTextLen);
for I := 0 to EdtIP.GetTextLen do IP[I] := Copy(EdtIP.Text, I, 1);
SetLength(Subnet, EdtSubnet.GetTextLen);
for I := 0 to EdtSubnet.GetTextLen do Subnet[I] := Copy(EdtIP.Text, I, 1);
SetLength(Gateway, EdtGateway.GetTextLen);
for I := 0 to EdtGateway.GetTextLen do Gateway[I] := Copy(EdtIP.Text, I, 1);
SetStaticIP(IP, Subnet, Gateway);
end;
但是还是不行,我找不到哪里错了! 有什么想法可以让这段代码正常工作吗?
我找到了答案
procedure TForm1.BtnApplyClick(Sender: TObject);
var
IP, Subnet, Gateway: array of string;
begin
SetLength(IP, 1);
SetLength(Subnet, 1);
SetLength(Gateway, 1);
IP[0] := EdtIP.Text ;
Subnet[0] := EdtSubnet.Text ;
Gateway[0] := EdtGateway.Text ;
SetStaticIP(IP, Subnet, Gateway);
end;
像这样使用开放数组构造函数:
procedure TForm1.BtnApplyClick(Sender: TObject);
begin
SetStaticIP([EdtIP.Text], [EdtSubnet.Text], [EdtGateway.Text]);
end;
这是最简洁的函数调用方式。