Ошибка при втором проходе

Robertino
Дата: 14.05.2011 09:57:27
Robertino
andreymx
Robertino,

судя по коду, ты какой-то справочник (район, корпус и т.д.) хранишь в реестре
это так?
Да, списки адресов с компьютерной карты.
Только не я храню. Компьютерная карта хранит, а я использую :)
Jude
Дата: 14.05.2011 12:31:59
Robertino,

   NewDbf := TwwTable.Create(Self);
не берусь говорить, что 100% но думаю будет 60%, происходит так:
1) на первом проходе вы создаете объект TwwTable и ссылку на него кладете в NewDbf.
2) делаете всякие связи с этим объектом и т.д. НО НЕ УБИРАЕТЕ ПО ОКОНЧАНИИ РАБОТЫ
3) при "ВТОРОМ ПРОХОДЕ" - у вас объект, со всем к нему подвязанным все еще висит в памяти. доходите до указанной строки.
4) СОЗДАЕТЕ НОВЫЙ ОБЪЕКТ TwwTable (при этом старый со всем багажем лежит в памяти как и был, возможно поджимает под себя табличку, с которой вы хотите работать или еще чего-то, из приведенного мне сложно понять), и ссылку на этот НОВЫЙ объект кладете в NewDbf.
5) начинаете действия, которые вы делали с другими объектами до этого и получается что что-то уже занято или др. некорректная работа.
6) при "закрытии"(destroy) т.к. объект создавался "Self" = вот тут система и подчищает то, что было понасозданно, убивая все "дочерние" объекты.

как обычно делаю я в таких случаях.

1) пробую запросы в plsql (у меня оракл в основном). - убеждаюсь что с запросом все в порядке.
2) создаю отдельный проект, форму,кнопку и пытаюсь сделать действия, в начале только цикл/проход, оставив минимум компонент/связей и т.д. добиваюсь работоспособности на минимальном количестве инструкций.
3) постепено наращиваю количество строк, внимательно смотрю работоспособность.
4) использую Task Monitor - если с каждым "оборотом" память под мое приложение-тест растет - где-то "дыра" с утечкой памяти.

5) когда с тестом - нормально, а с приложением, в котором поправленны замеченные в тесте ошибки, все тяжко, ставлю доп проверки типа :
   if NewDbf = nil then ... 
  else if NewDbf.classname = 'TwwTable' then ...;
   ...
  if TwwTable(NewDbf).чего_то_еще = ...
и так далее.
т.е. уже смотрю в трассировке все, что могу придумать.
если находится что-то что работает не так, как я понимаю, должно - читаю хелп/интернет по этому компоненту/классу/методу.

если мой предидущий совет вы применили - просьба сообщите, что получилось (код + результат). Интересно.
Robertino
Дата: 16.05.2011 09:44:44
Уважемый Jude,
к сожалению, просто освобождать NewDbf -
FreAndNil(NewDbf);
- не дало результата.
Но выход я нашел.
Добавил на форму новую таблицу, а после всех операций с динамической NewDbf присваивал ее статической таблице, из которой и выводил данные в грид.
В коде это выглядит так.
        wwTable1.Close;
        SavedMrsh := SaveDialog2.FileName;
        If NewDbf <> nil then begin
           if NewDbf.Active then begin
              NewDbf.Close;
              end;
           end;
        wwQuery1.Close;
        wwQuery1.SQL.Clear;
        wwQuery1.SQL.Text := 'Drop TABLE "' + SavedMrsh + '"';
        wwQuery1.ExecSQL;
        NewDbf := TwwTable.Create(Self);

        wwQuery1.SQL.Clear;
        wwQuery1.SQL.Text := ' Create Table "' + SavedMrsh + '"' +
            ' (NOM Numeric(6),' +
            ' SPISOK CHAR(61),' +
            ' RAION CHAR(37),' +
            ' LON NUMERIC(10),' +
            ' LONHEX CHAR(8),' +
            ' LAT NUMERIC(10),' +
            ' LATHEX CHAR(8),' +
            ' NOMER CHAR(6),' +
            ' KORPUS CHAR(6))';
        wwQuery1.ExecSQL;

        wwQuery1.SQL.Clear;
        wwQuery1.SQL.Text := ' Create Index NOM on "' + ExtractFileName(SavedMrsh) + '" (NOM)';
        wwQuery1.ExecSQL;
        wwQuery1.SQL.Text := ' Create Index SPISOK on "' + ExtractFileName(SavedMrsh) + '" (SPISOK)';
        wwQuery1.ExecSQL;
        wwQuery1.SQL.Text := ' Create Index LON on "' + ExtractFileName(SavedMrsh) + '" (LON)';
        wwQuery1.ExecSQL;
        NewDbf.TableName := SavedMrsh;
        wwDataSource2.DataSet := NewDbf;
        wwTable1 := NewDbf;
        wwTable1.Open;
И обновляю грид сколько угодно раз.

Спасибо за помощь.
С уважением.