Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Я никак не пойму в чем секрет, не работает DataSet


Страницы:   1 2

вова ©   (2014-01-04 18:46:00) 

Начинается все вот так:
destructor TObjectList.Destroy;
var
 i: integer;
begin
 FCount := 0;
 SetLength(fTObjectsList, 0);
 fTObjectsList := nil;

 with GlobalShot do
 begin
   if not suspended then
   begin
     WaitForSingleObject(GlobalShot.MyMutex, INFINITE);
     Terminate;
     ReleaseMutex(GlobalShot.MyMutex);
     // WaitFor;
   end;
   Free;
 end;

 if Length(fTObjectsList) > 0 then
   for i := 0 to Length(fTObjectsList) - 1 do
   begin
     with fTObjectsList[i] do
     begin
       if not suspended then
       begin
         Terminate;
         WaitFor;
       end;
       Free;
     end;
   end;

 FCapacityAlph := 0;
 FCountAlph    := 0;

 if Length(fTAlphabetsList) > 0 then
 for i := 0 to Length(fTAlphabetsList) - 1 do
 begin
     fTAlphabetsList[i].Free;
 end;
 inherited;
end;


И код успешно доходит до fTAlphabetsList[i].Free; и заходит внутрь. Причем объекты в fTAlphabetsList это класс выполняющийся в основном потоке. А деструкторы классов которые удаляются выше с DataSet не работают. Да и в процессе своей работы тоже.

и вот
destructor TTextRecognize.Destroy;
begin
 Form3.InsertNewSamplesInAlphabetSampleMassive(fName,fUnknownSymbols);
 ........
 inherited;
end;


мы вызываем процедуру которая работает с DataSet в деструкторе класса.

в этой процедуре есть всего 2 места где идет обращение к DataSet

Function TForm3.InsertNewSamplesInAlphabetSampleMassive(ObjectName: String;
 UnknownSymbolsArray: TSimpleSearchArray): boolean;
var
 BufX: TSimpleSearchArray;
 fSizeUS: integer;
 pStart, pStop, pBuff: pWord;
 m: word;
begin
   UniFindRecord('ClientDataSet1', 'Name', ObjectName)

...........................

     InsertNewSampleInDataSet3('KonturPicture', BufX) // вставляем
..........................
end;


Первая из них замечательно отрабатывает, на этот раз.
function TForm3.UniFindRecord(NameDataSet, ColName, ColValue: String): boolean;
Begin

 If (not(GetDataSetParametr(NameDataSet, ColName) = ColValue)) then
 begin
   If not TClientDataSet(FindComponent(NameDataSet))
     .Locate(ColName, ColValue, []) then
   begin
     if Debug then
       MessageDlg('Значение ' + ColValue + ' в колонке " ' + ColName +
         ' " не найдено, добавьте в базу данных запись с таким значением в этой колонке!',
         mtError, [mbOK], 0);
     result := false;
   end
   else
     result := true;
 end
 else
   result := true;
end;


а во второй, я пытаюсь вычислить новый индекс строки для новой записи
maxSimb := GetMax_ImIndexClientDataSet3();

Function TForm3.GetMax_ImIndexClientDataSet3(): integer;
var
 maxSimb: integer;
 ObjectName :string;
begin
 // Уникальность по всей базе
 GetMax_ImIndexClientDataSet3 := 0;
 maxSimb := 0;
 ObjectName := GetDataSetParametr('ClientDataSet1', 'Name');

 if ClientDataSet3.Filtered then
   ClientDataSet3.Filtered := false;

 //Form3.ClientDataSet1.DisableControls;
 //Form3.ClientDataSet3.DisableControls;
 Form3.ClientDataSet1.Last;
 While Not Form3.ClientDataSet1.Bof Do
 begin

   Form3.ClientDataSet3.First;
   While Not Form3.ClientDataSet3.Eof Do
   begin
     if ClientDataSet3.FieldByName('_ImIndex').value = Null then
     begin
       Form3.ClientDataSet3.Next;
       continue;
     end;

     if Form3.ClientDataSet3.FieldByName('_ImIndex').value > maxSimb then
       maxSimb := Form3.ClientDataSet3.FieldByName('_ImIndex').value;
     Form3.ClientDataSet3.Next;
   end;
   Form3.ClientDataSet1.Prior;
 end;
 //Form3.ClientDataSet3.EnableControls;
 //Form3.ClientDataSet1.EnableControls;

 ClientDataSet1.Locate('Name', ObjectName, []);

 //UniFindRecord('ClientDataSet1', 'Name', ObjectName);

 GetMax_ImIndexClientDataSet3 := maxSimb;
end;


т.к. обнаружилось, что почему-то фокус с элемента ClientDataSet1 слетает после этой процедуры, то я запоминаю имя на котором мы были до выполнения процедуры: ObjectName := GetDataSetParametr('ClientDataSet1', 'Name');

И пытаемся восстановить его после (первый вариант, упрощенный от второго, дает тот же результат)
ClientDataSet1.Locate('Name', ObjectName, []);
или UniFindRecord('ClientDataSet1', 'Name', ObjectName);

и получаем ошибку First chance exception at $004033F9. Exception class $C0000005 with message 'access violation at 0x004033f9: read of address 0x0000fffc'. Process ******.exe (5224)

зато если просто вызвать
procedure TForm3.Button4Click(Sender: TObject);
var
 BufX: TSimpleSearchArray;
begin
 SetLength(BufX, 5);

 UniFindRecord('ClientDataSet1', 'Name', 'LightGray');
 //Form3.GetMax_ImIndexClientDataSet3(); а можно и так вызвать тоже   работает.
 InsertNewSampleInDataSet3('KonturPicture', BufX);
 UniFindRecord('ClientDataSet1', 'Name', 'LightGray');
end;


то все пучком и все добавляется.....

че за фигня?
Причем если просто вызвать


вова   (2014-01-05 13:46:00) [21]

но он вообще ничего не делает с DataSet никогда.


вова   (2014-01-05 13:45:00) [22]

да и это, во всех экспериментах тот класс не запускался в отдельном потоке, т.е. все операции на самом деле в основном.

with GlobalShot do
begin
  if not suspended then
  begin
    WaitForSingleObject(GlobalShot.MyMutex, INFINITE);
    Terminate;
    ReleaseMutex(GlobalShot.MyMutex);
    // WaitFor;
  end;
  Free;
end;
ток этот в потоке


вова   (2014-01-05 13:15:00) [23]

ну вот.....грохнул ту часть которая создает тот массив что удаляется тут

if Length(fTObjectsList) > 0 then
  for i := 0 to Length(fTObjectsList) - 1 do
  begin
    with fTObjectsList[i] do
    begin
      if not suspended then
      begin
        Terminate;
        WaitFor;
      end;
      Free;
    end;
  end;


и ошибка пропала. Как блин так! ведь стоит же WaitFor; и когда мы заходим в третью часть второй уже нет вообще по идее, как она вообще влияет на дальше происходящее (


вова   (2014-01-05 12:30:00) [24]


> Странно как он, фокус, вообще там оказался)..
> TClientDataSet - это же невизуальный элемент, о каком "фокусе"
> можно при этом рассуждать ?)


эм....визуализируется он через грид. Но эт неважно, в нем есть функции поиска или перебора в цикле его значений и одна из строк активная же.

Впрочем я вообще коментарил эту процедуру, все равно DataSet заклинивает, просто позже где то )


вова   (2014-01-05 12:26:00) [25]

что где удаляется? элементы массива fTObjectsList удаляются?
нет, не удаляются.
потому что ещё выше по коду этот массив занулили, и все объекты просто потеряны.


это я уже исправил, это ничего не меняет. DataSet используется как база данных, из него берутся данные в начале, т.е. в конструкторах класса он используется и все. После того как классы созданы в дата сет они не лезут. И вот тут в единственном месте я попытался записать обратно новые данные......вот результат ( хоть свой дата сет пиши (


Сергей М.   (2014-01-05 12:25:00) [26]


> почему-то фокус с элемента ClientDataSet1 слетает


Странно как он, фокус, вообще там оказался)..
TClientDataSet - это же невизуальный элемент, о каком "фокусе" можно при этом рассуждать ?)


RWolf   (2014-01-05 04:15:00) [27]


> А деструкторы классов которые удаляются выше с DataSet не
> работают.

что где удаляется? элементы массива fTObjectsList удаляются?
нет, не удаляются.
потому что ещё выше по коду этот массив занулили, и все объекты просто потеряны.


вова   (2014-01-05 04:04:00) [28]

нет не сообщает. И в этом проблемы нет. Проблема в корявом Dataset я уже все исковырял ( причем даже добился того, что ошибка то вылазит то нет. Т.е. с нного вызова попытка обращения к датасету вызывает исключение и ппц. но если понаставить пауз, то ошибок становится меньше ) может с потоками какая то ботва твориться (

И это я уже тут тыщу лет Вова, так что ты не настоящий )


Настоящий Вова   (2014-01-05 01:53:00) [29]


> вова   (04.01.14 23:40) [3]
> > TObjectList — ведь есть уже класс в VCL с тем же именем,
> >  зачем эта путаница?
>
>
> кто ж знал что там есть.


А что, компилятор ничего не сообщает?


вова   (2014-01-04 23:40:00) [30]


> для начала, Replace in files: « Form3.» → « »


???


> TObjectList — ведь есть уже класс в VCL с тем же именем,
>  зачем эта путаница?


кто ж знал что там есть.


RWolf   (2014-01-04 22:17:00) [31]

для начала, Replace in files: « Form3.» → « »

TObjectList — ведь есть уже класс в VCL с тем же именем, зачем эта путаница?


вова   (2014-01-04 21:02:00) [32]

external exception 80000003

или так....


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо