Com*_*nus 0 delphi mdi for-loop
我在弄清楚这个功能出了什么问题时遇到了一些麻烦.我不确定我是否应该使用-1或者不再使用-1,无论我如何尝试安排代码,它似乎都会返回nil,即使它不应该.有新鲜眼睛的人可以看看吗?另外,我不确定我的结果:= nil是否在适当的位置.
function TFrmMain.FindQueryFrm(Server, Nickname: String): TFrmMessage;
var
I,M: Integer;
begin
/// No -1 in the I loop - why? Because the first childform will not always be
/// of type TFrmMessage, which is what we're looking for.
///
/// Is this approach wrong?
for I := 0 to MDIChildCount do
begin
if Screen.Forms[I] is TFrmMessage then
begin
/// Same concept with -1 here (M Loop)... I need to check all forms
/// stored by QueryManager to see if their .MyServer and .QueryWith's match
///
/// Is the M Loop wrong?
for M := 0 to QueryManager.Count do
begin
if UpperCase((QueryManager[M] as TFrmMessage).MyServer) = UpperCase(Server) then
begin
if UpperCase((QueryManager[M] as TFrmMessage).QueryWith) = UpperCase(NickName) then
begin // BINGO!
Result := (QueryManager[M] as TFrmMessage);
exit;
end;
end; // HOST COMPARE
end; // M Loop
end; // Is TFrmMessage
end; // I Loop
Result := nil; // None Found
end;
Run Code Online (Sandbox Code Playgroud)
如果您对MDI孩子感兴趣,就像您使用表格一样MDIChildCount,那么请使用表格的MDIChildren属性.这两个属性在一起,就像屏幕FormCount和Forms属性是一对.您的代码将表单属性与屏幕属性混合在一起.
begin
for I := 0 to MDIChildCount - 1 do
begin
if MDIChildren[I] is TFrmMessage then
begin
Run Code Online (Sandbox Code Playgroud)
此外,您肯定应该从查询管理器的数量中减去1,否则这意味着您没有正确地跟踪您拥有的查询管理器数量.你在大多数代码中看到的"-1"是因为Delphi"for"循环的上限是包含的.循环变量将从下限开始,循环将继续运行,直到变量超过上限.当列表中没有项目时,它可以帮助您推断基本情况中发生的情况.在那种情况下,循环根本不应该运行,对吧?因为找不到任何东西.设置为从" 0 to 0" 运行的循环将执行一次,因此上限需要为负值以防止循环运行.(这些都在文档中描述.)
至于为什么你的函数返回一个空引用,即使你认为它不应该,我只能假设它是由于你的代码中的其他问题.也许你并没有像你想象的那样循环多少个表单,或者你可能超出查询管理器列表的末尾并得到一些未定义的值.你的Result作业的位置是正确的,虽然你把它放在哪里并不重要,因为它被分配的唯一其他地方就在函数退出之前.
我看到你在About.com上询问了MDI的孩子.在那里,Zarco Gajic通过给你这样的代码回答了你的问题:
for cnt := 0 to -1 + MDIChildCount do
Run Code Online (Sandbox Code Playgroud)
虽然它是有效的代码,但它不是惯用的.我以前从未见过其他人写过这样的代码,所以你明智地不去养习那种习惯.当我们想要一个小于某个东西时,我们不会在该值上添加一个字面上的负数.相反,我们减去积极的一个:
for cnt := 0 to MDIChildCount - 1 do
Run Code Online (Sandbox Code Playgroud)
或者,我有时使用Pred标准函数:
for cnt := 0 to Pred(MDIChildCount) do
Run Code Online (Sandbox Code Playgroud)