将 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;

这是最简洁的函数调用方式。