Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 Страница 18

Тут можно читать бесплатно Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001. Жанр: Компьютеры и Интернет / Программирование, год неизвестен. Так же Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте «WorldBooks (МирКниг)» или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание

Прочтите описание перед тем, как прочитать онлайн книгу «Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001» бесплатно полную версию:
…начиная с 1001. Смотрите другие файлы…

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 читать онлайн бесплатно

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать книгу онлайн бесплатно, автор Валентин Озеров

 FDatabase := DataBase;

 FQuery := Query;

 FDataSource := Datasource;

 FreeOnTerminate := True; // Устанавливаем флаг освобождения потока после его завершения

 Resume;                  // Продолжение выполнения потока

end;

procedure TQueryThread.Execute;

begin

 try

{ Выполняем запрос и подключаем источник данных к компоненту TQuery, вызывая ConnectDataSource из основного потока(для этой цели используем Synchronize)}

  FQuery.Open;

  Synchronize(ConnectDataSource);

 except

{ Ловим исключение (если оно происходит) и его дескриптор в контексте основного потока (для этой цели используемSynchronize). }

  FQueryException := ExceptObject as Exception;

  Synchronize(ShowQryError);

 end;

end;

procedure TQueryThread.ConnectDataSource;

begin

FDataSource.DataSet := FQuery;  // Подключаем DataSource к TQuery

end;

procedure TQueryThread.ShowQryError;

begin

Application.ShowException(FQueryException); // Обрабатываем исключение

end;

procedure RunBackgroundQuery(Session: TSession; DataBase: TDataBase; Query: TQuery; DataSource: TDataSource);

begin

{ Создаем экземпляр TThread с различными параметрами. }

 TQueryThread.Create(Session, Database, Query, DataSource);

end;

{$R *.DFM}

procedure TForm1.GoBtn1Click(Sender: TObject);

begin

{ Запускаем два отдельных запроса, каждый в своем потоке }

 RunBackgroundQuery(Session1, DataBase1, Query1, Datasource1);

 RunBackgroundQuery(Session2, DataBase2, Query2, Datasource2);

end;

end.

Метод TForm1.GoBtn1Click является обработчиком события нажатия кнопки. Данный обработчик события дважды вызывает процедуру RunBackgroundQuery, это случается при каждой передаче новых параметров компонентам для работы с базой данных. RunBackgroundQuery создает отдельный экземпляр класса TQueryThread, передает различные компоненты для работы с базой данных в его конструктор, который, в свою очередь, назначает их закрытым полям TQueryThread.

TQueryThread содержит две определенные пользователем процедуры: ConnectDataSource и ShowQryError. ConnectDataSource связывает FDataSource.DataSet с FQuery. Тем не менее, это делается в первичном потоке с помощью метода TThread.Synchronize. ShowQryError обрабатывает исключение в контексте первиного потока, также используя метод Synchronize. Конструктор Create и метод Execute снабжены подробными комментариями.

Получение физического пути к таблице

Delphi 2

Тема: Получение физического пути к таблице

Отправлено: Август 13, 1996

Автор: Xavier Pacheco

Если ссылка на таблицу получена через псевдоним, получить физический путь к ней не так просто. Для получения этого пути необходимо использовать функцию BDE DbiGetDatabaseDesc. Данной функции в качестве параметров передаются имя псевдонима и указатель на структуру DBDesc. Структура DBDesc будет заполнена информацией, относящейся к этому псевдониму. Определение структуры:

pDBDesc = ^DBDesc;

DBDesc = packed record 2{ Описание данной базы данных }

 szName    : DBINAME; { Логическое имя (или псевдоним) }

 szText    : DBINAME; { Описательный текст }

 szPhyName : DBIPATH; { Физическое имя/путь }

 szDbType  : DBINAME; { Тип базы данных }

end;

Физическое имя/путь будет содержаться в поле szPhyName структуры DBDesc.

Возможные значения, возвращаемые функцией DBIGetDatbaseDesc:

DBIERR_NONE Описание базы данных для pszName было успешно извлечено. DBIERR_OBJNOTFOUND База данных, указанная в pszName, не была обнаружена.

Приведенный ниже пример кода показывает как можно получить физический путь для компонента TTable, использующего псевдоним DBDemos:

var

 vDBDesc: DBDesc;

 DirTable: String;

begin

 Check(DbiGetDatabaseDesc(PChar(Table1.DatabaseName), @vDBDesc));

 DirTable := Format('%s\%s', [vDBDesc.szPhyName, Table1.TableName]);

 ShowMessage(DirTable);

end

Cancel в связанных таблицах

Delphi 1

В книге 'Delphi unleashed' на странице 520 автор написал:

'…, вы можете делать откат все время до тех пор, пока прямо или косвенно не сделаете постинг данных.'

Моя проблема дважды возникала в случае ExTable.Edit в различных процедурах. Код был примерно таким:

Procedure1 …

begin

 ExTable.Edit;

 ExTable.FieldByName('').asstring := ;

 …

end;

procedure2

begin

 ExTable.Edit;

 …

end;

Процедура CancelSpdBtnClick была вызвана после этих двух процедур. Действительно, прежде, чем делать откат, постинг был косвенно вызван между двумя вызовами ExTable.Edit. Теперь после такой модификации все работает как часы. 

Отображение формы ввода в БД CUSTOMER из рабочей формы ORDER

Delphi 1

В моем проекте имеется подобная функция, определяющая количество элементов:

В обработчике события OnClick я создаю форму ввода данных и вывожу ее командой .ShowModal. Затем я проверяю результат .ModalResult – и, если он равен mrOk, я передаю запись, в противном случае делаю отмену.

Я поместил имя модуля с формой ввода данных в список используемых модулей главной формы. Вот базовая схема моего кода: 

procedure TFrmItemNav.BtnChangeLocClick(Sender: TObject);

{var DlgItemLoc: TDlgItemLoc;}

begin

 DlgItemLoc := TDlgItemLoc.Create(FrmItemNav);

 DlgItemLoc.ShowModal;

 if DlgItemLoc.ModalResult = mrOk then

  {делаем все, что необходимо для постинга данных}

 else

  {очищаем и делаем Cancel};

 DlgItemLoc.Free;

end

Отображение определенных полей БД

Delphi 1

Вот что можно сделать во время выполнения программы: 

Table1.FieldByName(RemovedFieldName).Visible := False;

или 

Table1.Field[removedFieldNumber-1].Visible := false; 

Из базы данных в переменные

Delphi 1

Примерно так вы можете программным путем извлечь содержимое поля: 

aValue := TMyTable.FieldByName('SomeField').AsText;

или 

aValue := TMyTable.FieldByName('SomeField').AsInteger;

или 

aValue := TMyTable.Fields[1].AsFloat;

В действительности здесь вы получаете объект TField от объекта TTable (или TQuery), и затем вызываете соответствующий метод объекта TField для получения самих данных. Вы можете также изменить значение самого поля, но только в случае, если объект TTable находится в режиме вставки (Insert) или редактирования (Edit). Члены AsFloat, AsInteger, AsDateTime и AsString в действительности являются свойствами, и как таковые также могут принимать значения. С помощью Редактора Полей (Fields Editor, для вызова которого достаточно дважды щелкнуть на объекте TTable или TQuery) также возможно создание объектов-полей. Эти объекты могут быть использованы вместо получения их каждый раз от объекта TTable или TQuery.

Получение информации о таблице

Вам нужно воспользоваться свойством FieldDefs. В следующем примере список полей и их соответствующий размер передается компоненту TMemo (расположенному на форме) с именем Memo1:

procedure TForm1.ShowFields;

var

 i : Word;

begin

 Memo1.Lines.Clear;Table1.FieldDefs.Update; { должно быть вызвано, если Table1 не активна }

 for i:= 0 to Table1.FieldDefs.Count - 1 do With Table1.FieldDefs.Items[i] do Memo1.Lines.Add(Name + ' - ' + IntToStr(Size));

 Memo1.Lines.Add(Name + ' – ' + IntToStr(Size));

end;

Если вам просто нужны имена полей (FieldNames), то используйте метод TTable GetFieldNames:

GetIndexNames для получения имен индексов:

var FldNames, IdxNames : TStringList

begin

 FldNames := TStringList.Create;

 IdxNames := TStringList.Create;

 If Table1.State = dsInactive then Table1.Open;

 Table1.GetFieldNames(FldNames);

 Table1.GetIndexNames(IdxNames);

 {…… используем полученную информацию ……}

 FldNames.Free; {освобождаем stringlist}

 IdxNames.Free;

end;

Для получения информации об определенном поле вы должны использовать FieldDef. 

Обмен данными между TMemoField и TMemo

Delphi 1

Procedure TMemoToTMemoField;

begin

 TMemoField.Assign(TMemo.Lines);

end;

Procedure TMemoFieldToTMemo;

VAR aBlobStream : TBlobStream;

begin

Перейти на страницу:
Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.
Комментарии / Отзывы
    Ничего не найдено.