Список-свойство Components[] существует во всех потомках TComponent и используется для хранения ссылок на все собственные компоненты. При вызове «mycomponent := TSomeComponent.Create(aComponent)», ссылка на mycomponent помещается в список aComponent Components[]. В большинстве случаев, в методе Create в качестве владельца компонентов определена форма, и ссылки на компоненты помещаются в список Components[] самой формы.
Метод FindComponent (упомянутый где-то еще) только производит поиск компонентов в текущем списке Components[]. Если объект, который вы хотите найти, принадлежит другому компоненту, вы должны просканировать его список компонентов.
В зависимости от того, как вы создаете свою базу и другие компоненты, вы можете осуществить рекурсивный алгоритм поиска, который стартует в верхней части дерева собственника набора компонентов (вероятно, формы), спускаясь вниз и проходя по списку Components[] каждого вновь найденного компонента, пока желаемый объект не будет найден.
Хорошей альтернативой может служить способ, при котором вы всегда определяете базовый компонент в качестве владельца всех других ваших «подкомпонентов» (при их создании). После этого будет работать поиск по свойству вашего базового компонента Components[].
CANVAS.TEXTWIDTH
Delphi 1
Установить размер шрифта для панели можно следующим образом:
With StatusBar1.Panels[1] do begin
Text := Edit1.Text;
Canvas.Font.Size := StatusBar1.Font.Size;
Width := Canvas.TextWidth(Text) + 10;
end;
Создание компонента
Delphi 1
…чтобы сгруппировать свойства наподобие Font, вам необходимо создать наследника (подкласс) TPersistent. Например:
TBoolList = class(TPersistent)
private
FValue1: Boolean;
FValue2: Boolean
published
property Value1: Boolean read FValue1 write FValue1;
property Value2: Boolean read FValue2 write FValue2;
end;
Затем, в вашем новом компоненте, для этого подкласса необходимо создать ivar. Чтобы все работало правильно, вам =необходимо= перекрыть конструктор.
TMyPanel = class(TCustomPanel)
private
FBoolList: TBoolList;
public
constructor Create(AOwner: TComponent); override;
published
property BoolList: TBoolList read FBoolList write FBoolList;
end;
Затем добавьте следующий код в ваш конструктор:
constructor TMyPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FBoolList := TBoolList.Create;
end;
Циклический опрос компонентов
Delphi 1
procedure TForm1.FormCreate(Sender: TObject);
var I : integer;
begin
for I:= 0 to ComponentCount -1 do
if (Components[I] IS TEdit) then
(Components[I] AS TEdit).{Вашпараметр} := {ваше значение};
end;
Если вам необходимо идентифицировать конкретный набор edit-компонентов, поместите их на панели и сделайте примерно так:
procedure TForm1.FormCreate(Sender: TObject);
var I : integer;
begin
with MyPanel do for I:= 0 to ControlCount -1 do
if (Controls[I] IS TEdit) then
(Controls[I] AS TEdit).{Вашпараметр} := {Ваше значение};
end;
В контексте примера, Edit1, Edit2 и т.д. есть то же самое, что и Edit[1], Edit[2]. Если вы хотите иметь доступ к серии элементов управления как к элементам массива, поместите их в TList.
MyArr := TList.Create;
MyArr.Add(Edit1);
MyArr.Add(Edit2);
…
For i := 0 To MyArr.count - 1 Do
(MyArr.items[i] As TEdit).Enabled := False;
MyArr.Free;
procedure TForm1.FormCreate(Sender: TObject);
var I: Integer;
begin
for I := 0 to ComponentCount -1 do
if Components[I] is TEdit then
TEdit(Components[I]).Whatever := 10;
end;
Для получения доступа используйте:
TButton(mylist.items[i]).property := sumpin;
или
TButton(mylist.items[i]).method;