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

Тема в разделе "Delphi - FAQ", создана пользователем RuSeL, 17 май 2008.

  1. RuSeL

    RuSeL Гость

    Код (Text):
    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 КБ
      Просмотров:
      19
  2. etc

    etc Гость

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

    где падает?
     
  3. RuSeL

    RuSeL Гость

    Не понял данного вопроса...
    p.s. Чтобы можно было разобраться, что делается, добавил комментарии в код. Правда, его немного изменил, однако осталась таже ошибка.
    Код (Text):
    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;
     
  4. Yason

    Yason Гость

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

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

    RuSeL Гость

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

    После небольшого изменения кода старая ошибка пропала, однако появилась новая...
    Код (Text):
    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 КБ
      Просмотров:
      15
  6. pand2019

    pand2019 Гость

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

    RuSeL Гость

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

    Yason Гость

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

    RuSeL Гость

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

    etc Гость

    Такая уже написана, см. WriteComponent.


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

    RuSeL Гость

    Спасибо за совет. Изучил данную процедуру, внёс изменения в код. В итоге получилось:
    Код (Text):
    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), так как я добавил новые компоненты в создаваемую форму.
    С помощью дебаггера я точно установил, что ошибка в строке
    Код (Text):
    FileStream.WriteComponent(Image.Components[id]);
    Но в чём она заключается и как её исправить я не могу понять.
     
  12. Yason

    Yason Гость

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

    RuSeL Гость

    Спасибо за советы, я их учёл. Но ошибка остаётся всё той же и в этой же строке.
     
  14. etc

    etc Гость

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

    RuSeL Гость

    Я таким образом пытаюсь сослаться на image с индексом id.
     
  16. etc

    etc Гость

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

    RuSeL Гость

    Показывает "0".
     
  18. etc

    etc Гость

    ну вот и подумайте над ситуацией. что она вам говорит ...
     
  19. RuSeL

    RuSeL Гость

    Подумал и разобрался :)
    Проблема решена, спасибо всем за содействие.
    P.S. Отдельное спасибо etc :)
     
Загрузка...
Похожие Темы - Подскажите где ошибка
  1. Gamlet
    Ответов:
    1
    Просмотров:
    9.704
  2. amstrot
    Ответов:
    1
    Просмотров:
    66
  3. d7uk4r3v
    Ответов:
    14
    Просмотров:
    288
  4. kuklofon
    Ответов:
    1
    Просмотров:
    78
  5. nml
    Ответов:
    2
    Просмотров:
    137

Поделиться этой страницей