Пpиходит пpогpамеp вечеpом домой весь в кpови и без pуки. Жена спpашивает:
- Что случилось доpогой???
Пpогpамеp:
- Да так, в кулеp засосало.

var
m: TMenuItem;
navidummy: TComponent;
………………………………………………….

procedure TMyForm.CreatePopUpMM(Sender: TObject);
begin

Navidummy.free;
Navidummy := TComponent.create(self);

while not NaviT.EOF do
begin
m := TMenuItem.create(navidummy);
II := II + 1;
with m do
begin
name := ‘MM’ + IntToStr(II);
caption := NaviT.Fieldbyname(’MyWHAT’).AsString;
tag := NaviT.Fieldbyname(’MyTAG’).AsInteger;
visible := True;
OnClick := NaviExec;
end;
MyMenuItem.add(m);
NaviT.Next;
end;
NaviT.Close;
end;

procedure TMyForm.NaviExec(Sender: TObject);
begin
{ Здесь я получаю то, что хочу ! }
What.text := (Sender as TMenuItem).Caption;
Key := (Sender as TMenuItem).Tag;
end;

Очень интересный и полезный вопрос!! Я сам так с ним до конца и не разобрался! Но я попробую систематизировать события, происходящие при запросе на завершение работы Windows:

Windows посылает сообщение WM_QUERYENDSESSION главным окнам всех запущенных приложений, при этом приложения должно сообщить свою готовность к завершению работы.
Если при этом хотя бы одно из приложений ответит отрицательно, Windows прерывает процесс завершения работы.

Delphi перехватывает это сообщение, и, в свою очередь, вызывает метод TForm.CloseQuery, (в главной форме, естественно), который генерирует событие OnCloseQuery, в обработчике которого можно указать на неготовность завершения приложения и отмены завершения работы Windows.

Если я правильно понимаю, если ваше приложение “не мешает” Windows завершить свою работу, Windows нормально НЕ завершает работу приложения, поскольку для этого нет необходимости, не нужно освобождать память, ресурсы и пр. Так, если это утверждение верно (это легко можно проверить, но я слишком ленив сейчас), то событие OnCloseQuery - ваш единственный шанс сохранения данных на диске. Я не думаю что эта логика слишком плоха, просто это одна из тех причуд Windows, которую нужно знать и пользоваться ею. Что может произойти в описанном выше сценарии: редактируемая в настоящий момент запись не будет отправлена (Post) в базу данных, но та же самая вещь может случиться и при нормальном завершении приложения.
При выходе из windows, вы вызываете WM_CLOSE api (или что-то типа этого) для каждого работающего в настоящий момент приложения. Программа закрывается точно таким же образом, как если бы вы щелкнули на кнопке закрытия или вызвали close из главной формы. Поэтому вам не нужно предпринимать никаких дополнительный действий, связанных с завершением работы с таблицами.

Автор: delphi | в 8:20 | Рубрики: Базы данных

“Могу ли я при помощи объекта Tdatabase узнать с каким типом базы данных он связан?”

{uses должен включать в себя db, dbitypes, dbiprocs }
procedure TForm1.FormCreate(Sender: TObject);
var
rDB: DBDesc ;
begin
{ Первый аргумент DbiGetDatabaseDesc - имя псевдонима базы данных типа PChar }
Check(DbiGetDatabaseDesc(’IBLOCAL’, @rDB)) ;
{ член szDbType структуры DBDesc содержит информацию о типе
базы данных и имеет тип PChar }
ShowMessage( ‘Database имеет тип: ‘ + StrPas(rDB.szDbType) ) ;
{ Совет: Если вам просто необходимо узнать -
SQL server это или нет, используйте свойсто TDatabase
IsSQLBased }
end;

unit DdhDynDb;

interface

uses
Controls, Db, Forms, Classes, DbTables;

function ConvertClass(FieldClass: TFieldClass): TControlClass;

procedure NormalizeString(var S: string);

procedure ConnectDataFields(DbComp: TControl;
DataSource: TDataSource; FieldName: string);

function GenerateForm(StrList: TStringList;
SourceTable: TTable): TForm;

function GenerateSource(AForm: TForm;
FormName, UnitName: string): string;

implementation

uses
TypInfo, DbCtrls, SysUtils, StdCtrls, ExtCtrls, Windows;
Читать полностью…

Try
Tabl.Post;
Except
Begin
On EDatabaseError do
ShowMessage(’Не могу отправить данные (выполнить Post)’);
(Sender AS TDBEdit).SetFocus;
End; {Begin}
End, {Try}

Я осуществляю синтаксический разбор Error и вновь генерирую исключение (передаю по иерархии следующему обработчику объектов исключительных ситуаций), если я больше не хочу иметь с ним дела. Если использовать:

On E : EDatabaseError do…

то можно получить значение E.Error. Реально, имя свойства с текстом ошибки должно быть похоже на что-то типа E.Message (уточните в электронной справке).

On EDatabaseError do
begin
ShowMessage(’Не могу отправить данные’);
Edit1.setFocus;
end;