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

Вниз

Возвращение результата формы (не 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.041 c
1-1176894953
Jioniro
2007-04-18 15:15
2007.06.17
Определение координат


2-1179903497
RomanLN
2007-05-23 10:58
2007.06.17
как в DBgrib вять(присвоить) содержимое нужной ячейки


6-1164180002
jorsand
2006-11-22 10:20
2007.06.17
Подскажите как получить доступ к сетевому ресурсу


15-1180008418
vitv
2007-05-24 16:06
2007.06.17
Delphi 7 Кэнту


2-1180087318
DelphiLexx
2007-05-25 14:01
2007.06.17
Фрейм отказывается быть контейнером, для других компонент





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский