消息意外弹出

Message pops up unexpectedly

我有以下功能,它应该检查一个很长的 DNA 序列中的每个字母,一个长约 2.5 亿个字符的字符串,并将字母更改为另一个特定字母。只有五个可能的字母(A、C、G 和 T,需要分别更改为 T、G、C 和 A)。还有一个可能的字母 N(代表 "unknown")。这需要保留为N。最后需要将字符串反转。所以如果原始字符串是AACGTA,转换后的字符串需要是TACGTT。

问题是,由于函数是 运行,我不断收到只有一个 "OK" 按钮的弹出消息(参见 pop-up message)。我不知道为什么会收到此弹出消息。这意味着每次它弹出时我都需要单击确定按钮,这是不可行的,尤其是考虑到字符串的长度。这是代码:

function TForm1.FindReverseComplement(const Motif: ansistring; Len: integer): ansistring;
var
  I, J: integer;
  Rev_Str: ansistring;
  Chr, Rev_Chr: char;
begin
  Rev_Str := '';
  for I := 1 to Len do
  begin
    Chr := Motif[I];
    Rev_Chr := #0; //null character
    if (Chr = 'A') or (Chr = 'a')  then Rev_Chr := 'T'
    else if (Chr = 'C') or (Chr = 'c') then Rev_Chr := 'G'
    else if (Chr = 'G') or (Chr = 'g') then Rev_Chr := 'C'
    else if (Chr = 'T') or (Chr = 't')  then Rev_Chr := 'A'
    else if (Chr = 'N') or (Chr = 'n')  then Rev_Chr := 'N'
    else ShowMessage('Unknown base in ' + Motif + '!');

    Rev_Str := Rev_Str + Rev_Chr;
  end;
  Result := ansireversestring(Rev_Str);
end;                 

谢谢!

如果 Motif 字符串中有未知碱基,那么您会希望出现消息对话框。这可能不是您希望在 for 循环中发生的情况。此外,ShowMessage 并不打算显示很长的字符串(想象一下,如果它显示一个约 2.5 亿个字符的字符串,它会有多大)。看起来您传递给 ShowMessage 的 Motif 字符串太长而无法显示,因此消息对话框中没有文本,只有一个 OK 按钮。如果您真的想在 for 循环内调用 ShowMessage,请尝试将 Motif[I] 传递给 ShowMessage。您还可以传入 IntToStr(I),这样您就会知道违规字符在 Motif 字符串中的哪个位置。