![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непредсказуемый порядок обхода контролов [D6, WinXP]
Циркуль © (2009-11-26 11:43:00)Есть вот такая функция для рекурсивного обхода контролов
function FindControl(AParentControl: TWinControl; AConditionFunc: TFindControlConditionFunc): TControl;
var
I: Integer;
Control: TControl;
begin
Result := nil;
if Assigned(AConditionFunc) then
begin
for I := 0 to AParentControl.ControlCount - 1 do
begin
Control := AParentControl.Controls[I];
if AConditionFunc(Control) then
Result := Control
else
if Control is TWinControl then
Result := FindControl(TWinControl(Control), AConditionFunc);
if Assigned(Result) then
Break;
end;
end;
end;
TFindControlConditionFunc = function(AControl: TControl): Boolean of object;
На одной из форм она вызывается вот так
...
FindControl(Self, SetupNestedFrame);
...
TForm1.SetupNestedFrame(AControl: TControl): Boolean;
begin
Result := False;
if (AControl is TSomeFrame) then
TSomeFrame(AControl).SomeAction.
end;
Так вот... На форме, где-то на панельках лежит 2 фрейма.
Сначала вызывается SomeAction для Frame1, потом для Frame2.
Но в экзешнике, скомпиленом на одном из компов порядок получается обратный, т.е. сначала FindControl находит Frame2 а затем Frame1. pas и dfm в обоих случаях идентичные, CreationOrder у формы правильный (сначала создается Frame1 потом Frame2), настройки компиляции проекта одинаковые. В дебагере цикл внутри FindControl бегает как положено, с нуля.
Ухарь (2009-12-01 19:19:00) [1]можно попробовать сравнить после этого сорсы на двух компьютерах
Циркуль (2009-11-29 18:49:00) [2]
> Ухарь (29.11.09 13:04) [7]
открывается в IDE и билдится
Ухарь (2009-11-29 13:04:00) [3]а каким образом происходит компиляция на другом компьютере?
Проект открывается в IDE и билдится, или же командной строкой?
Сергей М. (2009-11-27 16:48:00) [4]
> Циркуль (27.11.09 13:37) [4]
Ну смотри сама, кума, - тебежить)
han_malign (2009-11-27 16:28:00) [5]ZOrder/TabOrder
Циркуль (2009-11-27 13:37:00) [6]
> Логика, не выдерживающая никакой критики.
Заявление, не выдерживающее никакой критики :)
Сергей М. (2009-11-26 21:30:00) [7]
> на данной конкретной форме Frame2 при загрузке (SomeAction)
> использует данные Frame1
Логика, не выдерживающая никакой критики.
Циркуль (2009-11-26 16:27:00) [8]В общем случае - не интересует, но на данной конкретной форме Frame2 при загрузке (SomeAction) использует данные Frame1, который получает их во время своего SomeAction.
Саму проблему "рассогласования" фреймов я решил, дело не в этом. Мне просто интересно, какая может быть причина того, что при компиляции на одном из компов Frame2 находится на форме первее, чем Frame1, а при компиляции на других компах - первым находится Frame1 (в соответствии с CreationOrder формы), при условии идентичности исходников и настроек компиляции. ОС и версия Delphi тоже одинаковая на компах.
Понимаю, что не имея возможности воспроизвести ситуацию у себя под отладчиком, трудно мне ответить что-нить вразумительное, но мало ли... может кто уже натыкался на подобное и сможет развеять мою веру в чудеса :)
Сергей М. (2009-11-26 16:01:00) [9]А какая разница, каков фактический порядок обхода ?
Тебя же, судя по логике в SetupNestedFrame, он вообще не интересует..