|
|
Регистрация | << Правила форума >> | 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. |