Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.005 c
15-1282728977
Baks
2010-08-25 13:36
2010.12.05
Хостинг Agava.ru vs NTHost.ru


15-1282710435
konelev
2010-08-25 08:27
2010.12.05
Какая у вас такса за ремонт компов?


2-1284533006
Nurjanov
2010-09-15 10:43
2010.12.05
Отчет в Excel по шаблону


15-1282879219
Дмитрий С
2010-08-27 07:20
2010.12.05
Оплата через assist или подобное.


2-1284336951
statistic
2010-09-13 04:15
2010.12.05
Помогите разобраться с XML файлом




   Наверх