Форум: "Начинающим";
Текущий архив: 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 thenif 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