Подскажите где ошибка

  • Автор темы RuSeL
  • Дата начала
R

RuSeL

Код:
procedure TForm1.N3Click(Sender: TObject);
var
maps: string;
id: Integer;
i, n, a: integer;
Tag:Integer;
Name: string;
begin
id:=Image.ComponentIndex;
Name:='';
n:=(id-53);
for i:=id downto 53 do
for a:=1 to n do
if id>53 then
begin
Name:=Image.Components[id].Name;
Tag:=Image.Components[id].Tag;
Memo1.Visible:=true;
Form1.Memo1.Lines[a-1]:=Name;
Form1.Memo1.Lines[a-1]:=IntToStr(Tag);
end;
SaveDialog1.FileName := maps;
if SaveDialog1.Execute then
begin
maps:= SaveDialog1.FileName;
Memo1.Lines.SaveToFile(maps+'.maps');
end;
end;
На стадии компилирования нету никаких сообщений. Однако, при вызове функции из скомпилированной программы, выдаёт сообщение об ошибке вида:
 

Вложения

  • 1.bmp
    225,3 КБ · Просмотры: 569
E

etc

код - ужас. да и с логикой тоже плохо все :)
тут даже трудно понять что делается

где падает?
 
R

RuSeL

Не понял данного вопроса...
p.s. Чтобы можно было разобраться, что делается, добавил комментарии в код. Правда, его немного изменил, однако осталась таже ошибка.
Код:
procedure TForm1.N3Click(Sender: TObject);
var
maps: string;
id: Integer;
i, a, n: integer;
Tag:Integer;
begin
id:=Image.ComponentIndex; //перемонной id присваиваем индекс последнего созданного Image, первый создаваемый Image имеет индекс 54
n:=(id-53); //вычисляем количество строк необходимое для записи свойств всех Image
for i:=id downto 54 do //устанавливаем счётчик для обработки каждого созданного Image
begin
Tag:=Image.Components[id].Tag; //переменной Tag присваиваем значение свойства Tag обрабатываемого в данный момент Image
for a:=0 to n do //устанавливаем счётчик строк
Form1.Memo1.Lines[a+1]:=IntToStr(Tag); //помещаем данные в Memo
end;
SaveDialog1.FileName := maps;
if SaveDialog1.Execute then			 //выполняем сохранение в файл из Memo
begin
maps:= SaveDialog1.FileName;
Memo1.Lines.SaveToFile(maps+'.maps');
end;
end;
 
Y

Yason

<offtop>Отличный пример того, как мало помогают комментарии в неаккуратном коде...</offtop>

Проблема наверняка в том, что в Memo1 строки сначала нужно добавлять, записывать их сразу напрямую нельзя.
Код:
Memo1.Lines.Add(IntToStr(Tag)); //помещаем данные в Memo
P.S. Ещё переменная maps неинициализирована, и "SaveDialog1.FileName := maps" не имеет смысла.
P.P.S. Внутренний цикл записывает один и тот же Tag аж n раз подряд -- так задумано?
 
R

RuSeL

<offtop>Я новичёк, поэтому код очень далёк от идеального</offtop>

После небольшого изменения кода старая ошибка пропала, однако появилась новая...
Код:
procedure TForm1.N3Click(Sender: TObject);
var
maps: string;
id: Integer;
i: integer;
Tag:Integer;
begin
id:=Image.ComponentIndex;
for i:=id downto 54 do
begin
Tag:=Image.Components[id].Tag;
Memo1.Lines.Add(IntToStr(Tag));
end;
if SaveDialog1.Execute then
begin
maps:= SaveDialog1.FileName;
Memo1.Lines.SaveToFile(maps+'.maps');
end;
end;
 

Вложения

  • 1.bmp
    209,3 КБ · Просмотры: 210
P

pand2019

во-первых учи английский, там в ошибке указана стока где ошибка.
во вторых вам не рассказывали про "дебаг"?
перед компиляцией ставишь рядом с кодом слева красную точку после места предполагаемой ошибки, а курсор ставь несколько выше.
а компилить надо не с помощью F9 а F4 это запускает пошаговый режим, в нем можно смотерь в какой момент происходит ошибка и смотреть какие значения у переменных, а шагать с помощью F7.
попробуй сам разобраться, так лучше приходит понимание, а код очень не читабелен.
что ты хочешь вообще сделать, так было бы легче.
 
R

RuSeL

Я пытаюсь написать процедуру для сохранения в файл свойств всех созданных пользователем image, чтобы потом можно было их загрузить.
P.S. Tag:=Image.Components[id].Tag; - это команда присваивает переменной Tag значение свойства Tag рисунка с индексом id или я ошибаюсь?
 
Y

Yason

первый создаваемый Image имеет индекс 54
Стало быть, на форме уже созданы 54 картинки, и вы добавляете новые во время исполнения программы?
Сообщение об ошибке говорит, что это не так...
Присоединяюсь к совету познакомиться поближе с дебаггером :(
 
R

RuSeL

На форме создана 1 картинка изначально, новые добавляются во время исполнения программы. Однако, с помощью Label1.Caption:=IntToStr(Image.ComponentIndex) я увидел, что первая добавляемая картинка имеет index 54.
Дебаггер показывает, что ошибка в строке Tag:=Image.Components[id].Tag;. Но я не понимаю, в чём здесь она...
 
E

etc

Я пытаюсь написать процедуру для сохранения в файл свойств всех созданных пользователем image, чтобы потом можно было их загрузить.
Такая уже написана, см. WriteComponent.


Не понял данного вопроса...
Что тут не понятно? ошибку вы показали а на какой строке она возникает - нет, вот и вопрос.
 
R

RuSeL

Такая уже написана, см. WriteComponent.
Спасибо за совет. Изучил данную процедуру, внёс изменения в код. В итоге получилось:
Код:
procedure TForm1.N3Click(Sender: TObject);
var
maps: string;
id: Integer;
i: integer;
FileStream: TFileStream;
begin
if SaveDialog1.Execute then
begin
maps:= SaveDialog1.FileName;
FileStream := TFileStream.Create(maps+'.maps', fmCreate);
if Form1.Tag=1 then
begin
FileStream.WriteComponent(Label1);
FileStream.WriteComponent(Label2);
id:=Image.ComponentIndex;
for i:=id downto 63 do
begin
FileStream.WriteComponent(Image.Components[id]);
end;
end
else
begin
FileStream.WriteComponent(Label1);
FileStream.WriteComponent(Label2);
FileStream.Free;
end;
end;
end;
Однако, ошибка предыдущая ошибка осталась, только вместо (54) - (63), так как я добавил новые компоненты в создаваемую форму.
С помощью дебаггера я точно установил, что ошибка в строке
Код:
FileStream.WriteComponent(Image.Components[id]);
Но в чём она заключается и как её исправить я не могу понять.
 
Y

Yason

Раз уж есть цикл по i, логичнее было бы FileStream.WriteComponent(Image.Components[i]).
Да, и поток лучше освобождать даже если Form1.Tag<>1 ;)
 
R

RuSeL

Раз уж есть цикл по i, логичнее было бы FileStream.WriteComponent(Image.Components[i]).
Да, и поток лучше освобождать даже если Form1.Tag<>1 ;)
Спасибо за советы, я их учёл. Но ошибка остаётся всё той же и в этой же строке.
 
E

etc

Но в чём она заключается и как её исправить я не могу понять.
Ошибка в том что вы обращаетесь к несуществующим объектам, т.е. ваш цикл неверен в принципе.
Image.Components[id], что вы думаете тут должно быть?
 
R

RuSeL

Ошибка в том что вы обращаетесь к несуществующим объектам, т.е. ваш цикл неверен в принципе.
Image.Components[id], что вы думаете тут должно быть?
Я таким образом пытаюсь сослаться на image с индексом id.
 
E

etc

Посмотрите, что выдает такой код: ShowMessage(IntToStr(Image.ComponentCount));
 
E

etc

ну вот и подумайте над ситуацией. что она вам говорит ...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!