Использование справочника
У меня такая проблема:
Я разместил на форме Form1 компоненты DBGrid1, DataSource1, Query1,
связал их. У меня есть таблица Dep, в которой находится справочник подразделений
(2 поля: id_dep, Dep).
Есть другая таблица - Pers, где находятся люди в конкретном подразделении
(поля fam, nam, pat, ... Dep - Фамилия, Имя, Отчество,..., подразделение).
Я хочу, чтобы при заполнении таблицы Pers в компоненте DBGrid1 когда я доходил до
поля Dep и нажимал на кнопку с многоточием в этом поле(свойство ButtonStyle для
этого поля равно cbsEllipsis) создавалась другая форма в которой появляется
справочник подразделения (таблица Dep) в котором при необходимости я могу добавить
новое подразделение или удалить какое-то, а при выборе нужного подразделения
текст его вставлялся бы в поле Dep компонента Form1->DBGrid1
Далее, когда я заполню все поля в текущей записи в DBGrid1, я в панели инструментов
формы 1 нажимаю на кнопку сохранить и вся запись сохраняется.
Как все это грамотно организовать?
У меня не получается добавить запись из справочника Dep в Form1->DBGrid1
Я писал так:
В обработчике события KeyDown формы со справочником - Form2
if (Key == VK_RETURN) {
// Form1->Query1->RequestLive = true;
Form1->DBGrid1->SelectedField->Value = Form2->Query1->FieldByName("Dep")->AsString;
Form2->Close();
}else if (Key == VK_ESCAPE) {
Form2->Close();
}
При этом возникает ошибка:
Query1: DataSet not in Edit or insert mode
Вставлял строку RequestLive = true; не помогло :(
Вопрос 1: Как можно проделать такую ситуацию или как это обычно делается(очень прошу
по подробней написать с приведенным кодом)?
Вопрос 2: Как это организовать, используя dll,т.е. при нажатии на кнопку с многоточием
загружается dll в которой нет функций, а есть форма с таблицей справочника, когда
выбрана нужная запись dll уничтожается,а выбранная запись вставляется в текущее поле.
Вопрос 3: Как можно сослаться на какой-то обработчик события, т.е. допустим я написал
обработку какого-то события(например нажатия на кнопку button1), пусть у меня есть
кнопка button2 и я хочу, чтобы при нажатии на эту кнопку вызывался обработчик кнопки button1
(чтобы не писать 2 одинаковых кода для каждой кнопки).
Вопрос 4: Дело в том, что при нажатии на кнопку с многотичием в поле Dep в обработчике события
DBGrid1EditButtonClick я написал такой код:
Application->CreateForm(__classid(TForm2), &Form2);
Form2->Visible = true;
Form2->Query1->SQL->Clear();
Form2->Query1->SQL->Add("select dep from pers");
Form2->Query1->Active = true;
т.е. создается форма2, но когда я закрываю форму2 память почему-то не освобождается.
А в файле Project1.cpp я закоментировал строку Application->CreateForm(__classid(TForm2), &Form2);
Как освободить память, которую раньше занимала эта форма?
Помогите пожалуйста разобраться. :)
Заранее благодарен.
Привет всем!
У меня такая проблема:
Я разместил на форме Form1 компоненты DBGrid1, DataSource1, Query1,
связал их. У меня есть таблица Dep, в которой находится справочник подразделений
(2 поля: id_dep, Dep).
Есть другая таблица - Pers, где находятся люди в конкретном подразделении
(поля fam, nam, pat, ... Dep - Фамилия, Имя, Отчество,..., подразделение).
Я хочу, чтобы при заполнении таблицы Pers в компоненте DBGrid1 когда я доходил до
поля Dep и нажимал на кнопку с многоточием в этом поле(свойство ButtonStyle для
этого поля равно cbsEllipsis) создавалась другая форма в которой появляется
справочник подразделения (таблица Dep) в котором при необходимости я могу добавить
новое подразделение или удалить какое-то, а при выборе нужного подразделения
текст его вставлялся бы в поле Dep компонента Form1->DBGrid1
Далее, когда я заполню все поля в текущей записи в DBGrid1, я в панели инструментов
формы 1 нажимаю на кнопку сохранить и вся запись сохраняется.
Как все это грамотно организовать?
У меня не получается добавить запись из справочника Dep в Form1->DBGrid1
Я писал так:
В обработчике события KeyDown формы со справочником - Form2
if (Key == VK_RETURN) {
// Form1->Query1->RequestLive = true;
Form1->DBGrid1->SelectedField->Value = Form2->Query1->FieldByName("Dep")->AsString;
Form2->Close();
}else if (Key == VK_ESCAPE) {
Form2->Close();
}
При этом возникает ошибка:
Query1: DataSet not in Edit or insert mode
Вставлял строку RequestLive = true; не помогло :(
Вопрос 1: Как можно проделать такую ситуацию или как это обычно делается(очень прошу
по подробней написать с приведенным кодом)?
Вопрос 2: Как это организовать, используя dll,т.е. при нажатии на кнопку с многоточием
загружается dll в которой нет функций, а есть форма с таблицей справочника, когда
выбрана нужная запись dll уничтожается,а выбранная запись вставляется в текущее поле.
Вопрос 3: Как можно сослаться на какой-то обработчик события, т.е. допустим я написал
обработку какого-то события(например нажатия на кнопку button1), пусть у меня есть
кнопка button2 и я хочу, чтобы при нажатии на эту кнопку вызывался обработчик кнопки button1
(чтобы не писать 2 одинаковых кода для каждой кнопки).
Вопрос 4: Дело в том, что при нажатии на кнопку с многотичием в поле Dep в обработчике события
DBGrid1EditButtonClick я написал такой код:
Application->CreateForm(__classid(TForm2), &Form2);
Form2->Visible = true;
Form2->Query1->SQL->Clear();
Form2->Query1->SQL->Add("select dep from pers");
Form2->Query1->Active = true;
т.е. создается форма2, но когда я закрываю форму2 память почему-то не освобождается.
А в файле Project1.cpp я закоментировал строку Application->CreateForm(__classid(TForm2), &Form2);
Как освободить память, которую раньше занимала эта форма?
Помогите пожалуйста разобраться. :)
Заранее благодарен.
Всем с добрым утречком !
evasya, у меня был такой косяк когда я выбирал в свой Query упорядоченные данные т.е. сортировал, например по Dep. Если просто выбирать "select * from base" тогда такого косяка нет. Буду рад если тебе это поможет.
:)
void __fastcall TfmMain::DBGrid1EditButtonClick(TObject *Sender)
{
}
Это событи происходит когда пользователь нажимает на клавишу с троеточием.
А вообще дай мне свое мыло я постараюсь тебе скинуть пример со всеми требованиями.
mailto:sedegoff@online.nsk.su
Сегодня попробовал установил RequestLive=true в Object Inspectore вроде получилось, заработало, но до этого я программно устанавливал это свойство и не работало...странно :(
А по поводу события, которое наступает при нажатии на кнопку с 3-мя точками: я знаю его, я его и использую, чтобы создавалась форма где я потом выбираю нужную запись.
Потом эта форма закрывается, а вот память почему-то не освобождается(в windows 2000 если посмотреть диспетчер задач, то память не уменьшилась, а если опять открыть это окно, то память, занимаемая программой увеличивается).
мой e-mail: [email]evasya@mail.ru[/email]
Вообще-то я не использую конструкции с order by
Сегодня попробовал установил RequestLive=true в Object Inspectore вроде получилось, заработало, но до этого я программно устанавливал это свойство и не работало...странно :(
А по поводу события, которое наступает при нажатии на кнопку с 3-мя точками: я знаю его, я его и использую, чтобы создавалась форма где я потом выбираю нужную запись.
Потом эта форма закрывается, а вот память почему-то не освобождается(в windows 2000 если посмотреть диспетчер задач, то память не уменьшилась, а если опять открыть это окно, то память, занимаемая программой увеличивается).
мой e-mail: [email]evasya@mail.ru[/email]
Пример создания и высвобождения формы:
//Unit1.cpp
#include "Unit1.h"
#include "Unit2.h"
void __fastcall TfmMain::DBGrid1EditButtonClick(TObject *Sender)
{
TForm2 *Frm = new TForm2(this);
Frm->Show();//или ShowModal() смотря что нужно
//если показываешь модально то потом не забудь
if(Frm)
Frm->Release();
}
//Unit2.cpp
#include "Unit2.h"
TForm2::FormClose(TObject *Sender,TCloseAction &Action)
{
Action = caFree;
// если показывал немодально то
this->Release();
}
//--------------------------------------
Касательно обработчика на несколько кнопок, просто в Инспекторе выстави для OnClick одну и туже функцию, а в ней уже смотри кто Sender и от этого пляши.