Форум: "Основная";
Текущий архив: 2011.07.17;
Скачать: [xml.tar.bz2];
ВнизНепредсказуемый порядок обхода контролов Найти похожие ветки
← →
Циркуль (2009-11-26 11:43) [0]Есть вот такая функция для рекурсивного обхода контролов
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-11-26 16:01) [1]А какая разница, каков фактический порядок обхода ?
Тебя же, судя по логике в SetupNestedFrame, он вообще не интересует..
← →
Циркуль (2009-11-26 16:27) [2]В общем случае - не интересует, но на данной конкретной форме Frame2 при загрузке (SomeAction) использует данные Frame1, который получает их во время своего SomeAction.
Саму проблему "рассогласования" фреймов я решил, дело не в этом. Мне просто интересно, какая может быть причина того, что при компиляции на одном из компов Frame2 находится на форме первее, чем Frame1, а при компиляции на других компах - первым находится Frame1 (в соответствии с CreationOrder формы), при условии идентичности исходников и настроек компиляции. ОС и версия Delphi тоже одинаковая на компах.
Понимаю, что не имея возможности воспроизвести ситуацию у себя под отладчиком, трудно мне ответить что-нить вразумительное, но мало ли... может кто уже натыкался на подобное и сможет развеять мою веру в чудеса :)
← →
Сергей М. © (2009-11-26 21:30) [3]
> на данной конкретной форме Frame2 при загрузке (SomeAction)
> использует данные Frame1
Логика, не выдерживающая никакой критики.
← →
Циркуль (2009-11-27 13:37) [4]
> Логика, не выдерживающая никакой критики.
Заявление, не выдерживающее никакой критики :)
← →
han_malign (2009-11-27 16:28) [5]ZOrder/TabOrder
← →
Сергей М. © (2009-11-27 16:48) [6]
> Циркуль (27.11.09 13:37) [4]
Ну смотри сама, кума, - тебе жить)
← →
Ухарь (2009-11-29 13:04) [7]а каким образом происходит компиляция на другом компьютере?
Проект открывается в IDE и билдится, или же командной строкой?
← →
Циркуль (2009-11-29 18:49) [8]
> Ухарь (29.11.09 13:04) [7]
открывается в IDE и билдится
← →
Ухарь (2009-12-01 19:19) [9]можно попробовать сравнить после этого сорсы на двух компьютерах
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2011.07.17;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c