Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2009, 23:14   #1
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию Ошибка чтения из памяти

В общем есть код добавления или редактирования названия программы:
Код:
procedure TDorRForm.OkButClick(Sender: TObject);
var
i,i1,IDP:Integer;
p:Boolean;
begin
if NazEdit.Text<>'' then
 begin
  {-- Поиск дубликата --}
  p:=False;

  i1:=ProgForm.ProgCB.Items.Count-1;
  for i:=0 to i1 do
   if ProgForm.ProgCB.Items.Strings[i]=NazEdit.Text then
    p:=True;

  if p=False then //Дубль не найден
   begin
    If DORF=False then //Если происходит добавление
     begin
      with DMFE.QFPF1 do
       begin
        DMFE.QEx(DMFE.QFPF1,'select ID_Proga from Prog.db',False);
        if ProgForm.ProgCB.Items.Count>0 then//Определение будущего ИД проги
         begin
          Last;
          IDP:=FieldByName('ID_Proga').AsInteger+1;
         end
        else
         IDP:=1;
        Close;
        SQL.Clear;
        SQL.Add('insert into Prog.db (ID_Proga,Nazvanie) values (:IDP, :Naz)');
        Params.ParseSQL(SQL.Text,true);
        ParamByName('IDP').AsInteger:=IDP;//ID_Prog
        ParamByName('Naz').AsString:=NazEdit.Text;//Название
        ExecSQL;
        ProgForm.ProgCB.Items.Add(Edit1.Text);
       end;
     end
    else //Если происходит редактирование
     begin
      with DMFE.QFPF1 do
       begin
        Close;
        SQL.Clear;
        SQL.Add('update Prog.db Nazvanie=:Naz where Nazvanie="'+ProgForm.ProgCB.Text+'"');
        Params.ParseSQL(SQL.Text,true);
        ParamByName('Naz').AsString:=NazEdit.Text;//Название
        ExecSQL;
       end;
     end;
    Close;//Закрыть
   end
  else //Если найден дубль
   begin
    ShowMessage('Данное наименование уже пресутствует');
   end;
 end
else //Если введено пустое наименование
 ShowMessage('Введите наименование программы!');
end;
Ошибка чтения из памяти возникает на строчке
Код:
for i:=0 to i1 do
Из-за чего может это быть и как решить проблему. За ранее благодарен за помощь.
Так же буду рад комментариям по оптимизации данного кода
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 01.11.2009, 23:55   #2
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Попробуйте пошагово и посмотрите все ли инициировано в строке
Код:
i1:=ProgForm.ProgCB.Items.Count-1;
Возможно AV именно в ней происходит а отладчик останавливается после нее.
s.Creator вне форума Ответить с цитированием
Старый 02.11.2009, 00:05   #3
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Попробывал пошагово, ошибка вылезла на строчке где указали вы, попытался обойтись без этой переменой и в цикле сразу обратится к параметру:
Код:
for i:=0 to ProgForm.ProgCB.Items.Count-1 do
Та же ошибка чтения из памяти.

Видемо что-то с параметром, но никак не пойму, что именно.
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 02.11.2009, 00:40   #4
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
По умолчанию

а что такое ProgForm.ProgCB ?? я так понимаю этот компонент расположен на другой фрме.. может быть в момент обращения эта форма не существует.. или просто компонент должен создаваться динамически.. и в момент обращения он еще не создался.. от тебе и ошибка..
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
Ntlegend вне форума Ответить с цитированием
Старый 02.11.2009, 00:41   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Смотрите.
Вы объявили переменную.
Если вы в шаге посмотрите ее начальное значение - там будет черт знает что...
Так что перед первым ее использованием вы ее определите, например:
i:=0;
Вы уверены, что ваши переменные (те, которые используются "сходу"), заданы?

Последний раз редактировалось mihali4; 03.11.2009 в 12:38.
mihali4 вне форума Ответить с цитированием
Старый 02.11.2009, 10:19   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Первое:
Код:
{-- Поиск дубликата --}
  if ProgForm.ProgCB.Items.IndexOf(NazEdit.Text)<>-1 then //Дубль не найден
Второе:
Я бы не пользоват Params. А сразу создавал запрос в строку.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.11.2009, 14:22   #7
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Цитата:
а что такое ProgForm.ProgCB ?? я так понимаю этот компонент расположен на другой фрме.. может быть в момент обращения эта форма не существует.. или просто компонент должен создаваться динамически.. и в момент обращения он еще не создался.. от тебе и ошибка
Это комбобокс который находится на другой форме. Форма существует и созданна динамически, так как является МДИ детем. Все компоненты созданны и находятся в рабочем состоянии.

Цитата:
Смотрите.
Вы объявили переменнную.
Если вы в шаге посмотрите ее начальное значение - там будет черт знает что...
Так что перед первым ее использованием вы ее определите, например:
i:=0;
Вы уверены, что ваши переменные (те, которые используются "сходу"), заданы?
Не уверен, проверю.

Код:
Первое:

Код:

{-- Поиск дубликата --}
  if ProgForm.ProgCB.Items.IndexOf(NazEdit.Text)<>-1 then //Дубль не найден
Второе:
Я бы не пользоват Params. А сразу создавал запрос в строку.
1. Если я правильно понял данной стракой,я буду вставлять текст в комбик и если его там нет он индекс выставит -1, а если есть то даст уже существующий индекс? То есть не надо будет в цикле все перебирать?
2. Параметры чисто для моего удобства. Вопрос по ним. Они замедляют работу? Или как то влияет на скорость работы проги?
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 02.11.2009, 15:11   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
То есть не надо будет в цикле все перебирать?
Нет.
Цитата:
Вопрос по ним. Они замедляют работу? Или как то влияет на скорость работы проги?
Ну как сказать... Это скорее уменьшает код программы (исходника)...
Хотя... в общем однозначно это дело вкуса.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.11.2009, 16:37   #9
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
По умолчанию

Код:
  i1:=ProgForm.ProgCB.Items.Count-1;
  for i:=0 to i1 do
   if ProgForm.ProgCB.Items.Strings[i]=NazEdit.Text then
    p:=True;
наскока я понял - это конд поиска вхождения подстроки NazEdit.Text в текст ProgForm.ProgCB.Items.Text.. результат поиска - это тока флаг.. истина/ложь.. значение i нам не важно.. значит можна заменить на такое

Код:
p:=(Pos(NazEdit.Text, ProgForm.ProgCB.Items.Text)>0);
если ошибка происходила именно на этих строках - то закоментируй все остальное (а данной процедуре).. и добейся чтобы небыло ошибки в этом.. (т.е. отследи пошагово чо за чем делается и куда обращается перед тем как выскочит эта ошибка..)

Цитата:
Форма существует и созданна динамически, так как является МДИ детем
а эта форма всегда существует от начала приложения до конца?? или она закрывается по какому либо событию..
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
Ntlegend вне форума Ответить с цитированием
Старый 02.11.2009, 19:40   #10
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Ничего не помогло, все ошибки при обращении к форме ProgForm.
данная форма типа MDIChild, создается она диномически по следующей процедуре:
Код:
procedure TMainForm.CreateChildForm
        (const childName : string;a:integer);
var
ProgForm,EIForm: TForm;
begin
Case a of
 0:
  begin
   EIForm := TEIForm.Create(Application);
   EIForm.Caption := childName;
  end;
 1:
  begin
   If PF=False then
    begin
     ProgForm := TProgForm.Create(Application);
     PF:=True;
     ProgForm.Caption := childName;
    end;
  end;
end;
end;
Во время запуска процедуры описанной выше, данная форма существует, уже создана.
Шипулин А. В.

Последний раз редактировалось Шульц; 02.11.2009 в 19:57.
Шульц вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка чтения файла Umnik1 Общие вопросы Delphi 12 25.06.2013 22:57
Ошибка обращения к памяти Zeraim Общие вопросы Delphi 7 01.12.2008 17:08
ошибка чтения KiSH333 БД в Delphi 12 22.08.2008 11:09
ошибка памяти. UMmi Общие вопросы Delphi 3 23.11.2006 07:06