Показать сообщение отдельно
  #12  
Старый 06.10.2011, 18:44
Lucky192 Lucky192 вне форума
Прохожий
 
Регистрация: 04.10.2011
Сообщения: 28
Репутация: 1351
По умолчанию

Лучше всего подобную задачу решать через интерфейсы. Вот простой код:
Код:
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).
Ответить с цитированием