![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте! Не подскажите как можно передать в процедуру ссылку на форму, чтобы в этой процедуре было возможно обращаться к компонентам этой формы? Т.е сделать так чтобы в процедуру не передавать ссылки не на компоненты, а только на форму. А уже в самой процедуре выяснять есть ли на той форме, ссылка на которую передана, нужный нам компонент и производить с ним какие либо действия.
Например форм у нас 100 шт., и на каждой есть Button1 и Label1. Как на клике этих Button1 вызвать процедуру TForm1.MyProc передав этой процедуре указание о том какая форма эту процедуру вызывает? procedure TForm1.MyProc(ссылка_на_форму); begin ссылка_на_форму.Label1.Caption := 'aaa'; end; |
|
#2
|
||||
|
||||
|
Код:
procedure someproc (form:TForm) |
|
#3
|
|||
|
|||
|
Неа, не так. Компилятор не даст в процедуре обратиться к Label1 формы, потому что у TForm нет компонента Label1. А он есть только у TForm1.
А нужно передавать ведь не только TForm1, а еще 50 других различных форм. |
|
#4
|
|||
|
|||
|
PHP код:
Цитата:
Последний раз редактировалось Pyro, 18.09.2011 в 11:33. |
|
#5
|
||||
|
||||
|
приведение типов:
Код:
(form as TForm1).Label1.Caption := 'some text' |
|
#6
|
|||
|
|||
|
Нет, так не поучится, потому что тип неизвестен.
(form as TForm1).Label1.Caption := 'some text' т.е в этой строке неизвестно что ставить TForm1 или TForm2088. Хочется передавать в процедуру ссылки на разные формы и у них разные компоненты. Это нужно потому что в программе есть много разных похожих форм, у на обработчиках событий компонентов этих форм одинаковый код. И такого одинакового кода 90%. Поэтому хотелось бы вынести этот код в отдельные процедуры и в эти процедуры передавать только ссылку на форму, к какой он относится. |
|
#7
|
|||
|
|||
|
http://ru.wikipedia.org/wiki/Объектн...82.D0.B8.D1.8F
конкретно - наследование |
|
#8
|
||||
|
||||
|
у меня все получилось:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMyForm = class(TForm)
public
function GetLabel: TLabel; virtual; abstract;
end;
TForm1 = class(TMyForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function GetLabel: TLabel; override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TheLost(MyForm: TMyForm);
begin
MyForm.GetLabel.Caption:='TheLost';
end;
function TForm1.GetLabel: TLabel;
begin
Result:=Label1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
TheLost(Self);
end;
end. |
|
#9
|
|||
|
|||
|
NumLock спасибо! Также на Королевстве Дельфи подсказали:
Код:
procedure TForm1.MyProc(F: TForm);
begin
TLabel(F.FindComponent('Label1')).Caption := 'aaa';
end; |
|
#10
|
||||
|
||||
|
Цитата:
Цитата:
![]() |
|
#11
|
|||
|
|||
|
А разве нельзя было просто подключить модуль первой формы ко второй?
Код:
implementation uses frm2_Unit; Если такой метод не правелен скажите почему, просто я часто к этому пербегаю. |
|
#12
|
|||
|
|||
|
Лучше всего подобную задачу решать через интерфейсы. Вот простой код:
Код:
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.Последний раз редактировалось Lucky192, 06.10.2011 в 19:21. |