Форум: "Начинающим";
Текущий архив: 2010.12.05;
Скачать: [xml.tar.bz2];
ВнизПриведение типов в методах 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.003 c