2016-06-20 48 views
1

如何將特定的備忘錄行轉換爲文本編輯框?德爾福將備忘錄輸出轉換爲edit.text

我想獲得分配給TAP適配器到文本框的特定IP地址,並且我在文本框中添加了IP路由,但是在將IP導入到文本框中的堆棧中有沒有更好的主意或方式可以從TAP設備適配器或任何其他更簡單的方法查詢IP?

net30,ping 5,ping-restart 10,socket-flags TCP_NODELAY,ifconfig 10.8.0.6 10.8.0.5' 

我的目標是將最後一個IP 10.8.0.5導入到文本編輯框。

+0

取最後一個空格後的所有文本。你以前用字符串做過任何編程嗎?你知道如何提取部分字符串嗎? –

回答

3

分割字符串與空間分隔符使用TStringHelper.Split,並採取最後一個字符串:

function FilterIP(const s: String): String; 
var 
    splitted: TArray<String>; 
begin 
    if (s = '') then 
    Result := '' 
    else begin 
    splitted := s.Split([' ']); 
    Result := splitted[Length(splitted)-1]; 
    end; 
end; 

myEdit.Text := FilterIP(MyMemo[myLine]); 

你也可以使用StrUtils.SplitString拆分字符串。

在Delphi-7可以使用DelimitedText in TStringList

sList.Delimiter := ' '; 
sList.DelimitedText := s; 

其他辦法來分割字符串見here


正如David在評論中提到,你可以跳過從字符串後面搜索空間分隔符分配未使用的字符串。這可能與SysUtils.LastDelimiter來完成:

function FilterIP(const s: String): String; 
var 
    lastIx: Integer; 
begin 
    lastIx := LastDelimiter(' ',s); 
    if (lastIx > 0) then 
    Result := Copy(s,lastIx+1) 
    else 
    Result := ''; 
end; 
+0

正在使用德爾福7,所以我在這一行上得到一個錯誤 拆分:TArray ; –

+0

@JkRobbin,答案已更新。 –

+0

看起來像一個恥辱做所有的工作分裂整個字符串,創建一個數組和所有這些字符串,只是把它們扔掉..... –

0

你可以像下面這樣做(如果IP總是在結尾):

var tmp_str: String; 
... 
tmp_str:=Memo1.Lines[0]; //change the 0 to your desired line 
while(Pos(' ', tmp_str)>0)do Delete(tmp_str, 1, Pos(' ', tmp_str)); 
Edit1.Text:=tmp_str; 
+0

真的毫無意義地執行所有堆分配。爲什麼不從字符串的右手邊開始閱讀,直到找到空間。此外,對'Pos'的重複調用效率不高並且很難看。 –

+0

這是一行字符串,大約有10個Pos的調用。我們不是在20世紀70年代保存每一個內存和CPU週期。 – jano152

+0

表現現在和現在一樣重要,重複可以說是一個更大的罪。 –

2

如果是我,我會把剛剛從月底開始的字符串,並回溯到我找到第一個空格字符。您所需的文字是可以找到的權利。

function FilterIP(const s: string): string; 
var 
    i: Integer; 
begin 
    i := Length(s); 
    while (i>=1) and (s[i]>' ') do 
    dec(i); 
    Result := Copy(s, i+1, MaxInt); 
end;