![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Я никак не пойму в чем секрет, не работает DataSet
вова © (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
или так....