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

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

Приведение типов в методах TAction [D6, D7, D2005]


Delphi ©   (2010-09-13 17:00:00) 

Просматривал исходный код экшенов (ActnList.pas), и обнаружил вот такие вариации:

procedure TCustomAction.SetEnabled(Value: Boolean);
var
 I: Integer;
 Link: TActionLink;
begin
   <...>
   for I := 0 to FClients.Count - 1 do
   begin
     Link := TObject(FClients.List[I]) as TActionLink;
     if Assigned(Link) then
       TActionLink(Link).SetEnabled(Value); // Зачем здесь приведение к типу TActionLink, ведь Link - он и есть TActionLink?
   end;
   <...>
end;

procedure TCustomAction.SetGroupIndex(const Value: Integer);
var
 I: Integer;
 Link: TActionLink;
begin
   <...>
   for I := 0 to FClients.Count - 1 do
   begin
     Link := TObject(FClients.List[I]) as TActionLink;
     if Assigned(Link) then
       Link.SetGroupIndex(Value); // А здесь уже нет этого странного приведения
   end;
   <...>
end;

procedure TCustomAction.SetHelpType(Value: THelpType);
var
 I: Integer;
begin
   <...>
   for I := 0 to FClients.Count -1 do
    if TBasicActionLink(FCLients[I]) is TActionLink then // А здесь все просто и изящно, без использования дополнительной переменной Link
      TActionLink(FClients[I]).SetHelpType(Value);
   <...>
end;


Три приведенных метода следуют в исходном коде один за другим, но в них вот такие вариации. Почему?

И стоит отметить еще одну подозрительную, с моей точки зрения, особенность. Список FClients объявлен как TList. Линки добавляются и удаляются в/из него методами  RegisterChanges(Value: TBasicActionLink) и UnRegisterChanges(Value: TBasicActionLink). Видно, что в этом списке регистрируются линки класса TBasicActionLink. А в приведенных выше первых двух примерах кода производится явное безусловное приведение к классу TActionLink, который унаследован от TBasicActionLink. То есть, при таком явном приведении может вывалится Invalit typecast, если в список добавлен конкретно TBasicActionLink. Как это понимать?


Игорь Шевченко   (2010-09-13 21:46:00) [1]


>      Link := TObject(FClients.List[I]) as TActionLink;
>      if Assigned(Link) then
>        TActionLink(Link).SetEnabled(Value); // Зачем здесь
> приведение к типу TActionLink, ведь Link - он и есть TActionLink?
>


В VCL/RTL, особенно последних версий хватает косяков. Увы.


Palladin   (2010-09-13 17:12:00) [2]


> Как это понимать?

уж сколько раз твердили миру... двоешники и чудо-программисты везде есть... и борланд - не исключение....


Наверх

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