M Y D E L P H I 7 . R U Самоучитель программирования  
 
  • Главная
  •  

     

    Пример приложения ADO

    Теперь попробуем применить на практике представленную в этой главе информацию о реализации ADO в Delphi. В качестве примера создадим простое приложение ADO Demo, которое "умеет" отображать пару таблиц БД, сохранять изменения при помощи групповых операций, сортировать записи и устанавливать фильтры на выбранные записи (рис. 19.9).

    Рис. 19.9. Главное окно приложения ADO Demo

    В качестве источника данных выберем файлы dBase, имеющиеся в демонстрационной базе данных Delphi \Program Files\Common Files\Borland Shared \Data. Для использования в приложении выберем две таблицы: INDUSTRY и MASTER. Они связаны между собой внешним ключом по полям IND_CODE и INDUSTRY соответственно.

    Таблицу INDUSTRY можно редактировать, она инкапсулирована в компоненте tbiIndustry типа TADOTable и отображается в левом компоненте TDBGrid. А таблица MASTER инкапсулирована в компоненте tbIMaster, предназначена только для просмотра. Эти два компонента связаны отношением "ОДИН-КО-МНОГИМ" При помощи свойств MasterSource И MasterFields.

    Листинг 19.2. Секция implementation модуля uMain приложения ADO Demo 

    implementation

    uses IniFiles, FileCtrl;

    const slniFileName: String = 'ADODemo.ini';

    sEmptyDefDB: String = 'Database path is empty';

    sEmptyFilter: String = 'Records for filter is not selected';

    {$R *.dfm}

    procedure TfmMain.FormShow(Sender: TObject);

     begin

    with TIniFile.Create(slniFileName) do

     try

    DefDBStr := ReaDString('DefDB', 'DefDBStr1, "); 

    edDefDB.Text := DefDBStr;

     finally

    Free; end;

    SetLength(Bookmarks, 0);

      end;

    procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);

     begin

    with TIniFile.Create(slniFileName) do

     try

    WriteStringCDefDB', 'DefDBStr', edDefDB.Text); 

    finally

    Free ;

      end; 

    end;

    procedure TfmMain.sbDefDBClick(Sender: TObject);

     begin if SelectDirectory(DefDBStr, [], 0)

    then edDefDB.Text := DefDBStr;

      end;

    procedure TfmMain.tbConnectClick(Sender: TObject); 

    begin

    ADOConn.Close;

    ADOConn.DefaultDatabase := ''; if DefDBStr = '' then

     begin

    MessageDlg(sEmptyDefDB, mtError, [mbOK], 0);

    Abort;

     end 

    else 

    begin

    ADOConn.DefaultDatabase := DefDBStr;

    ADOConn.Open; 

    end;

      end;

    procedure TfmMain.tbSaveClick(Sender: TObject);

     begin

    tbllndustry.UpdateBatch(); 

    end;

    procedure TfmMain.tbFilterClick(Sender: TObject); 

    var i: Integer;

     begin

    if dbglndustry.SelectedRows.Count > 0 then

     begin

    SetLength(Bookmarks, dbglndustry.SelectedRows.Count);

     for i := 0 to dbglndustry.SelectedRows.Count — 1 do

     begin

    Bookmarks[i].VType := vtPointer;

    Bookmarks[i].VPointer := pointer(dbglndustry.SelectedRows[i]);

      end;

    tbllndustry.FilterOnBookmarks(Bookmarks); 

    end else

    MessageDlgtsEmptyFilter, mtWarning, [mbOK], 0); 

    end;

    procedure TfmMain.tbUnFilterClick(Sender: TObject); 

    begin

    tbllndustry.Filtered := False;

    dbglndustry.SelectedRows.Clear;

      end;

    procedure TfmMain.dbglndustryTitleClick(Column: TColumn); 

    begin if tbllndustry.Active then

    if (Pos(Column.FieldName, tbllndustry.Sort) > 0

    }and(Pos('ASC', tbllndustry.Sort) > 0)

    then tbllndustry.Sort := Column.FieldName + ' DESC' else tbllndustry.Sort := Column.FieldName + ' ASC';

      end;

    procedure TfmMain.ADOConnAfterConnect(Sender: TObject);

    var i: Integer;

    begin

    for i := 0 to adoConn.DataSetCount - 1 do ADOConn.DataSets [i] .Open/end;

    procedure TfmMain.ADOConnBeforeDisconnect(Sender: TObject);

    var i: Integer;

    begin

    for i := 0 to adoConn.DataSetCount — 1 do ADOConn.DataSets[i].Close;

      end;

    end.