Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача параметров в форму / 25 сообщений из 41, страница 1 из 2
21.01.2022, 15:20
    #40128450
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
Есть несколько подходов передачи параметров в форму:
1. сделать свой конструктор
2. Создать экземпляр формы и добавить параметры вручную
Код: pascal
1.
2.
3.
4.
 form:= TForm.Create(nil);
   form.a:= 1;
   form.b:= 2;
   form.ShowModal; (Show)


3. На событие OnActivate

Какой подход используете?
...
Рейтинг: 0 / 0
21.01.2022, 15:35
    #40128460
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
Третий точно не надо использовать. Первые два отличаются чисто косметически, их
применение - вкусовщина.

PS: Хотя применение конструктора позволит не забыть передать важный параметр.
...
Рейтинг: 0 / 0
21.01.2022, 15:37
    #40128463
Michael Longneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
Если параметров много - свой конструктор, в который передаётся record TMyKolkhozFormParams
...
Рейтинг: 0 / 0
21.01.2022, 15:38
    #40128464
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
4. создание/показ/удаление формы оборачивается в функцию, куда и запихиваются параметы
...
Рейтинг: 0 / 0
21.01.2022, 15:45
    #40128470
Michael Longneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
Даже можно чтобы функция создавала специальный объект ленивой инициализации, и от него в вызывающий код выдавала только интерфейс.
...
Рейтинг: 0 / 0
21.01.2022, 16:17
    #40128489
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
В форме объявляю булевский публичный метод Execute, который заполняет переданные данные, вызывает ShowModal и, если закрыли по OK, возвращает введенные данные
...
Рейтинг: 0 / 0
21.01.2022, 16:27
    #40128496
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
cptngrb,

5. TObject или record в отдельном модуле, что бы не было циклических ссылок
...
Рейтинг: 0 / 0
21.01.2022, 16:28
    #40128498
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
cptngrb
Есть несколько подходов передачи параметров в форму:
1. сделать свой конструктор
2. Создать экземпляр формы и добавить параметры вручную
Код: pascal
1.
2.
3.
4.
 form:= TForm.Create(nil);
   form.a:= 1;
   form.b:= 2;
   form.ShowModal; (Show)



3. На событие OnActivate

Какой подход используете?

4. Создать объект параметров и ссылку на объект присвоить свойству Tag формы.
5. Послать окну формы сообщение, в сообщении будет ссылка на параметры (или сами параметры).
6. Назначить метод формы обработчиком исключений и выбросить объект исключения с параметрами.
7. Создать объект окна с заданным именем, в данных окна - параметры; пусть форма сама ищет ищет нужное окно и читает параметры.
8. Записать значения параметров в файл на диске.
9. В форме создать приемник - мэилслот/tcp сокет/..., отправлять форме параметры в виде потока данных.
10. Разместить константные параметры в ресурсах на этапе компиляции, пусть форма читает.
11. Наследовать все формы в т.ч. от интерфейсов SetParameter(имя, значение : тип), пусть форма реализует нужные интерфейсы...
... :)
...
Рейтинг: 0 / 0
21.01.2022, 16:30
    #40128500
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
var
  FrmSKL_POS_Edit: TFrmSKL_POS_Edit;

  function SKL_POS_Edit  (id: integer): boolean; // Редактирование места хранения

implementation

function SKL_POS_Edit(id: integer): boolean; // Редактирование места хранения
begin
  with TFrmSKL_POS_Edit.Create(Application) do begin
    Fid     := id;
    Fmode   := 1; // режим открытия окна 0 - просмотр; 1 - изменение существующего; 2 - создание
    Caption :=  format('Адрес хранения [%.0n]', [ Fid *1.0 ]);
    //
    PageControl.ActivePageIndex := 0;
    ActiveControl := Edit_POSIT;
    F5;
    Edit_EAN13.Enabled := True;
    Edit_NDOK.Enabled  := True;
    //
    Result := ShowModal = mrOk;
    //
    Free;
  end;//with
end;



Процедура F5 заполняет контролы формы данными, на основании режима (Fmode) и переданных параметров.

По канонам, это бы еще завернуть в try-finally, но у меня это неактуально т.к. после исключения приложение обычно закрывают.

Для одной формы может быть несколько процедур/функции для создания-вызова, с разным количеством параметров.
...
Рейтинг: 0 / 0
21.01.2022, 16:35
    #40128505
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
По моей методе, форма существует только в момент когда отображается на экране, потом разрушается.
Это позволяет вообще не думать - занята эта форма или нет, позволяет вызывать ее вложенно неограниченное количество раз.

На практике это тормозов не вызывает, кроме одного замеченного мной случая - если форме есть Memo в котором в дизайн-тайме накидано много текста. Типа справка. Это заметно подтормаживает, особенно если замерить время создания.

Delphi7. Возможно на других версиях так не проявляется.
...
Рейтинг: 0 / 0
21.01.2022, 17:02
    #40128525
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
ъъъъъ, сильно.
...
Рейтинг: 0 / 0
21.01.2022, 17:07
    #40128529
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
DimaBr
4. создание/показ/удаление формы оборачивается в функцию, куда и запихиваются параметы


если форма нужна для редактирования записи бд, то обычно проверяю результат ShowModal и если mrYes - то пишу в базу

ъъъъъ
создавать объекты и цеплять на Tag? Часто нужно ображаться к компонентам формы и выдергивать из них данные, например

Код: pascal
1.
2.
3.
4.
5.
6.
if Form.ShowModal = mrYes  then
begin
  ...
  field1.value:= Form.Edit1.text;
  ...
end;



Разве так не лучше читается?
...
Рейтинг: 0 / 0
21.01.2022, 17:19
    #40128533
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
cptngrb

если форма нужна для редактирования записи бд, то обычно проверяю результат ShowModal и если mrYes - то пишу в базу

Я обычно делаю наоборот.
В функции сохранения данных в базу, если все получилось, делаю ModalResult := mrOk; что бы форма закрылась.
В противном случае можно получить ситуацию что форму закрыли а сохранение по какой-либо причине не произошло.
...
Рейтинг: 0 / 0
21.01.2022, 17:57
    #40128553
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
Dimitry Sibiryakov
Первые два отличаются чисто косметически, их применение - вкусовщина.

Не соглашусь. Когда разработчики начинают злоупотреблять конструкторами - получается каша, в которой тяжело внедрять правильное наследование форм и другие хорошие универсальные решения. А раз их сложно внедрять - разработчик начинает находить обходные ноу-хау, и в итоге получается изрядно попахивающая конструкция.
...
Рейтинг: 0 / 0
21.01.2022, 21:37
    #40128606
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
_Vasilisk_
В форме объявляю булевский публичный метод Execute, который заполняет переданные данные, вызывает ShowModal и, если закрыли по OK, возвращает введенные данные
+1
...
Рейтинг: 0 / 0
22.01.2022, 02:55
    #40128637
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
cptngrb
Разве так не лучше читается?

Так в первую очередь криво работает. Если с переданными значениями что-то не так (не проходят проверку целостности, например), что делать - заново открывать форму и тащить их обратно?

Во вторую очередь, здесь делается тупая и ненужная лишняя работа.

В третью очередь, этот код намертво сцеплен с конкретикой. Он не годится ни на что кроме решения одной очень узкой задачи в одном очень конкретном месте. Если потребуется решить похожую задачу - его разработчик сделает Ctrl-C Ctrl-V и чуть доработает напильником. В результате, например, если в приложении на 100 форм дозреют до исправления "в первую очередь" - разработчик побежит полностью переписывать сто мест (а то и двести, и триста).
...
Рейтинг: 0 / 0
22.01.2022, 10:13
    #40128653
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
bk0010
_Vasilisk_
В форме объявляю булевский публичный метод Execute, который заполняет переданные данные, вызывает ShowModal и, если закрыли по OK, возвращает введенные данные
+1


+1
...
Рейтинг: 0 / 0
22.01.2022, 10:41
    #40128654
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
cptngrb
Есть несколько подходов передачи параметров в форму:

Какой подход используете?
Вопрос плохо сформулирован и поэтому все отвечают разное.
Если параметров мало и форма простенькая (как по сложности,
так и по предназначению/функции) - вариант Димы/Василиска.

Если форма более монструозная и параметров/действий много -
лично я делал отдельный метод Init (не конструктор!), который
вызывался после создания и до Show[Modal]. Нечто похожее
привёл fraks со своей F5 (странное название для внешнего метода),
но у него наружу торчит колхоз с контролами - так делать нельзя
(ну, если проект серьёзный/поддерживаемый).
...
Рейтинг: 0 / 0
22.01.2022, 10:44
    #40128655
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
fraks
cptngrb

если форма нужна для редактирования записи бд, то обычно проверяю результат ShowModal и если mrYes - то пишу в базу
Я обычно делаю наоборот.
В функции сохранения данных в базу, если все получилось,
делаю ModalResult := mrOk; что бы форма закрылась.
В противном случае можно получить ситуацию что форму
закрыли а сохранение по какой-либо причине не произошло.

Звучит подозрительно криво... Когда срабатывает (вызывается)
"функция сохранения данных" - не по нажатию пользователем
кнопучки OK / Yes / Save?
...
Рейтинг: 0 / 0
22.01.2022, 18:47
    #40128699
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
Гаджимурадов Рустам
Если форма более монструозная и параметров/действий много -
лично я делал отдельный метод Init (не конструктор!), который
вызывался после создания и до Show[Modal]. Нечто похожее
привёл fraks со своей F5 (странное название для внешнего метода),
но у него наружу торчит колхоз с контролами - так делать нельзя
(ну, если проект серьёзный/поддерживаемый).


Не понял что такое внешний метод.
это метод формы в private разделе.

F5 он называется потому что обычно (но не всегда) на форме есть грид, данные в котором обновляются или заполняются первоначально по кнопке <F5> а кнопка эта выбрана потому что в винде, в браузерах, по <F5> идет обновление страницы или чего там есть.

Наружу и формы ничего не торчит т.к. эта функция, в которой создается и вызывается форма - она в модуле формы и есть.
Управление некоторыми контролами тут сделано в соответствии с Fmode которое определяет для какой функции создана форма.

Внутри procedure F5 видимость контролов не меняется, там только данные заполняются.

Может быть можно сделать и постройнее, но я единственный разработчик, с этим кодом работаю только я :)
И ни в каких иных командах никогда не работал. Так что колхоз и велосипеды - моё всё :)
...
Рейтинг: 0 / 0
22.01.2022, 18:51
    #40128700
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
Гаджимурадов Рустам
fraks
пропущено...
Я обычно делаю наоборот.
В функции сохранения данных в базу, если все получилось,
делаю ModalResult := mrOk; что бы форма закрылась.
В противном случае можно получить ситуацию что форму
закрыли а сохранение по какой-либо причине не произошло.

Звучит подозрительно криво... Когда срабатывает (вызывается)
"функция сохранения данных" - не по нажатию пользователем
кнопучки OK / Yes / Save?

Функция сохранения может вызываться и по кнопочке Ok и по пунту в контекстному меню "Сохранить" <Ctrl+S> или <Enter> или <Ctrl+Enter> - все они имеют ModalResult := mrNone. В обработчике вызывается функция сохранения, и в конце этой функции пишется ModalResult := mrOk; после чего форма закрывается.

Делается так для того что бы если в функции сохранения вылетело исключение - то можно было бы как минимум посмотреть чего за данные мы там назаполняли.
...
Рейтинг: 0 / 0
22.01.2022, 18:55
    #40128703
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
И форм в autocreate у меня только 9 штук, включая главную форму и датамодули.
Остальные 255 форм создаются только вот таким методом - через функцию.
Соответственно обращаться к ним через переменную невозможно, этой переменной нет.
Вот эта вот
var
FrmSKL_POS_Edit: TFrmSKL_POS_Edit;
создается дельфями, но не используется т.к. нету autocreate.
...
Рейтинг: 0 / 0
22.01.2022, 21:00
    #40128712
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
Гаджимурадов Рустам
Звучит подозрительно криво...

Не сказал бы. По мне - совершенно правильная схема. Ну разве что "сохранить" в контекстном меню - это оригинальная дизайнерская идея, а если в результате нажатия туда ещё и закрывается окно - тем более.
fraks
Функция сохранения может вызываться и по кнопочке Ok и по пунту в контекстному меню "Сохранить" <Ctrl+S> или <Enter> или <Ctrl+Enter> - все они имеют ModalResult := mrNone. В обработчике вызывается функция сохранения, и в конце этой функции пишется ModalResult := mrOk; после чего форма закрывается.
...
Рейтинг: 0 / 0
22.01.2022, 22:56
    #40128731
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
Гаджимурадов Рустам
Если форма более монструозная и параметров/действий много - лично я делал отдельный метод Init (не конструктор!), который вызывался после создания и до Show[Modal].
Так никто не мешает все параметры упаковать в два record
...
Рейтинг: 0 / 0
22.01.2022, 22:59
    #40128732
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в форму
_Vasilisk_
Гаджимурадов Рустам
Если форма более монструозная и параметров/действий много - лично я делал отдельный метод Init (не конструктор!), который вызывался после создания и до Show[Modal].
Так никто не мешает все параметры упаковать в два record

Имхо - два плохих решения.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача параметров в форму / 25 сообщений из 41, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]