Создаем новую форму :
File -> New -> Form -> Simple Form ->
На запрос имени файла - вводим "continentseditform" и подтверждаем -> автоматически создается форма :
"continentseditfo"
procedure tcontinentseditfo.continentseditfocreated(
const sender: TObject);
begin
application.createdatamodule(trefsdatamo, refsdatamo);
commonrefseditfo1.dsContents.dataset := grdContinents.datasource.dataset;
end;
procedure tcontinentseditfo.continentseditfodestroyed(
const sender: TObject);
begin
refsdatamo.free;
end;
Не забудем включить в "uses" секцию "implementation" файла "continentseditform.pas" модуль "refsdatamodule" :
implementation
uses
continentseditform_mfm,
// предоставляет тип "trefsdatamo" и объект "refsdatamo"
refsdatamodule
;
Переключаемся на отображение формы "refsdatamo" и выбираем "qryContinents" :
Вновь возращаемся на форму "continentseditfo" ( выбрав файл "continentseditform.pas", и далее, если необходимо - нажав "F12" ).
Щелкнув на форме правой кнопкой, открыть меню, и, командой "Insert submodule" - вставить в форму субмодуль "commonrefseditform" . При необходимости - подогнать размер, чтобы исчезли полосы прокрутки.
Уронить на "continentseditfo" компонент DB -> tdbwidgetgrid, и установить для него место и размер как у "planetseditfo -> grdPlanets" :
name := grdContinents
procedure tcontinentseditfo.grdcontinentsupdaterowdata(
const sender: tcustomgrid;
const arow: Integer; const adataset: TDataSet);
begin
case adataset.updatestatus of
usInserted: sender.rowcolorstate[arow]:= 0;
usModified: sender.rowcolorstate[arow]:= 1;
else
sender.rowcolorstate[arow]:= 255;
end;
end;
и не забудьте добавить нужные "unit" -ы в секцию "interface -> uses" :
interface
uses
msegui,mseclasses,mseforms,commonrefseditform,msedbedit,
msegrids,
db
;
Теперь создадим и опишем столбцы "grdContinents", подлежащие просмотру и редактированию.
Уронить на "grdContinents" компонент DB -> tdbstringedit :
name:= seContinent
Настроить появившийся столбец таблицы
grdContinents :
Уронить на "grdContinents" компонент DB -> tdbenumeditlb :
name:= lbnePlanet
Примечания :
- данный компонент :
- берет список значений "refsdatamo.lbufPlanets" ( заполняемый по результатам запроса к таблице планет ( refsdatamo.dsPlanets->qryPlanets ) )
- выбирает в нем самый первый текстовый столбец ( textfields[0] = "descr" = названия планет ), и значениями из этого столбца заполняет выпадающий список
- по текущему значению "planet_id" ( каждого из континентов ) выборки из таблицы континентов ( refsdatamo.dsContinents->qryContinents ) находит название планеты в выпадающем списке и отображает его
- при выборе в выпадающем списке находит соответствующее этому выбору значение в самом первом целочисленном столбце ( integerfields[0] = "id" = ключи планет )
- записывает найденное значение в поле "planet_id" выборки из таблицы континентов
Таким образом осуществлена синхронизация выборок из 2-х таблиц ( планет и континентов ) , причем - без 2-табличного ( read-only ) запроса, что позволило нам воспользоваться средствами автоматической генерации SQL-запросов на изменения данных
Настроить появившийся столбец таблицы
grdContinents :
Осталось сделать вызов "continentseditfo" через главное меню программы.
Переключиться на дизайн "mainfo" ( файл "main.pas" ).
Уронить в любом незарисованном месте "mainfo" компонент "GUI -> taction" :
Name:= actContinentsEdit
procedure tmainfo.continentseditexecute(const sender: TObject);
begin
try
application.createform(tcontinentseditfo, continentseditfo);
if continentseditfo.show(true) = mr_windowclosed then begin
qryPersons.active:= true;
end;
finally
continentseditfo.free;
end;
end;Не забудьте добавить ссылку на файл "continentseditform" в секцию "interface" файла "main.pas" :
interface
uses
msegui,mseclasses,mseforms,msepqconnection,msesqldb,msedb,
msedbedit,mseactions,msesimplewidgets,msemenus,db,msegrids,
planetseditform,
continentseditform
;
Настроить вызов "actContinentsEdit" из основного меню формы приложения ( mainfo ):
mnuMain :
Финальный вид формы редактора списка континентов :
в дизайне :
и во время работы программы:
Единственное существенное отличие данного ( континенты -> continentseditform ) справочника от вышерассмотренного ( планеты -> planetseditform ) - наличие второго столбца в таблице, отображение и редактирование в котором сделано с использованием выпадающего списка ( предоставляемого компонентом "tdbenumeditlb" ) .