Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.03.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.004 c
15-1321301277
alexdn
2011-11-15 00:07
2012.03.04
делфи и мак ос


2-1322215244
Aleks
2011-11-25 14:00
2012.03.04
Как определить событие OnClik в динамически созданном объекте Bu


2-1322424843
Vyacheslav
2011-11-28 00:14
2012.03.04
Использованние TMemo не для визуального компонента


1-1287596219
MAcKZloy
2010-10-20 21:36
2012.03.04
XmlDocument и теги


15-1321426745
depper
2011-11-16 10:59
2012.03.04
ZEOSLib for PostgreSQL 9.1.1





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский