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

Вниз

Возвращение результата формы (не ModalResult)   Найти похожие ветки 

 
Slider007 ©   (2007-04-19 09:53) [0]

Вопрос:
Есть форма, на ней грид из которого выбирается строка из БД (например человек).
Задача формы - предоставить список, чтоб я из него выбрал нужную позицию, и передать головной форме информацию о выборе (в данном случае значение поля ID из таблицы) и закрыться.
Вот сама передача значения в головную форму и интересует.
Видятся 3 варианта:
1. Сделать, например, в главном (или в каком-нибудь другом) модуле глобальную переменную, в нее писать нужное значение, закрывать текущую форму и потом из нужной формы читать.
2. Сделать в форме пропертю, которую головная форма считывать будет.
3. Сделать в головной форме пропертю, в которую текущая форма значение писать будет.

Не могу определиться, как правильнее сделать ?
Может вообще более изящное решение существует ?


 
Reindeer Moss Eater ©   (2007-04-19 10:13) [1]

function MySelectFunction(.....) : integer;


 
Slider007 ©   (2007-04-19 10:17) [2]

Ммм :)
А развернуть мысль ?


 
Reindeer Moss Eater ©   (2007-04-19 10:18) [3]

Куда развернуть?

Тебе нужно значение? Значит нужна функция.
Вот и напиши функцию, которая сделает то что тебе надо и вернет то что тебе надо.


 
Reindeer Moss Eater ©   (2007-04-19 10:24) [4]

1. Сделать, например, в главном (или в каком-нибудь другом) модуле глобальную переменную, в нее писать нужное значение, закрывать текущую форму и потом из нужной формы читать.
Корявое решение с точки зрения повторного использования кода. Форма выбора должна "знать" куда записывать результат вместо того, что бы просто вернуть его. Плюс к этому повышается взаимная зависимость модулей.

2. Сделать в форме пропертю, которую головная форма считывать будет.
Уже лучше, но все равно не то. Это лишнее.

3. Сделать в головной форме пропертю, в которую текущая форма значение писать будет.
То же самое что и п.1


 
Slider007 ©   (2007-04-19 10:30) [5]

Reindeer Moss Eater ©   (19.04.07 10:24) [4]
2. Сделать в форме пропертю, которую головная форма считывать будет.
Уже лучше, но все равно не то. Это лишнее.


А что тогда ТО ? :)

Ну например я в функции создаю (или показываю) форму, в которой мне нужный список выдается, делаю выбор. Дак как мне этот выбор самой функции, вызвавшей нужную форму со списком сообщить ?

На самом деле подобную задачу один раз всего решал и использовал пункт 2, но тут решил конкретно озадачиться, чтоб всё правильно было, но пока до конца догнать не могу, наверное познаний в делфи таки не хватает ..


 
Reindeer Moss Eater ©   (2007-04-19 10:46) [6]

А что тогда ТО ? :)

Я же скзал что то.
Функция, возвращающая результат.
Пользователь этй функции не должен ничего знать ни про класс формы осуществляющей выбор, ни тем более про поля этого класса.

В любом месте вызвал функцию - получил взад нужный результат.


 
clickmaker ©   (2007-04-19 10:54) [7]

type TSelectForm
  ....

class function TSelectForm.Execute(var ID: Integer); boolean;
begin
  with TSelectForm.Create(Application) do begin
      try
         if ShowModal = mrOk then begin
           ID := из грида
           result := true;
         end else
           Result := false;
      finally
         Free;
      end;
  end;
end;

вызов

if TSelectForm.Execute(ID) then
 выбрали


 
Slider007 ©   (2007-04-19 11:28) [8]

Ух !
Спасибо, то что надо, но сам бы не в жисть не написал бы, надо ООП доосваивать .. :(


 
StriderMan ©   (2007-04-19 11:35) [9]


> clickmaker ©   (19.04.07 10:54) [7]
> class function

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


 
Reindeer Moss Eater ©   (2007-04-19 11:46) [10]

а зачем в класс-то пихать? для красоты?

Да это вообще подрыв устоев.
Функция класса оперирует конкретным экземпляром и его полями.

:)


 
Slider007 ©   (2007-04-19 14:31) [11]

Ребята, подскажите ещё пожалуйста ламеру, ниче в ООП не смыслящему ;-(

Почему если я форму при старте приложения не создаю (закоментировал строку создания формы в файле *.dpr), то при выполнении кода [7] Access Violation вываливается ? Ведь в [7] если я правильно понял экземпляр формы как раз и создается ?


 
clickmaker ©   (2007-04-19 14:35) [12]


> [11] Slider007 ©   (19.04.07 14:31)

а как создаешь-вызываешь?


 
Slider007 ©   (2007-04-19 14:43) [13]

clickmaker ©   (19.04.07 14:35) [12]
а как создаешь-вызываешь?


Да так же как ты написал:

if TSelectForm.Execute(ID) then
 Edit1.Text := IntToStr(ID);


Если в *.dpr строку создания формы не коментировать, то всё работает.


 
Slider007 ©   (2007-04-19 14:45) [14]

Slider007 ©   (19.04.07 14:43) [13]
with TSelectForm.Create(Application) do begin
Здесь же форма создается ? Я правильно понимаю ?

Т.е. если я выполняю вызов
if TSelectForm.Execute(ID) then
Edit1.Text := IntToStr(ID);

То форма должна сама создаться ?


 
Reindeer Moss Eater ©   (2007-04-19 14:48) [15]

Все перепутал.


 
Reindeer Moss Eater ©   (2007-04-19 14:48) [16]

нет опыта - копируй данный пример "as is"


 
Slider007 ©   (2007-04-19 14:59) [17]

Да, опыта не хватает, тем более больше полутора лет ничего не писал, сейчас усиленно пытаюсь вспомнить то, что знал.

Может быть всётаки подскажешь ? Я же пытаюсь разобраться ..


 
Reindeer Moss Eater ©   (2007-04-19 15:00) [18]

тебе уже дали готовый пример. скопируй его как есть.


 
Плохиш ©   (2007-04-19 15:05) [19]


> Slider007 ©   (19.04.07 14:59) [17]

Ты сделал ошибку вот в этой строке

          ID := из грида


 
Slider007 ©   (2007-04-19 15:05) [20]

Просто ответь на вопрос пожалуйста, если не сложно в [7] в функции TSelectForm.Execute создается форма или нет ? Или её надо заранее самому создать ? Больше мне ничего не надо.


 
Slider007 ©   (2007-04-19 15:06) [21]

Плохиш ©   (19.04.07 15:05) [19]
Ты сделал ошибку вот в этой строке

         ID := из грида


Смешно :)
Но эту строку я как раз поправил :)


 
Reindeer Moss Eater ©   (2007-04-19 15:08) [22]

Просто ответь на вопрос пожалуйста, если не сложно в [7] в функции TSelectForm.Execute создается форма или нет ? Или её надо заранее самому создать ? Больше мне ничего не надо.

Execute не создает экземпляра. Экземпляры создает конструктор Create


 
Плохиш ©   (2007-04-19 15:09) [23]


> Смешно :)

Совершенно не смешно

> Но эту строку я как раз поправил :)

Вот в правке и сделал ошибку, я даже догадываюсь какую, но не скажу :-P


 
clickmaker ©   (2007-04-19 15:09) [24]


> [21] Slider007 ©   (19.04.07 15:06)

на какой строке AV?


 
ЮЮ ©   (2007-04-20 04:36) [25]

TSelectForm.Execute создается форма или нет ?

Создается. И УНИЧТОЖАЕТСЯ. Всё, что остается, это был ли "ShowModal = mrOk" или нет и возможно изменившийся Id.
if TSelectForm.Execute(ID) then
// работаем с новым значением Id


 
Slider007 ©   (2007-04-20 06:19) [26]

Ммм, всё заработало, после того, как сделал из классовой функции обычную.


 
Slider007 ©   (2007-04-20 06:25) [27]

Я дурень, адназначна !
Я при вызове
if TSelectForm.Execute(ID) then
выбрали

обращался к экземпляру формы, а не к классу, блин ..
Теперь всё окончательно работает.



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

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

Наверх




Память: 0.53 MB
Время: 0.059 c
15-1178522752
TUser
2007-05-07 11:25
2007.06.17
Саркази - выбор французов


15-1179611606
Marser
2007-05-20 01:53
2007.06.17
Список изменений в версии Delphi 7 сравнительно с более старыми


2-1179981178
=BuckLr=
2007-05-24 08:32
2007.06.17
RichEdit - полосы прокрутки


2-1173950118
Mishenka
2007-03-15 12:15
2007.06.17
Работа с MySql


15-1179569994
DeadMeat
2007-05-19 14:19
2007.06.17
ESC в диалогах