Форум: "Основная";
Текущий архив: 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.042 c