Вот код из исходников одного известного компонента. Даже идущего в поставке Delphi 5. Имена и фамилии изменены.
procedure TSomeComponent.PrinterSetup;
var
aDialog : TSomePrintDialog;
[...]
begin
aDialog := TSomePrintDialog.Create(Application);
[...]
with aDialog do
try
[...]
if Execute then
begin
Self.Tag := 0;
end
else Self.Tag := 1;
finally
free;
end
end;
Вот help на компонент:
Tag
Stores an iteger value as part of a component.
property Tag : Integer
Applies to
TSomeComponent
Description
Tag has no predefined meaning. It is provided for the convenience of storing additional integer value or poiner information for special needs in an application. For example, use the Tag property when implementing case statements with a component.
Один классик сказал: «Всё, что мне нравится, либо нелегально, либо аморально, либо ведёт к ожирению.» В программировании все проблемы сводятся либо к легальности, либо к моральности, либо к безопасности.
Вышеприведённый код легален. Он собирается и (если пользователь (прикладной программист) знает о данной особенности) работает. То есть, например, можно написать:
x.PrintSetup;
if 0 = x.Tag then
x.Print;
С остальными пунктами хуже. Во-первых, возвращать результат через Tag, вместо того, чтобы сделать PrinterSetup функцией, возвращающей Boolean, аморально. Во-вторых, аморально не отражать это в документации. В-третьих, не отражать это в документации опасно. Программист, решивший использовать Tag этого компонента в личных целях (как ему разрешено документацией), обречён на долгую отладку и недоумение «б, кто, на, портит, б, мои Tag’и, на?»