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