![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Заполнение формы до её отображения [D7, 2003]
jacksotnik © (2011-11-23 16:28:00)Всем добрый день.
Вызываю форму так
card.showmodal;
На форме есть эдиты в которые мне надо записать данные до того как форма покажется(чтоб форма открывалась уже заполненная и её можно было редактировать). Знаю решение через глобальные переменные, но как-то неудобно может есть способ попроще
Медвежонок Пятачок (2011-11-23 18:58:00) [41]И для вызывающего форму знать не надо, что есть какие-то эдиты, фигедиты и прочие комбо-боксы.
Ну а у меня вызывающий не только этогознать не должен, он еще и имя класса формыможет не знать.
Он вызывает ординал функцию, и понятия ни о чем другом кроме ее и структуры не имеет. Ибо ему это не надо.
Ему надо всего лишь отредактировать пару логин/пароль.
Ega23 (2011-11-23 18:56:00) [42]
> пример аналогичный [13] напиши и увидишь зачем
Легко.
Ega23 (2011-11-23 18:56:00) [43]
> кроме того, нет примера аналогичного примеру из [13].
У тебя версия delphi какая?
Я просто домой сейчас ухожу, из дома пример подробный накидаю.
Медвежонок Пятачок (2011-11-23 18:55:00) [44]пример аналогичный [13] напиши и увидишь зачем
Ega23 (2011-11-23 18:54:00) [45]
> и после этого либо надо держать форму в памяти чтобы читать
> ее свойства
ЗАЧЕМ?????
На код посмотри внимательно.
Медвежонок Пятачок (2011-11-23 18:53:00) [46]кроме того, нет примера аналогичного примеру из [13].
а нет его потому что код там будет лошадиный.
Медвежонок Пятачок (2011-11-23 18:51:00) [47]Ну и нафига оно надо? Писать class-метод, чтобы всё это вызвать...
Во первых у меня это простая функция а не класс метод.
Во вторых почему не надо писать класс-метод?
И что за это бывает?
Медвежонок Пятачок (2011-11-23 18:50:00) [48]аха аха.
и после этого либо надо держать форму в памяти чтобы читать ее свойства, либо сохранять её свойства в переменные если они еще нужны.
а они таки нужны.
Ega23 (2011-11-23 18:48:00) [49]
> Result := ShowModal = mrOk;
> if Result then
> begin
> pRec^.....:= Edit.....
> .....
> end;
Ну и нафига оно надо? Писать class-метод, чтобы всё это вызвать...
Не дело это. ИМХО.
Ega23 (2011-11-23 18:43:00) [50]И для вызывающего форму знать не надо, что есть какие-то эдиты, фигедиты и прочие комбо-боксы.
Есть контейнер с данными (класс, рекорд - не суть).
Вот мы их туда и передали. И получили обратно. А как оно "унутре" устроено - не наша забота.
Ega23 (2011-11-23 18:42:00) [51]
unit uMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TLoginAndPwd = record
Login: string;
Pwd: string;
end;
TLoginAndPwdForm = class(TForm)
eLogin: TEdit;
ePwd: TEdit;
Label1: TLabel;
Label2: TLabel;
btnEditPwd: TButton;
btnOK: TButton; // <- На кнопку вешаем ModalResult = mrOK
procedure btnEditPwdClick(Sender: TObject);
private
function GetLoginAndPwd: TLoginAndPwd;
procedure SetLoginAndPwd(const Value: TLoginAndPwd);
public
property LoginAndPwd: TLoginAndPwd read GetLoginAndPwd write SetLoginAndPwd;
end;
var
LoginAndPwdForm: TLoginAndPwdForm;
implementation
{$R *.dfm}
{ TLoginAndPwdForm }
procedure TLoginAndPwdForm.btnEditPwdClick(Sender: TObject);
var
frm: TLoginAndPwdForm;
begin
frm := TLoginAndPwdForm.Create(Application);
try
frm.LoginAndPwd := LoginAndPwd;
frm.ShowModal;
if frm.ModalResult = mrOk then
LoginAndPwd := frm.LoginAndPwd;
finally
frm.Free;
end;
end;
function TLoginAndPwdForm.GetLoginAndPwd: TLoginAndPwd;
begin
Result.Login := eLogin.Text;
Result.Pwd := ePwd.Text;
end;
procedure TLoginAndPwdForm.SetLoginAndPwd(const Value: TLoginAndPwd);
begin
eLogin.Text := Value.Login;
ePwd.Text := Value.Pwd;
end;
end.
Медвежонок Пятачок (2011-11-23 18:37:00) [52]Какой такой ончейндж?
...
Result := ShowModal = mrOk;
if Result then
begin
pRec^.....:= Edit.....
.....
end;
Ega23 (2011-11-23 18:31:00) [53]
> лаконично и универсально.
> сравни с вариантом когда будут свойства.
Ага, вот только надо на каждый эдит прописывать OnChange
А зачем?
Медвежонок Пятачок (2011-11-23 17:56:00) [54]в данном случае они не нужны.
они нужны там, где надо инкапсулировать нечто не давая доступа к приватным делам.
например чтобы не надо было писать form1.edit1.text
так у меня и не пишется. вся реализация формы скрыта от программиста-пользователя формы.
Anatoly Podgoretsky (2011-11-23 17:48:00) [55]> Медвежонок Пятачок (23.11.2011 17:42:13) [13]
Ты не понимаешь свойств, как раз они более универсальны
Медвежонок Пятачок (2011-11-23 17:42:00) [56]наглядно:
пусть форма редактирует пару логин/пароль
PUserRec = ^TUserRec;
TUserRec = record
ur_login,
ur_password : string;
end;
тогда:
//редактируем в форме
if EditLoginData(pRec) then
begin
//отправляем куда-то
ChangeLoginDataSomeWhere(pRec);
//Пишем о чем-то куда-то
WriteToLogAboutSomething(pRec);
// еще чего-то там
DoSomethingElse(pRec);
end;
лаконично и универсально.
сравни с вариантом когда будут свойства.
Зачем кстати они если код из [3] живет в модуле самой формы?
Ega23 (2011-11-23 17:40:00) [57]
> а еще например если результат редактирования в форме надо
> пропихнуть куда-то дальше.
Тогда не только с сеттером, но ещё и с геттером, делов-то...
Ega23 (2011-11-23 17:39:00) [58]
> а еще например если результат редактирования в форме надо
> пропихнуть куда-то дальше.
Тогда не только с сеттером, но ещё и с геттером, делов-то...
Медвежонок Пятачок (2011-11-23 17:20:00) [59]а еще например если результат редактирования в форме надо пропихнуть куда-то дальше.
Медвежонок Пятачок (2011-11-23 17:18:00) [60]свойство очень менее удобно.
например если местов вызова формы больше одного.