Прошу помощи. Полые непонятки с поведением

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Прошу помощи. Полые непонятки с поведением

Сообщение bestonix » 23.11.2010 21:41:13

На главной форме есть несколько закладок, которые разделены по функционалу. В зависимости от прав пользователя ему "показываются" закладки. И в этой же зависимости происходит загрузка данными. Каждой закладке соответствует свой модуль в котором "зашит" весь функционал. Так вот, в таком отдельном модуле идет инициализация компонентов TDateEdit данными из БД. Если просто просматривать полученные данные дат, например через ShowMessage то все нормально. А если сразу присваивать компонентам на главной форме происходит ошибка гласящая о том, что источник данных закрыт. В чем проблема вобче не могу понять. Имею Lazarus 0.9.29, FPC 2.4.1.Вот процедура которая вызывает ошибку.
Код: Выделить всё
procedure LoadTraining();
var d1, d2 : TDateTime;
    idx : integer;
begin
   DM.ibQExec.Close(); DM.ibQExec.SQL.Clear();
   DM.ibQExec.SQL.Add('select * from sch_training');
   DM.ibQExec.SQL.Add('order by id');
   DM.ibQExec.Open();
   while (not DM.ibQExec.Eof) do begin
     d1  := DM.ibQExec.Fields.ByNameAsDate['date_begin'];
     d2  := DM.ibQExec.Fields.ByNameAsDate['date_end'];
     idx := DM.ibQExec.Fields.ByNameAsInteger['id'];
     //ShowMessage(DateToStr(d1));
     //ShowMessage(DateToStr(d2));

     case (idx) of
   1 : begin FMain.DateEdit3.Date  := d1;//DM.ibQExec.Fields.ByNameAsDateTime['date_begin'];
        FMain.DateEdit4.Date  := d2;//DM.ibQExec.Fields.ByNameAsDateTime['date_end'];
            end;
   2 : begin FMain.DateEdit5.Date  := d1;//DM.ibQExec.Fields.ByNameAsDateTime['date_begin'];
             FMain.DateEdit6.Date  := d2;//DM.ibQExec.Fields.ByNameAsDateTime['date_end'];
            end;
   3 : begin FMain.DateEdit13.Date := d1;//DM.ibQExec.Fields.ByNameAsDateTime['date_begin'];
             FMain.DateEdit14.Date := d2;//DM.ibQExec.Fields.ByNameAsDateTime['date_end'];
            end;
   4 : begin FMain.DateEdit15.Date := d1;//DM.ibQExec.Fields.ByNameAsDateTime['date_begin'];
             FMain.DateEdit16.Date := d2;//DM.ibQExec.Fields.ByNameAsDateTime['date_end'];
            end;
   5 : begin FMain.DateEdit25.Date := d1;//DM.ibQExec.Fields.ByNameAsDateTime['date_begin'];
        FMain.DateEdit26.Date := d2;//DM.ibQExec.Fields.ByNameAsDateTime['date_end'];
            end;
   6 : begin FMain.DateEdit27.Date := d1;//DM.ibQExec.Fields.ByNameAsDateTime['date_begin'];
        FMain.DateEdit28.Date := d2;//DM.ibQExec.Fields.ByNameAsDateTime['date_end'];
            end;
   7 : begin FMain.DateEdit29.Date := d1;//DM.ibQExec.Fields.ByNameAsDateTime['date_begin'];
        FMain.DateEdit30.Date := d2;//DM.ibQExec.Fields.ByNameAsDateTime['date_end'];
            end;
   8 : begin FMain.DateEdit17.Date := d1;//DM.ibQExec.Fields.ByNameAsDateTime['date_begin'];
        FMain.DateEdit18.Date := d2;//DM.ibQExec.Fields.ByNameAsDateTime['date_end'];
            end;
   9 : begin FMain.DateEdit19.Date := d1;//DM.ibQExec.Fields.ByNameAsDateTime['date_begin'];
        FMain.DateEdit20.Date := d2;//DM.ibQExec.Fields.ByNameAsDateTime['date_end'];
       end;
     end;
     DM.ibQExec.Next();
   end;
end;


Если писать вот так, то ошибка вылетает на строке FMain.DateEdit4.Date :=......
case (idx) of
1 : begin FMain.DateEdit3.Date := DM.ibQExec.Fields.ByNameAsDateTime['date_begin'];
FMain.DateEdit4.Date := DM.ibQExec.Fields.ByNameAsDateTime['date_end'];
А если оставить как есть, то сообщение вылетает на DM.ibQExec.Next();

Еще раз повторюсь, что сообщение гласит о том что источник данных закрыт :shock:
bestonix
новенький
 
Сообщения: 66
Зарегистрирован: 15.04.2010 08:26:00
Откуда: Жигулёвск

Re: Прошу помощи. Полые непонятки с поведением

Сообщение stikriz » 23.11.2010 21:55:21

bestonix писал(а):d1 := DM.ibQExec.Fields.ByNameAsDate['date_begin'];


Что-то совсем какое-то новое слово в датсетах...
Это компилиться вообще?

Код: Выделить всё
DM.ibQExec.FieldByName('date_begin').AsDate;


Добавлено спустя 5 минут 47 секунд:
Код: Выделить всё
DM.ibQExec.Fields.FieldByName('date_begin').AsDate
DM.ibQExec.Fields[IndexField].AsDate
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

Re: Прошу помощи. Полые непонятки с поведением

Сообщение bestonix » 23.11.2010 22:01:15

Если бы не компилилось я бы заметил.
Интересно узнать, а что тут нового ?
Буду признателен если поправишь.

Добавлено спустя 10 минут 23 секунды:
Использую UIB-компоненты. У них вроде нет свойства FieldByName.
Хотя допустим даже есть, в чем принципиальная разница ?
bestonix
новенький
 
Сообщения: 66
Зарегистрирован: 15.04.2010 08:26:00
Откуда: Жигулёвск

Re: Прошу помощи. Полые непонятки с поведением

Сообщение stikriz » 23.11.2010 22:35:55

C UIB никогда не работал...

Мне кажется, что вот этот DM, как раз и виноват. Закоментруйте в модуле с DM переменную DM - что в датамодуле.
Вы где-то её инициализируете или оно само создается автоматом?
Видимо, у Вас их несколько.
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

Re: Прошу помощи. Полые непонятки с поведением

Сообщение alexs » 23.11.2010 22:59:17

bestonix
Визуально всё вроде нормально. Подозрение - что ошибка где то в другом месте.

stikriz
В UIB-ах именно так обращение к полям идёт. Это не наследник от TDataSet - а.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Прошу помощи. Полые непонятки с поведением

Сообщение bestonix » 24.11.2010 08:55:41

stikriz писал(а):Мне кажется, что вот этот DM, как раз и виноват. Закоментруйте в модуле с DM переменную DM - что в датамодуле.
Вы где-то её инициализируете или оно само создается автоматом?
Видимо, у Вас их несколько.


Невозможно, DM - это TDataModule. Все компоненты которые необходимы для работы с БД складывал всегда таким образом.

TDM = class(TDataModule)
ibSchool: TUIBDataBase;
ibTrans: TUIBTransaction;
ibQExec: TUIBQuery;
ibTestIns: TUIBQuery;
procedure DataModuleCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;

var
DM: TDM;

Добавлено спустя 6 минут 34 секунды:
alexs писал(а):Визуально всё вроде нормально. Подозрение - что ошибка где то в другом месте.


Алекс вы гений. С утра на свежую голову прочел сообщение и сразу понял где собака порылась.
У меня же на событии OnChange висит процедура, которая после всего Commit'ит изменения в БД.
А после коммита датасэт почему-то всегда закрывается. Ща подправлю и все будет пучком.

Большое спасибо всем !!! Удачи коллеги
bestonix
новенький
 
Сообщения: 66
Зарегистрирован: 15.04.2010 08:26:00
Откуда: Жигулёвск

Re: Прошу помощи. Полые непонятки с поведением

Сообщение alexs » 24.11.2010 09:19:13

bestonix писал(а):А после коммита датасэт почему-то всегда закрывается. Ща подправлю и все будет пучком.

Чтобы не закрывалась - есть CommitRetain
Но птица его не очень любит. Надо с ним осторожно. Чтобы не порождать вечно живущие транзакции.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27

Рейтинг@Mail.ru