WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 |   ...   | 9 | 10 || 12 | 13 |   ...   | 14 |

- 108- finally CloseDataSet;

end;

except result:=false;

end;

end;

Для получения данных на сервере выполняется запрос на выборку SELECT kod_group, name_group FROM GROUPS ORDER BY name_group;

который передается в компонент Queryl. Результирующий набор данных пере- бирается в цикле while... do и заносится в список:

ListBoxl.Items.AddObject(Queryl.Fields[1].AsString, TObject (Queryl.Fields[0].AsInteger));

Здесь вместо ссылки на объект в свойство objects заносятся целые числа — коды типов оборудования, над которыми выполняется преобразование типа.

Извлечь такое значение можно при помощи конструкции Integer(ListBoxl.Items.Object[<№ элемента>]) Функция DelElement не отличается от функций, расмотренных в преды- дущем модуле dlglib0l:

function ТflGroups.DelElement:boolean;

begin try result:=true;

CloseDataSet;

StoredProcl.StoredProcName: = 'del_groups';

StoredProcl.Params.Clear;

with StoredProcl.Params.CreateParam (ftlnteger, 'kod_group', ptInput) do begin AsInteger:=integer(ListBoxl.Items.Objects [ListBoxl.Itemlndex]);

end;

StoredProcl.Prepare;

StoredProcl.ExecProc;

ListBoxl.Items.Delete(ListBoxl.Itemlndex);

except result:=false;

end;

end;

Как и в функциях, созданных ранее, здесь используется класс storedProc, выполняющий хранимую процедуру del_groups. В качестве значения пара- метра kod_group ей передается код типа оборудования из выделенной строки в списке. После удаления строки с этим кодом из БД она удаляется и из списка.

- 109- Теперь, как и в предыдущем случае рассмотрим процедуры, которые будут экспортироваться из DLL и вызываться другими модулями. Таких процедур три:

procedure CreateListDlg(Handle:THandle; p:pointer);

procedure SetListConnection(const DBHandle:HDBIBB);

procedure ShowListDlg;

Первая процедура создает диалоговое окно, вторая - производит подклю- чение к БД, а третья - загружает и освобождает диалоговое окно.

procedure CreateListDlg (Handle: Thandle; p: pointer);

begin Application.Handle:=Handle;

flGroups:=TfIGroups.Create(Application);

if assigned(p) then flGroups.Groups:=TGroups(p);

end;

procedure SetListConnection(const DBHandle: HDBIDB);

begin flGroups.Databasel.Handle:=DBHandle;

end;

procedure ShowListDlg;

begin with flGroups do begin if LoadList then begin ShowModal;

flGroups.Free;

end;

end;

end;

Экспортируемые функции должны быть описаны в модуле проекта DLL, поэтому добавьте в файл dlglib02.dpr раздел exports. Файл проекта должен выглядеть следующим образом:

library dlglib02;

uses SysUtils, Classes, ulGroups in 'ulGroups.pas' {flGroups};

ucGroups in '..\common\ucGroups.pas', {$R *.res} exports CreateListDlg name 'CREATELISTDLG', SetListConnection name 'SETLISTCONNECTION', ShowListDlg name 'SHOWLISTDLG';

- 110- begin end.

Обратите внимание, что в директиве uses имя - ссылка на модуль BDE - это необходимо для того, чтобы был виден тип HDBIDB. Откомпилируйте и по- стройте dlglib02.dll.

Вызов функции осуществляется в обработчике кнопки «Удалить», который следует создать:

procedure TflGroups.btnDeleteClick(Sender:TObject);

begin if Application.MessageBox('Удалить группу из базы', 'Учебные курсы', MB_ICONQUESTION+MB_YESNO)=IDYES then begin if not DelElement then ShowMessage('Ошибка при удалении записи из БД. Код:' +IntToStr(Groups.kod_group));

end;

end;

Для добавления и изменения данных наступило время воспользоваться уже готовой dlglibOl. dll.

procedure TflGroups.btnAddClick(Sender:TObject);

type TCreateElemDlg=procedure(Handle: THandle; p:pointer);

TSetElemConnection=procedure(const DBHandle:HDBIDB);

TShowElemDlg=procedure(const DlgMode:boolean);

var hLib:THandle;

CreateElemDlg: TCreateElemDlg;

SetElemConnection: ТSetListConnection;

ShowElemDlg: TShowListDlg;

PGroups: TGroups;

begin hLib:=LoadLibrary('DLGLIB01.DLL');

if hLib < 32 then begin ShowMessage('Отсутствует библиотека');

Exit;

end;

CreateElemDlg:=TcreateElemDlg(GetProcAddress(hLib, 'CREATEELEMDLL'));

SetElemConnection:=TsetElemConnection(GetProcAddress (hlib, 'SETELEMCONNECTION'));

ShowElemDlg:=TshowElemDlg(GetProcAddress (hlib, 'SHOW ELEMDLG'));

PGroups:=TGroups.Create;

CreateElemDlg(Application.Handle,PGroups);

- 111- SetElemConnect ion (DataBase!.Handle);

ShowElemDlg(true);

If PGroups.changed then LoadList;

FreeLibrary(hlib);

end;

Собственно вызов формы производится в несколько этапов:

•- создается пустой экземпляр класса PGroups, который должен передаваться в форму элемента PGroups: =TGroups. Create;

• создается ОКНО CreateElemDlg (Application. Handle, PGroups);

• устанавливается связь с БД, причем, диалогу передается все тот же Handle базы SetElemConnection (DataBasel. Handle) полученный из main;

• диалог вызывается на экран в режиме вставки нового элемента ShowElemDlg(true).

После вызова формы элемента в свойство changed объекта PGroups пока- зывает, была ли выполнена операция внесения в БД, т. к. пользователь мог про- сто нажать «Отмена». Если данные внесены (changed = true), то список ListBox загружается заново, чтобы отобразить произведенные изменения.

Точно также производится и динамический вызов DLL в обработчике кноп- ки «Свойства» btnPropClick.

procedure TflGroups.btnPropClick(Sender:TObject);

type TCreateElemDlg=procedure(Handle: THandle; p: pointer);

TSetElemConnection=procedure(const DBHandle: HDBIDB);

TShowElemDlg=procedure(const DlgMode: boolean);

var hLib: THandle;

CreateElemDlg: TCreateElemDlg;

SetElemConnection: TSetElemConnection;

ShowElemDlg: TShowElemDlg;

PGroups: TGroups;

begin hLib:=LoadLibrary('DLGLIB01.DLL');

if hLib < 32 then begin ShowMessage('Отсутствует библиотека');

Exit;

end;

CreateElemDlg:=TCreateElemDlg(GetProcAddress(hLib, 'CREATEELEMDLL'));

SetElemConnection:=TSetElemConnection(GetProcAddress( hlib, 'SETELEMCONNECTION'));

ShowElemDlg:=TShowElemDlg(GetProcAddress(hlib, 'SHOWELEMDLG'));

{создаем объект для передачи данных в форму элемента} - 112- PGroups:=TGroups.Create;

with PGroups do begin {в объект вносятся данные из списка-наименование и код} kod_group:=integer(ListBoxl.Items.Objects [ListBoxl.Itemlndex]);

name_group:=ListBoxl.Items[ListBoxl.Itemlndex];

kolstudents:=integer(ListBoxl.Items.Objects [ListBoxl.Itemlndex]);

sredniy ball:=real(ListBoxl.Items.Objects [ListBoxl.Itemlndex]);

end;

CreateElemDlg(Application.Handle,PGroups);

SetElemConnection (DataBasel.Handle);

ShowElemDlg(false);

if PGroups.changed then LoadList;

FreeLibrary(hLib);

end;

От созданного ранее оно отличается тем, что при создании диалога в него передается не «пус той» объект PGroups, а содержащий данные из выбранной строки списка ListBox.

Кроме того, диалог вызывается в режиме изменения - в процедуру ShowElemDlg передается параметр false.

При выходе из формы нажатием на кнопку «Выход» - данные из выбранной строки списка ListBoxl сохраняются в объекте Groups, если он существует:

procedure TflGroups.btnExitClick(Sender:TObject);

begin if ListBoxl.Itemlndex <> -1 then begin if assigned (Groups) then with Groups do begin kod_group:=integer(ListBoxl.Items.Objects [ListBoxl.Itemlndex]);

namegroup : =ListBoxl. I terns [ListBoxl.Itemlndex];

kolstudents:=integer(ListBoxl.Items.Objects [ListBoxl.Itemlndex]);

sredniy_ball:=real(ListBoxl.Items.Objects [ListBoxl.Itemlndex]);

end;

end;

end;

Здесь мы исходили из того, что форма списка, скорее всего, будет ис- пользоваться для выбора элемента - значит, выбранный элемент каким-то образом будет нужно передавать вызывающему модулю. Именно для этого - 113- мы и используем ссылку на объект Groups, которая передается параметром при создании диалога и присваивается, если не равна nil:

if assigned(p) then flGroups.Groups:=TGroups(p);

Полный текст модуля ul Groups приведен в следующем листинге:

unit ulGroups;

interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DBTables, DB, StdCtrls, ucGroups, BDE;

type TfIGroups = class(TForm) ListBoxl: TListBox;

btnAdd: TButton;

btnProp: TButton;

btnDelete: TButton;

btnOK: TButton;

DataSourcel: TDataSource;

Databasel: TDatabase;

StoredProcl: TStoredProc;

Queryl: TQuery;

procedure btnDeleteClick(Sender:TObject);

procedure btnAddClick(Sender:TObject);

procedure btnPropClick(Sender:TObject);

procedure btnExitClick(Sender:TObject);

private Groups: TGroups;

procedure CloseDataSet;

function LoadList: boolean;

function DelElement: boolean;

public { Public declarations } end;

procedure CreateListDlg (Handle: Thandle; p: pointer);

procedure SetListConnection(const DBHandle: HDBIDB);

procedure ShowListDlg;

var flGroups: TfIGroups;

implementation {$R *.dfm} j **************************************************************** i { Процедура закрытия активных соединений, если они имеются } г *******#********************#******•*********************•*•*•*• I procedure TfIGroups.CloseDataSet;

begin if StoredProcl.Active then StoredProcl.Close;

if Queryl.Active then Queryl.Close;

- 114- end;

{ Загрузка списка групп из базы данных } 1***********************************************************} function TfIGroups.LoadList;

begin try try result:=true;

ListBoxl.Items.Clear;

CloseDataSet;

Queryl.SQL.Clear;

Queryl.SQL.Add('select kod_group, name_group');

Queryl.SQL.Add('from GROUPS');

Queryl.SQL.Add('order by name_group');

Queryl.Open;

while not Queryl.EOF do begin ListBoxl.Items.AddObject(Queryl.Fields[1].AsString, TObject(Queryl.Fields[0].AsInteger));

Queryl.Next;

end;

btnProp.Enabled:=false;

btnDelete.Enabled:=false;

finally CloseDataSet;

end;

except end;

end;

I***********************************************************} { Функция удаления группы из базы данных } *****************^***************************************} function TfIGroups.DelElement:boolean;

begin try result:=true;

CloseDataSet;

StoredProcl. StoredProcName : = ' del_parttype ' ;

StoredProcl.Params.Clear;

with StoredProcl.Params.CreateParam (ftlnteger, 'equip_type_id', ptlnput) do begin AsInteger:=integer(ListBoxl.Items.Objects[ListBoxl.

Itemlndex]);

end;

StoredProcl.Prepare;

result:=false;

end;

end;

- 115- except result : =false;

end;

end;

/ *********************************************************** i { Процедуры, вызываемые из DLL другими модулями } i***********************************************************i { ******** Процедура создания диалогового окна ************} procedure CreateListDlg (Handle: Thandle; p: pointer);

begin Application. Handle : =Handle;

fl Groups : =TflGroups.Create (Application) ;

if assigned(p) then flGroups. Groups : =TGroups (p) ;

end;

I****************** процедура подключения к БД ************) procedure SetListConnection (const DBHandle : HDBIDB) ;

begin flGroups. Databasel. Handle : =DBHandle;

end;

{******* Процедура загрузки и выгрузки формы списка ********} procedure ShowListDlg;

begin with flGroups do begin if LoadList then begin ShowModal ;

flGroups. Free;

end;

end;

end;

I***********************************************************! { Обработчики нажатий кнопок } { Обработчики нажатий кнопок } !***********************************************************} {*********** обработчик нажатия кнопки "Удалить" ***********} procedure TflGroups.btnDeleteClick(Sender:TObject);

begin if Application.MessageBox('Удалить группу из базы', 'Учебные курсы', MB_ICONQUESTION+MBYESNO) =IDYES then begin if not DelElement then ShowMessage('Ошибка при удалении записи из БД. Код:' +IntToStr(Groups.kod_group));

- 116- end;

end;

{*********** обработчик нажатия кнопки "Добавить" ***********} {******** Вызывается форма элемента из dlglib01.dll *********} procedure TflGroups.btnAddClick(Sender:TObject);

type TCreateElemDlg=procedure(Handle: THandle; pipointer);

TSetElemConnection=procedure(const DBHandle:HDBIDB);

TShowElemDlg=procedure(const DlgMode:boolean);

var hLib:THandle;

CreateElemDlg: TCreateElemDlg;

SetElemConnection: TSetElemConnection;

ShowElemDlg: TShowElemDlg;

PGroups: TGroups;

begin hLib:=LoadLibrary('DLGLIB01.DLL');

if hLib < 32 then begin ShowMessage('Отсутствует библиотека');

Exit;

end;

CreateElemDlg:=TcreateElemDlg(GetProcAddress(hLib, 'CREATEELEMDLL'));

SetElemConnection:=TsetElemConnection(GetProcAddress (hlib, 'SETELEMCONNECTION'));

ShowElemDlg:=TshowElemDlg(GetProcAddress (hlib, 'SHOWELEMDLG'));

PGroups:=TGroups.Create;

CreateElemDlg(Application.Handle,PGroups);

SetElemConnection(DataBasel.Handle);

ShowElemDlg(true);

If PGroups.changed then LoadList;

FreeLibrary(hlib);

end;

(*********** обработчик нажатия кнопки "Свойства" ***********} {******** вызывается форма элемента из dlglib01.dll *********} procedure TflGroups.btnPropClick(Sender:TObject);

type TCreateElemDlg=procedure(Handle: THandle; p: pointer);

TSetEleraConnection=procedure(const DBHandle: HDBIDB);

TShowElemDlg=procedure(const DlgMode: boolean);

var hLib: THandle;

CreateElemDlg: TCreateElemDlg;

SetElemConnection: TSetElemConnection;

ShowElemDlg: TShowElemDlg;

PGroups: TGroups;

begin hLib:=LoadLibrary('DLGLIB01.DLL');

if hLib < 32 then - 117- begin Show-Message ( ' Отсутствует библиотека ' ) ;

Exit;

end;

CreateElemDlg:=TCreateElemDlg(GetProcAddress(hLib, CREATEELEMDLL'));

SetElemConnection:=TSetElemConnection(GetProcAddress( hlib, 'SETELEMCONNECTION'));

ShowElemDlg:=TShowElemDlg(GetProcAddress(hlib, 'SHOWELEMDLG'));

{создаем объект для передачи данных в форму элемента} PGroups:=TGroups.Create;

with PGroups do begin {в объект вносятся данные из списка - наименование и код} kod_group :=integer (ListBoxl. Items '.Objects [ListBoxl.Itemlndex]);

name_group:=ListBoxl.Items[ListBoxl.Itemlndex];

kol_students:=integer(ListBoxl.Items.Obj ects [ListBoxl.Itemlndex]);

sredniy_ball:=integer(ListBoxl.Items.Obj ects [ListBoxl.Itemlndex]);

end;

CreateElemDlg(Application.Handle,PGroups);

SetElemConnection (DataBasel.Handle);

ShowElemDlg(false);

if PGroups.changed then LoadList;

FreeLibrary(hLib);

end;

(************* обработчик нажатия кнопки "Выход" ************} procedure TflGroups.btnExitClick(Sender:TObject);

begin if ListBoxl.Itemlndex <> -1 then begin if assigned (Groups) then with Groups do begin kod_group:=integer(ListBoxl.Items.Objects [ListBoxl.Itemlndex]);

name_group:=ListBoxl.Items [ListBoxl.Itemlndex];

kol_students:=integer(ListBoxl.Items.Objects [ListBoxl.Itemlndex]);

sredniy_ball:=integer(ListBoxl.Items.Objects [ListBoxl.Itemlndex]);

end;

end;

end;

end.

Скомпилируйте и постройте оболочку dlglib02.dll.

- 118- 3.4.3.6. ОРГАНИЗАЦИЯ ВЫЗОВА ФОРМЫ СПИСКА в ГЛАВНОМ МОДУЛЕ Нам осталось создать вызов формы стшска «Группы» в главном модуле main. Перейдите в проект main и создайте обработчик пункта меню «Учебные курсы\Группы»:

procedure TfMain.NlOClick(Sender: TObject);

type TCreateListDlg=procedure(Handle: THandle; p:pointer);

TSetListConnection=procedure(const DBHandle:HDBIDB);

TShowListDlg=procedure;

var nLj_D : 1 Handle ;

CreateListDlg: TCreateListDlg;

SetListConnection: ТSetListConnection;

ShowListDlg: TShowListDlg;

begin hLib:=LoadLibrary('DLGLIB02.DLL') ;

if hLib < 32 then begin ShowMessage ( ' Отсутствует библиотека DLGLIB02. DLL ' ) ;

Exit;

end;

Pages:     | 1 |   ...   | 9 | 10 || 12 | 13 |   ...   | 14 |






















© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.