【问题标题】:Delphi converting memo output to edit.textDelphi将备忘录输出转换为edit.text
【发布时间】:2016-10-21 08:05:45
【问题描述】:

如何将特定行的备忘录转换为文本编辑框?

我想将分配给 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 被导入文本编辑框。

【问题讨论】:

  • 取最后一个空格后的所有文字。你以前用字符串编程过吗?你知道如何提取部分字符串吗?

标签: delphi memo


【解决方案1】:

使用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;

【讨论】:

  • 我正在使用 Delphi 7,所以在拆分的这一行上出现错误:TArray;
  • 似乎很遗憾做所有这些工作来拆分整个字符串,创建一个数组和所有这些字符串,然后把它们扔掉.....
  • @DavidHeffernan,添加了一个示例,但没有使用 RTL 拆分为字符串。不确定LastDelimiter 是否在 D7 中。
  • LastDelimiter 出现在 D7 中
【解决方案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;

【讨论】:

    【解决方案3】:

    你可以这样做(如果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;
    

    【讨论】:

    • 执行所有堆分配真的毫无意义。为什么不从字符串的右手端开始并读回直到找到空间。此外,对Pos 的重复调用效率低下且丑陋。
    • 这是一行字符串,大约有 10 次 Pos 调用。我们不是在 1970 年代节省内存和 CPU 周期的每一点。
    • 性能现在和以前一样重要,重复可以说是更大的罪过
    • 我同意性能很重要,但如果它只是一行,那么它不会做任何改变。当然,您可以在一个循环中仅检查一次 pos 并将其保存到变量中。但是我的解决方案和你的解决方案没有太大区别。
    • @jano152 非常感谢您的方法正在运行,但它也捕获了一个关闭此引号的符号 10.8.0.5' 我如何将其删除
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多