Главная страница
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.013 c
15-1282710435
konelev
2010-08-25 08:27
2010.12.05
Какая у вас такса за ремонт компов?


2-1284440308
Hadroran
2010-09-14 08:58
2010.12.05
Показ записей по необходимости


2-1284382713
Eh
2010-09-13 16:58
2010.12.05
Параметры в TfrxFIBQuery


15-1282732731
Kerk
2010-08-25 14:38
2010.12.05
Макрос, Excel и интернет


15-1282908527
dr_creigan
2010-08-27 15:28
2010.12.05
Bluetooth в Ubuntu 10.04