消息意外弹出

时间:2017-05-17 22:43:15

标签: lazarus

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

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

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;                 

谢谢!

1 个答案:

答案 0 :(得分:4)

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