Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Непредсказуемый порядок обхода контролов [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, он вообще не интересует..


Наверх

Титульная страница Поиск, карта сайта Написать письмо