Представь себе такую ситуацию: у тебя есть TabSheet... Или нет. Не так. У тебя есть GroupBox. А на нем, понятное дело, расположены какие-то контролы. И еще несколько GroupBox'ов, так же набитых контролами по самое нехочу. И вот ты в один прекрасный момент в коде пишешь нечто вроде GroupBox1.Enabled := False; и с ужасом обнаруживаешь, что все контролы, лежащие на групбоксе1, задизабленными не выглядят! Как быть?
Разумеется, есть проверенный временем метод: при каждом случае установки доступности групбокса пробежаться в цикле по всем вложенным контролам и поставить им соответствующее значение Enabled. Но мы-то помним, что у нас на форме лежит 27 групбоксов. Писать такую тягомотину для каждого из них - крайне лениво. Поэтому мы пойдем другим путем.
В самом начале кода юнита пишем что-то вроде такого (обрати внимание на выделенное красным):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type TGroupBox = class(StdCtrls.TGroupBox)
private
FEnabled: Boolean;
procedure SetEnabled(const Value: Boolean);
published
property Enabled: Boolean read FEnabled write SetEnabled;
end;
Затем - пишем имплементейшн:
procedure TGroupBox.SetEnabled(const Value: Boolean);
var X: Integer;
begin
FEnabled := Value;
for X := 0 to Self.ControlCount - 1 do
Self.Controls[X].Enabled := FEnabled;
// При желании - доточишь напильником и прикрутишь рекурсию
end;
И теперь все групбоксы на форме при установке им в рунтайме свойства Enabled будут выставлять его и всем вложенным контролам. Весьма удобно. Рекомендую.
Hint. А еще таким образом можно и своих свойств/методов накрутить.













