Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подскажите где ошибка
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - FAQ
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;

На стадии компилирования нету никаких сообщений. Однако, при вызове функции из скомпилированной программы, выдаёт сообщение об ошибке вида:
etc
код - ужас. да и с логикой тоже плохо все sad.gif
тут даже трудно понять что делается

где падает?
RuSeL
Цитата(etc @ 17:05:2008, 20:48 ) *
где падает?

Не понял данного вопроса...
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;
Yason
<offtop>Отличный пример того, как мало помогают комментарии в неаккуратном коде...</offtop>

Проблема наверняка в том, что в Memo1 строки сначала нужно добавлять, записывать их сразу напрямую нельзя.
Memo1.Lines.Add(IntToStr(Tag)); //помещаем данные в Memo

P.S. Ещё переменная maps неинициализирована, и "SaveDialog1.FileName := maps" не имеет смысла.
P.P.S. Внутренний цикл записывает один и тот же Tag аж n раз подряд -- так задумано?
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;
pand2019
во-первых учи английский, там в ошибке указана стока где ошибка.
во вторых вам не рассказывали про "дебаг"?
перед компиляцией ставишь рядом с кодом слева красную точку после места предполагаемой ошибки, а курсор ставь несколько выше.
а компилить надо не с помощью F9 а F4 это запускает пошаговый режим, в нем можно смотерь в какой момент происходит ошибка и смотреть какие значения у переменных, а шагать с помощью F7.
попробуй сам разобраться, так лучше приходит понимание, а код очень не читабелен.
что ты хочешь вообще сделать, так было бы легче.
RuSeL
Я пытаюсь написать процедуру для сохранения в файл свойств всех созданных пользователем image, чтобы потом можно было их загрузить.
P.S. Tag:=Image.Components[id].Tag; - это команда присваивает переменной Tag значение свойства Tag рисунка с индексом id или я ошибаюсь?
Yason
Цитата(RuSeL @ 18:05:2008 - 00:19) *
первый создаваемый Image имеет индекс 54
Стало быть, на форме уже созданы 54 картинки, и вы добавляете новые во время исполнения программы?
Сообщение об ошибке говорит, что это не так...
Присоединяюсь к совету познакомиться поближе с дебаггером smile.gif
RuSeL
На форме создана 1 картинка изначально, новые добавляются во время исполнения программы. Однако, с помощью Label1.Caption:=IntToStr(Image.ComponentIndex) я увидел, что первая добавляемая картинка имеет index 54.
Дебаггер показывает, что ошибка в строке Tag:=Image.Components[id].Tag;. Но я не понимаю, в чём здесь она...
etc
Цитата(RuSeL @ 18:05:2008 - 17:26) *
Я пытаюсь написать процедуру для сохранения в файл свойств всех созданных пользователем image, чтобы потом можно было их загрузить.
Такая уже написана, см. WriteComponent.


Цитата(RuSeL @ 17:05:2008 - 23:19) *
Не понял данного вопроса...
Что тут не понятно? ошибку вы показали а на какой строке она возникает - нет, вот и вопрос.
RuSeL
Цитата(etc @ 19:05:2008, 10:34 ) *
Такая уже написана, см. 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]);

Но в чём она заключается и как её исправить я не могу понять.
Yason
Раз уж есть цикл по i, логичнее было бы FileStream.WriteComponent(Image.Components[i]).
Да, и поток лучше освобождать даже если Form1.Tag<>1 wink.gif
RuSeL
Цитата(Yason @ 20:05:2008, 03:43 ) *
Раз уж есть цикл по i, логичнее было бы FileStream.WriteComponent(Image.Components[i]).
Да, и поток лучше освобождать даже если Form1.Tag<>1 wink.gif

Спасибо за советы, я их учёл. Но ошибка остаётся всё той же и в этой же строке.
etc
Цитата(RuSeL @ 19:05:2008 - 20:58) *
Но в чём она заключается и как её исправить я не могу понять.
Ошибка в том что вы обращаетесь к несуществующим объектам, т.е. ваш цикл неверен в принципе.
Image.Components[id], что вы думаете тут должно быть?
RuSeL
Цитата(etc @ 20:05:2008, 09:50 ) *
Ошибка в том что вы обращаетесь к несуществующим объектам, т.е. ваш цикл неверен в принципе.
Image.Components[id], что вы думаете тут должно быть?

Я таким образом пытаюсь сослаться на image с индексом id.
etc
Посмотрите, что выдает такой код: ShowMessage(IntToStr(Image.ComponentCount));
RuSeL
Цитата(etc @ 20:05:2008, 13:20 ) *
Посмотрите, что выдает такой код: ShowMessage(IntToStr(Image.ComponentCount));

Показывает "0".
etc
ну вот и подумайте над ситуацией. что она вам говорит ...
RuSeL
Цитата(etc @ 20:05:2008, 13:27 ) *
ну вот и подумайте над ситуацией. что она вам говорит ...

Подумал и разобрался smile.gif
Проблема решена, спасибо всем за содействие.
P.S. Отдельное спасибо etc smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.