Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.12.05;
Скачать: CL | DM;

Вниз

Приведение типов в методах TAction   Найти похожие ветки 

 
Delphi   (2010-09-13 17:00) [0]

Просматривал исходный код экшенов (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. Как это понимать?


 
Palladin ©   (2010-09-13 17:12) [1]


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

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


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


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


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



Страницы: 1 вся ветка

Текущий архив: 2010.12.05;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.006 c
15-1282654644
Baks
2010-08-24 16:57
2010.12.05
Как можно передать параметр-строку на кириллице в PHP скрипт?


15-1278047334
12
2010-07-02 09:08
2010.12.05
Совет бы или просто флуд, но приближенный к теме


6-1210699123
San1712
2008-05-13 21:18
2010.12.05
Какие есть функции в Windows Xp для управления раб столом ?


2-1284398519
_Сергей_
2010-09-13 21:21
2010.12.05
Иероглифы а именах файлов


2-1284365809
zmxncbv
2010-09-13 12:16
2010.12.05
Модальные формы