Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.03.04;
Скачать: CL | DM;

Вниз

Заполнение формы до её отображения   Найти похожие ветки 

 
jacksotnik   (2011-11-23 16:28) [0]

Всем добрый день.
Вызываю форму так
card.showmodal;
На форме есть эдиты в которые мне надо записать данные до того как форма покажется(чтоб форма открывалась уже заполненная и её можно было редактировать). Знаю решение через глобальные переменные, но как-то неудобно может есть способ попроще


 
Медвежонок Пятачок ©   (2011-11-23 16:35) [1]

через параметры функций


 
jacksotnik   (2011-11-23 16:40) [2]

А можно небольшой примерчик


 
Медвежонок Пятачок ©   (2011-11-23 16:42) [3]

function CreateMyForm(PRec:PSomeRecord) : TModalResult;
begin
with TMyForm.Create(nil) do
 try
  Edit1.Text := PRec^.Edit1;
  ...
  EditN.Text := PRec^.EditN;
  Result := ShowModal;
 finally
  Free;
 end;
end;


 
jacksotnik   (2011-11-23 16:43) [4]

Спасибо


 
И. Павел ©   (2011-11-23 16:46) [5]

Можно организовать глобальную коллекцию ключей и значений и передавать через них данные между формами.
Если верить WPF и Эндрю Троелсену, то это удобно.


 
Anatoly Podgoretsky ©   (2011-11-23 16:51) [6]

> jacksotnik  (23.11.2011 16:28:00)  [0]

card.element := значение
А лучше свойства


 
Dennis I. Komarov ©   (2011-11-23 17:10) [7]

... следующий вопрос будет касательно
function CreateMyForm(PRec:PSomeRecord) : TModalRe


 
Ega23 ©   (2011-11-23 17:11) [8]

свойство формы с сеттером.


 
Медвежонок Пятачок ©   (2011-11-23 17:18) [9]

свойство очень менее удобно.
например если местов вызова формы больше одного.


 
Медвежонок Пятачок ©   (2011-11-23 17:20) [10]

а еще например если результат редактирования в форме надо пропихнуть куда-то дальше.


 
Ega23 ©   (2011-11-23 17:39) [11]


> а еще например если результат редактирования в форме надо
> пропихнуть куда-то дальше.


Тогда не только с сеттером, но ещё и с геттером, делов-то...


 
Ega23 ©   (2011-11-23 17:40) [12]


> а еще например если результат редактирования в форме надо
> пропихнуть куда-то дальше.


Тогда не только с сеттером, но ещё и с геттером, делов-то...


 
Медвежонок Пятачок ©   (2011-11-23 17:42) [13]

наглядно:

пусть форма редактирует пару логин/пароль

PUserRec = ^TUserRec;
TUserRec = record
ur_login,
ur_password : string;
end;

тогда:

//редактируем в форме
if EditLoginData(pRec) then
begin
  //отправляем куда-то
  ChangeLoginDataSomeWhere(pRec);
  //Пишем о чем-то куда-то
  WriteToLogAboutSomething(pRec);
  // еще чего-то там
  DoSomethingElse(pRec);
end;  


лаконично и универсально.
сравни с вариантом когда будут свойства.

Зачем кстати они если код из [3] живет в модуле самой формы?


 
Anatoly Podgoretsky ©   (2011-11-23 17:48) [14]

> Медвежонок Пятачок  (23.11.2011 17:42:13)  [13]

Ты не понимаешь свойств, как раз они более универсальны


 
Медвежонок Пятачок ©   (2011-11-23 17:56) [15]

в данном случае они не нужны.
они нужны там, где надо инкапсулировать нечто не давая доступа к приватным делам.
например чтобы не надо было писать form1.edit1.text

так у меня и не пишется. вся реализация формы скрыта от программиста-пользователя формы.


 
Ega23 ©   (2011-11-23 18:31) [16]


> лаконично и универсально.
> сравни с вариантом когда будут свойства.


Ага, вот только надо на каждый эдит прописывать OnChange
А зачем?


 
Медвежонок Пятачок ©   (2011-11-23 18:37) [17]

Какой такой ончейндж?

...
Result := ShowModal = mrOk;
if Result then
begin
 pRec^.....:= Edit.....
 .....
end;


 
Ega23 ©   (2011-11-23 18:42) [18]


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.


 
Ega23 ©   (2011-11-23 18:43) [19]

И для вызывающего форму знать не надо, что есть какие-то эдиты, фигедиты и прочие комбо-боксы.
Есть контейнер с данными (класс, рекорд - не суть).
Вот мы их туда и передали. И получили обратно. А как оно "унутре" устроено - не наша забота.


 
Ega23 ©   (2011-11-23 18:48) [20]


> Result := ShowModal = mrOk;
> if Result then
> begin
>  pRec^.....:= Edit.....
>  .....
> end;


Ну и нафига оно надо? Писать class-метод, чтобы всё это вызвать...
Не дело это. ИМХО.


 
Медвежонок Пятачок ©   (2011-11-23 18:50) [21]

аха аха.
и после этого либо надо держать форму в памяти чтобы читать ее свойства, либо сохранять её свойства в переменные если они еще нужны.
а они таки нужны.


 
Медвежонок Пятачок ©   (2011-11-23 18:51) [22]

Ну и нафига оно надо? Писать class-метод, чтобы всё это вызвать...

Во первых у меня это простая функция а не класс метод.
Во вторых почему не надо писать класс-метод?
И что за это бывает?


 
Медвежонок Пятачок ©   (2011-11-23 18:53) [23]

кроме того, нет примера аналогичного примеру из [13].
а нет его потому что код там будет лошадиный.


 
Ega23 ©   (2011-11-23 18:54) [24]


> и после этого либо надо держать форму в памяти чтобы читать
> ее свойства


ЗАЧЕМ?????

На код посмотри внимательно.


 
Медвежонок Пятачок ©   (2011-11-23 18:55) [25]

пример аналогичный [13] напиши и увидишь зачем


 
Ega23 ©   (2011-11-23 18:56) [26]


> кроме того, нет примера аналогичного примеру из [13].


У тебя версия delphi какая?
Я просто домой сейчас ухожу, из дома пример подробный накидаю.


 
Ega23 ©   (2011-11-23 18:56) [27]


> пример аналогичный [13] напиши и увидишь зачем


Легко.


 
Медвежонок Пятачок ©   (2011-11-23 18:58) [28]

И для вызывающего форму знать не надо, что есть какие-то эдиты, фигедиты и прочие комбо-боксы.

Ну а у меня вызывающий не только этого знать не должен, он еще и имя класса формы может не знать.

Он вызывает ординал функцию, и понятия ни о чем другом кроме ее и структуры не имеет. Ибо ему это не надо.
Ему надо всего лишь отредактировать пару логин/пароль.


 
Медвежонок Пятачок ©   (2011-11-23 18:59) [29]

У тебя версия delphi какая?

у меня любая есть. кроме первой.


 
Ega23 ©   (2011-11-23 20:12) [30]

Ну, собственно, вся переделка, чтоб как в 13:

procedure TLoginAndPwdForm.btnEditPwdClick(Sender: TObject);
var
 lp: TLoginAndPwd;
begin
 lp := LoginAndPwd;
 with TLoginAndPwdForm.Create(Application) do
   try
     LoginAndPwd := lp;
     ShowModal;
     if ModalResult = mrOk then
     begin
       lp := LoginAndPwd;
       Self.LoginAndPwd := lp;
       //отправляем куда-то
       ChangeLoginDataSomeWhere(lp);
       //Пишем о чем-то куда-то
       WriteToLogAboutSomething(lp);        
     end;
   finally
     Free;
   end;
end;


 
Медвежонок Пятачок ©   (2011-11-23 20:36) [31]

окей.

но все равно еще не то.

1. допустим что в приложении надо вызывать эту форму в трех с половиной местах. у тебя будет повторяться этот код.

2. неоптимальное тройное копирование памяти lp

3. твои свойства скрывают реализацию от тебя самого как от дизайнера формы. Зачем.

у меня лучше.


 
Ega23 ©   (2011-11-23 21:15) [32]


> 1. допустим что в приложении надо вызывать эту форму в трех
> с половиной местах. у тебя будет повторяться этот код.


Если это действительно настолько критично - то сделаю процедуру.


> 2. неоптимальное тройное копирование памяти lp


Если это действительно настолько критично - буду передавать указатель,  заполнение рекорда значениями повешу на кнопку ОК, уберу с неё ModalResult = mrOK и буду его в обработчике ручками выставлять.


> 3. твои свойства скрывают реализацию от тебя самого как
> от дизайнера формы. Зачем.


С чего это они скрывают реализацию? Наоборот, я всё прекрасно вижу. И потом, в том же сеттере я могу сделать проверку на валидность полученных данных (если треба).


> у меня лучше.


Пока не убедил.


 
Медвежонок Пятачок ©   (2011-11-24 08:33) [33]

Ну понятно в общем.
По всем трем пунктам хуже, но "если критично я могу исправить"


 
Ega23 ©   (2011-11-24 09:05) [34]


> Ну понятно в общем.
> По всем трем пунктам хуже, но "если критично я могу исправить"


Да где хуже-то?


 
Медвежонок Пятачок ©   (2011-11-24 10:02) [35]

Да везде.


 
Омлет ©   (2011-11-24 10:05) [36]

> Ega23 ©   (23.11.11 20:12) [30]
> ShowModal;
> if ModalResult = mrOk then


if ShowModal = mrOK then


 
Ega23 ©   (2011-11-24 10:22) [37]


> if ShowModal = mrOK then


Да, я так и делал раньше. Просто забыл уже - давно модальных форм не создавал... :)


 
Anatoly Podgoretsky ©   (2011-11-24 10:23) [38]

> Омлет  (24.11.2011 10:05:36)  [36]

Можно и первый вариант. Это не ошибка. Хотя второй вариант более
предпочтителен.


 
Ega23 ©   (2011-11-24 10:23) [39]


> Да везде.


Это твоё сугубо субъективное мнение.
Можешь спецом голосовалку в потрепаловке открыть. Тогда статистика более-менее репрезентативная будет. Пока что твоё слово против моего. Низачот.


 
Медвежонок Пятачок ©   (2011-11-24 10:28) [40]

Здесь и без голосовалки все видно невооруженным глазом.
Кода наворочено в полтора-два раза больше, менее читаемого и менее поддерживаемого.



Страницы: 1 2 вся ветка

Текущий архив: 2012.03.04;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.011 c
2-1322482246
Scott Storch
2011-11-28 16:10
2012.03.04
проверка на nil


2-1322051301
jacksotnik
2011-11-23 16:28
2012.03.04
Заполнение формы до её отображения


3-1272207079
Crocklam
2010-04-25 18:51
2012.03.04
Транзакции в очередь?


15-1321291140
Омлет
2011-11-14 21:19
2012.03.04
«Начинающим» отпала


2-1322269435
Vyacheslav
2011-11-26 05:03
2012.03.04
Получить результат выполнения команды консоли?