2016-06-20 20 views
1

Как преобразовать определенную строку memo out в текстовое поле редактирования?Delphi конвертирует вывод memo в edit.text

Я хотел бы получить конкретный IP-адрес, назначенный адаптеру TAP, в текстовое поле, и я добавлю маршрут IP-адреса в текстовое поле, но я столбец при импорте IP-адреса в текстовое поле есть лучшая идея или способ может запрашивать IP-адрес от адаптера устройства TAP или любого другого более простого метода?

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

Am направленного на последнем И.П. 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 другие альтернативы для разбиения строки.


Как уже упоминался Дэвид в комментариях, вы могли бы пропустить выделение неиспользуемых строк с помощью функции поиска пространства разделителя из задней части строки. Это может быть сделано с 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

Am используя Delphi 7, получаем ошибку в этой строке split: 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. Мы не в 1970-х годах, чтобы сохранить каждый бит памяти и цикл процессора. – 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; 
Смежные вопросы