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

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

RuSeL

#1
Код:
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;
На стадии компилирования нету никаких сообщений. Однако, при вызове функции из скомпилированной программы, выдаёт сообщение об ошибке вида:
 

Вложения

  • 225.3 КБ Просмотры: 19
E
#2
код - ужас. да и с логикой тоже плохо все :)
тут даже трудно понять что делается

где падает?
 
R

RuSeL

#3
Не понял данного вопроса...
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

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

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

RuSeL

#5
<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;
 

Вложения

  • 209.3 КБ Просмотры: 15
P

pand2019

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

RuSeL

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

Yason

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

RuSeL

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


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

RuSeL

#11
Такая уже написана, см. 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

#12
Раз уж есть цикл по i, логичнее было бы FileStream.WriteComponent(Image.Components[i]).
Да, и поток лучше освобождать даже если Form1.Tag<>1 ;)
 
E
#16
Посмотрите, что выдает такой код: ShowMessage(IntToStr(Image.ComponentCount));
 
E
#18
ну вот и подумайте над ситуацией. что она вам говорит ...