Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Access violation at address...


Автор: igmyrj 21.3.2006, 19:28
Итак, у меня есть форма на которой есть ListBox, 2 кнопки (добавить и удалить) и 2 edit'а.
Мне надо, что бы при нажатии на кнопку Добавить в ListBox'е появлялось новое поле с именем из 1-го edit'а и запоминалось значение 2-го edit'а. Когда в ListBox'е пользователь выбирает какую-нибудь запись в этих 2-ух полях высвечивается её имя и запомненное значение 2-го edit'а. Вот код для кнопки Добавить:
Код

procedure TForm5.AddClick(Sender: TObject);
var
  l, i: integer;
begin
  if MyName.Text<>'' then
  begin
    ListBox1.Items.Add(Name.Text);
    if Myitems<>nil then
    begin
      l:= high(Myitems)+1;
      SetLength (Myitems, l);
      Myitems[l].name:=Name.Text;
      Myitems[l].neuron:=strtoint(Neuron.Text);
      for i:=0 to 100 do
      begin
        Myitems[l].paint[i]:=painted[i];
      end;
    end
    else
    SetLength (Myitems, 1);
    Myitems[0].name:=Name.Text;
    Myitems[0].neuron:=strtoint(Neuron.Text);
  end;

end;

Вот это происходит при клике на ListBox:
Код

procedure TForm5.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i: integer;
begin
  if ListBox1.ItemIndex>=0 then
  begin

    MyName.Text:=items[ListBox1.ItemIndex].name;
    MyNeuron.Text:=inttostr(items[ListBox1.ItemIndex].Neuron);
    MyName.Refresh;
    MyNeuron.Refresh;
    for i:=0 to 100 do
    begin
      painted[i]:=Myitems[ListBox1.ItemIndex].paint[i];
    end;
    PaintBox1.Refresh;
  end;
end;

Там еще есть PaintBox, но это не существенно, проблема не в нем.
А проблема вот в чем. Если у меня в ListBox'е больше 2-ух полей, то при нажатии на них (кроме как на первые два) выскакивает сообщение:"Access violation at address...и т.д" Как с этим бороться не подскажете?
И еще одна проблема. Он вообще как-то коряво выводит в edit'ы данные о выбраной записи. То не выводит вообще, то выводит только о последней...

P.S Я наверное плохо описал=) так что спрашивайте если что=)

Автор: Демо 21.3.2006, 19:33
Для начала убери из названий переменных, структур зарезервированные слова - Name, Items, чтобы можно было хотя бы видеть, где у тебя объекты, а где твои переменные.

Автор: igmyrj 21.3.2006, 20:33
Отредактировал

Автор: Демо 22.3.2006, 01:18
1. Сразу же вопрос:
В первом примере кода в else у тебя только одна строка должна выполняться или все три?
Если три, тогда код нужно изменить так:
Код

    else    
    begin
      SetLength (Myitems, 1);    
      Myitems[0].name:=Name.Text;    
      Myitems[0].neuron:=strtoint(Neuron.Text);
    end;


2. Что за тип MyItems? Под него ты не выделяешь память. Это так и нужно? Если это динамический массив, то зачем проверка
Код

 if Myitems<>nil then
?

3. Ты не сказал, что в сообщении об Exception сказано.
4. Пройди отладчиком и посмотри, на какой строке возникает исключение.

Автор: igmyrj 22.3.2006, 20:00
Спасибо, с этим вопросом я уже справился. Но теперь возникла другая проблема на ту же тему.
Форма та же самая только 2-го Edit'а нет. В общем все то же самое...
Вот код для кнопки Добавить:
Код

  Neuronet:=TNeuronet.Create;
  if Name.Text='' then Name.Text:='unnamed';
  ListBox1.Items.Add(Name.Text);
  SetLength (NeuroNet.Neurons, length(NeuroNet.neurons)+1);
  NeuroNet.Neurons[ListBox1.count]:=TNeuron.Create;
  NeuroNet.Neurons[ListBox1.count].name:=Name.Text;

Вот что происходит при клике на Лист Бокс:
Код

 Name.Text:=NeuroNet.neurons[ListBox1.ItemIndex].name;

При исполнении этой процедуры (клик) выскакивает сообщение "Access violation...". Я не знаю, что с этим делать, не подскажете?

Автор: igmyrj 22.3.2006, 21:57
Ладно, уже все=) Каким то образом заработало, хотя я вроде ничего и не менял smile

Автор: Dian 23.3.2006, 03:51
Код

l:= high(Myitems)+1;
SetLength (Myitems, l);

Здесь была проблема. High - на 1 меньше длины массива. В SetLength длина не меняется, поэтому Myitems[l] выходит за границу.

Автор: igmyrj 23.3.2006, 12:28
Ага! Спасибо! Теперь понятно!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)