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

Evgen2010
Дата: 13.05.2011 10:26:17
Вероятно, нужно экслюзивный доступ использовать.
Robertino
Дата: 13.05.2011 10:31:15
Gwa
В сообщении об ошибке явно говорится что указанная таблица занята.
Т.е. видимо где-то используется в программе, м.б. даже монопольно..
Ну а где Вы не отпустили её, ищите сами..
Фактически нигде, кроме цитированного фрагмента, таблица не использыется. Но именно затем, чтобы не нарываться, я и написал

        If NewDbf <> nil then begin
           if NewDbf.Active then begin
              NewDbf.Close;
              end;
           end;
Но при втором заходе NewDbf = nil, то есть не существует. И ошибка, мне кажется, не в NewDbf, а в Query...
Кроик Семён
Дата: 13.05.2011 10:33:39
Robertino,

По вопросу не скажу (хотя чувствую, что Evgen2010 прав),

но так люди дело говорят, плюнь на этот BDE и начинай все новые проекты делать с Advantage Database Server.
И этот проект переведи, надо же когда-нибудь начинать.

Я так понял, этот процесс может быть быстрым и безболезненным.

Вот хорошая страница:
Migrating from the BDE with Paradox to Advantage Database Server

На ней ссылка на видеоурок
From Paradox to Client/Server in 5 Minutes
Gwa
Дата: 13.05.2011 10:44:43
Robertino
Gwa
В сообщении об ошибке явно говорится что указанная таблица занята.
Т.е. видимо где-то используется в программе, м.б. даже монопольно..
Ну а где Вы не отпустили её, ищите сами..
Фактически нигде, кроме цитированного фрагмента, таблица не использыется. Но именно затем, чтобы не нарываться, я и написал

        If NewDbf <> nil then begin
           if NewDbf.Active then begin
              NewDbf.Close;
              end;
           end;
Но при втором заходе NewDbf = nil, то есть не существует. И ошибка, мне кажется, не в NewDbf, а в Query...

Похоже что проблема где-то в классе TwwTable..
А NewDbf вообще бывает не nil?
Если сразу после Create глянуть, например..
Ramin Hashimzade
Дата: 13.05.2011 10:54:46
Robertino
RENaissance
пропущено...

Ты в курсе, что BDE c 1998 года не развивается? Логично, что в современных реалиях оно, BDE, может работать некорректно и это никто не будет исправлять.
"Не развивается" - не значит "не работает". Среда у меня тоже не сегодняшняя, даже не Delphi 2010. И к чему ты про современные реалии? Есть локальная неточность, и я не понимаю ее причин. Которые не имеют никакого отношения ни к "современным реалиям", ни к развитию BDE. Которое, кстати, в некорректности работы в условиях Delphi 6 замечено не было.
Может, поконкретнее и в тему что-нибудь скажешь?

Спасибо.


не развивается значит плохо работает ....!!! опять таки: 10645341
Robertino
Дата: 13.05.2011 10:55:26
Gwa
Robertino
пропущено...
Фактически нигде, кроме цитированного фрагмента, таблица не использыется. Но именно затем, чтобы не нарываться, я и написал

        If NewDbf <> nil then begin
           if NewDbf.Active then begin
              NewDbf.Close;
              end;
           end;
Но при втором заходе NewDbf = nil, то есть не существует. И ошибка, мне кажется, не в NewDbf, а в Query...

Похоже что проблема где-то в классе TwwTable..
А NewDbf вообще бывает не nil?
Если сразу после Create глянуть, например..
Значится, так... Приложение извлекает из реестра набор ключей по определенному признаку и помещает их в динамическую таблицу DBF, которая выводится в грид.
Вот полностью ветка в процедуре, где живет таблица NewDbf. Здесь она создается, потом снова создается (если попросят), здесь же помирает.
Может быть, это нам поможет?
//***********************
        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;
        NewDbf.Open;

        Rss := TStringList.Create;
        reg := TRegistry.Create;
        reg.RootKey := HKEY_CURRENT_USER;
        iCount := 0;

        if ( reg.OpenKeyReadOnly('SoftWare\Ingit\MapGPS\MapGPS\MapRouteTool') ) then
        begin
          If reg.GetKeyInfo(Rg) then begin
                 reg.GetValueNames(Rss);
                 Rss.Sorted := True;
                 iSubL := 0;
                 IsSubL := False;
                 For Rgi := 0 to Rss.Count - 1 do begin
                    If AnsiContainsText(Rss.Strings[Rgi],'info') and (not IsSubL) then begin
                       iSubL := Rgi;
                       IsSubL := True;
                       end;
                    If RightStr(Rss.Strings[Rgi],5) = 'count' then begin
                       Cnt := reg.ReadInteger(Rss.Strings[Rgi]);
                       //Rgi - 1;
                       Break;
                       iCount := iCount;
                       end;
                    end;

                 For Rgi := iSubL to iSubL+3*Cnt-1 do begin
                    Inc(iCount);
                    PropStr := reg.ReadString(Rss.Strings[Rgi]);
                    PropStr := PropStr;
                    If AnsiPos('type',Rss.Strings[Rgi]) <> 0 then begin
                       Q_CutLeft(PropStr,2);
                       LONHEX := ExtractWord(1,PropStr,[' ']);
                       LATHEX := ExtractWord(2,PropStr,[' ']);
                       PropStr := PropStr;
                       end;
                    If AnsiPos('name',Rss.Strings[Rgi]) <> 0 then begin
                       SPISOK := reg.ReadString(Rss.Strings[Rgi]);
                       end;
                    If Rgi mod 3 = 0 then begin
                       NewDbf.Append;
                       NewDbf.FieldbyName('NOM').AsInteger := NewDbf.RecordCount+1;
                       NewDbf.FieldbyName('SPISOK').AsString := SPISOK;
                       NewDbf.FieldbyName('LONHEX').AsString := LONHEX;
                       NewDbf.FieldbyName('LATHEX').AsString := LATHEX;
                       NewDbf.Post;
                       end;
                    end;
          wwDBGrid1.Visible := True;
          wwQuery1.Close;
//***********************
Gwa
Дата: 13.05.2011 11:04:24
Robertino,
неужели Вы создаёте Dbf только для того что отобразить информацию в грид?
Мне кажется это лишнее.
Возмите другой грид (StringGrid, например) и прямо из реестра отобразите всё что нужно..
Drunken Dolphin
Дата: 13.05.2011 11:04:45
Robertino
Здесь она создается, потом снова создается (если попросят), здесь же помирает.


и где она тут помирает?
Gwa
Дата: 13.05.2011 11:08:13
Да, кстати, при помирании разве не нужно сделать что-то типа Free ?
Gwa
Дата: 13.05.2011 11:10:04
Мне кажется Вы просто теряете ссылку на NewDbf,
но она при этом не уничтожается..