Лучше всего подобную задачу решать через интерфейсы. Вот простой код:
Код:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
IFormGroup1 = interface
// Следующая строчка нужна, если использовать QueryInterface, генерируется: Ctrl+Shift+G
['{A0653A06-F38E-49F8-AA1B-5E53344A455F}']
procedure DoProc1(s:string);
procedure DoProc2(i:integer);
function GetFormCaption:string;
procedure SetFormCaption(s:string);
property FormCaption:string read GetFormCaption write SetFormCaption;
end;
TForm1 = class(TForm, IFormGroup1)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
public
procedure DoProc1(s:string);
procedure DoProc2(i:integer);
function GetFormCaption:string;
procedure SetFormCaption(s:string);
end;
var Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.DoProc1(s: string);
begin
Caption := s;
end;
procedure TForm1.DoProc2(i: integer);
begin
Caption := Caption + IntToStr(i);
end;
procedure TForm1.Button1Click(Sender: TObject);
var x:IFormGroup1;
begin
// Вот три способа:
x := Form1; // Самый простой, но не везде работает
x := TForm(Form1); // например здесь - ошибка компиляции, т.к. у TForm нет интерфейса IFormGroup1
IInterface(TForm(Form1)).QueryInterface(IFormGroup1,x); // этот работает всегда
if assigned(x) then begin
x.DoProc1('lalala');
x.DoProc2(345);
x.FormCaption := '!!!'+x.FormCaption;
end;
end;
function TForm1.GetFormCaption: string;
begin
Result := Caption;
end;
procedure TForm1.SetFormCaption(s: string);
begin
Caption := s;
end;
end.
Другой вариант - через поиск компонентов, но тогда, если нужно обрабатывать отдельные компоненты а не классы, им нужно давать осмысленные имена или как-то по другому выделять их (например используя Tag). Если компонент будете искать не по имени, нужно вручную перебирать все компоненты формы и анализировать их свойства (через свойства формы Controls или Components).