![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приведение типов в методах 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]
> Как это понимать?
уж сколько раз твердили миру... двоешники и чудо-программисты везде есть... и борланд - не исключение....