Страница 1 из 1

DBGridEh + onDataChange + TForm.Create = проблема.

Добавлено: 04 дек 2007, 00:18
S.H.S
П О М О Г И Т Е !!!
Есть DBGridEh, он привязан к DataSet через DataSource, у которого есть событие onDataChange:

Код: Выделить всё

procedure TFDM1.DtSrcCtrlODataChange(Sender: TObject; Field: TField);
begin
 if QrCtrlO.State = dsBrowse then
  FCtrl_O.DBGrdCtrlO.Hint:=QrCtrlOSERIAL_NUM.AsString;
end;
Динамически создаем форму с DBGridEh и в событии Create делаем DataSet.Active:=True;
И где то между этим Active и появлением грида вылазит это:
Access violation at addres... (я думаю все писать нет смысла).
Мои подозрения, что не успевает создатся DBGridEh, так как я пробовал DataSet.Active:=True поставить на нажатие кнопки после создания формы, то все OK.
Помогите, очень нужно, дело не в Hint, это я для примера.

Добавлено: 04 дек 2007, 07:20
mdfv
Все что делается визуально нужно не в OnCreate, а в OnShow засовывать тогда.

DataSet.Active:=True; можно в OnCreate засунуть, но предварительно убрав у него обработку событий, которую потом надо все равно присвоить в OnShow или в самой обработке отлавливать ошибки и разные состояния.

Добавлено: 04 дек 2007, 09:54
S.H.S
К сожалению, не так все просто.
Я пробовал ставить и в onShow и даже в onActivate, но ошибка таже.
Пробовал и так:

Код: Выделить всё

 DataSet.DisableControls;
 try
  DataSet.Active:=True;
 finally
  DataSet.EnableControls;
 end;
Но все без изменений.

Добавлено: 04 дек 2007, 11:45
Dimitry Sibiryakov
А отладчик это AV ловит? Смотрите Call Stack.

Добавлено: 05 дек 2007, 01:14
S.H.S
Я просмотрел Call Stack, а так же прогнал через чудодейственную программу-компонент EurekaLog. Я знаю, что вызывает исключение, но это мне никак не помогло :(.
На вершине стека, естественно, моя функция:
FCtrl_O.DBGrdCtrlO.Hint:=QrCtrlOSERIAL_NUM.AsString;
Далее идет:
inherited DataEvent(Event,Info) (это DB.pas); из процедуры procedure TFIBCustomDataSet.DataEvent(Event: TDataEvent; Info: Longint); (это FIBDataSet)
Вот.

Добавлено: 05 дек 2007, 01:54
CyberMax
S.H.S писал(а):Я знаю, что вызывает исключение, но это мне никак не помогло :(.
Судя по тому, что происходит AV, происходит обращение к несозданному компоненту. Что мешает найти этот компонент и сделать проверку его существования через Assigned()?

Добавлено: 05 дек 2007, 02:48
S.H.S
И снова, к сожалению. Я и это пробовал. Здесь ясно, что возможно еще не создан DBGridEh. Но Assigned выдает True.

Вот чтобы не быть голословным небольшой пример:
http://depositfiles.com/files/2596464
Прошу прощения, что на depositfiles, но ничего другово в голову не пришло.
В примере нужно только подставить свою (любую) базу и таблицу прописать в SelectSQL.

Добавлено: 05 дек 2007, 08:01
mdfv
Наверное еще всетаки не создан грид.

И вот какое решение.

Код: Выделить всё

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
if not form1.Visible then exit;

 if pFIBDataSet1.State = dsBrowse then
  form1.DBGridEh1.Hint:=pFIBDataSet1NUM.AsString;

end;
Или такое:

Код: Выделить всё

procedure TForm1.FormCreate(Sender: TObject);
begin
DBGridEh1:=nil;
pFIBDataSet1.Open;
end;

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
if DBGridEh1=nil then exit;

 if pFIBDataSet1.State = dsBrowse then
  form1.DBGridEh1.Hint:=pFIBDataSet1NUM.AsString;

end;

Добавлено: 05 дек 2007, 08:05
CyberMax
Оригинально:

Код: Выделить всё

procedure TForm3.Button1Click(Sender: TObject);
begin
 Form1:=TForm1.Create(nil);
 Form1.Show;
end;

Код: Выделить всё

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
 if pFIBDataSet1.State = dsBrowse then
  form1.DBGridEh1.Hint:=pFIBDataSet1NUM.AsString;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 pFIBDataSet1.Open;
end;
Присвоение Form1 произойдет только после создания формы, а ты при конструировании ссылаешься на Form1. Отсюда и AV.
Лечение:

Код: Выделить всё

 if pFIBDataSet1.State = dsBrowse then
  DBGridEh1.Hint:=pFIBDataSet1NUM.AsString;
И на будущее: не ссылайся на себя через переменную.

Добавлено: 05 дек 2007, 09:39
kdv
не удержался - нафига в FormCreate писать DataSet.Open?

Добавлено: 05 дек 2007, 11:48
S.H.S
Ну вот налетели. :) В трех строчках пять ошибок. :) :) :).
Я писал уже в полудреме. (2:48 am) Так что извиняйте за некоторый бред.
И на будущее: не ссылайся на себя через переменную.
Я ошибся, просто в оригинале датасеты стоят на датамодуле.
не удержался - нафига в FormCreate писать DataSet.Open?
Кстати, нет разницы для этой ошибке, что в onCreate что в OnShow.

Вот пример более точный:
http://depositfiles.com/files/2599551

Всё разобрался ВСЕМ СПАСИБО.

P.S. dsBrowse - это статус, как я думал раньше, срабатывает только при навигации по записям. А какая навигация без формы. Значит где-то в FIB или DB.pas не стоит DisableControls. (Не кидайте помидорами если я не прав :))

Добавлено: 05 дек 2007, 12:50
CyberMax
S.H.S писал(а):P.S. dsBrowse - это статус, как я думал раньше, срабатывает только при навигации по записям. А какая навигация без формы.
Легко. При Open/Close датасета, например :).
S.H.S писал(а):Значит где-то в FIB или DB.pas не стоит DisableControls. (Не кидайте помидорами если я не прав :))
Читать про DisableScrollEvents/EnableScrollEvents.

Добавлено: 05 дек 2007, 13:42
kdv
значит где-то в FIB или DB.pas не стоит DisableControls.
кому оно там надо? че-то у тебя с логикой...