Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.12.2012, 23:31
Karajal Karajal вне форума
Прохожий
 
Регистрация: 20.01.2012
Сообщения: 10
Репутация: 10
По умолчанию может ли название файла влиять на работу программы

При загрузки файлов с именами [700..800], в этих пределах, выдается сообщение "Access violation at address 0134C8F9. Write of address 00000023."
Если название файла меняю до или после [700..800] все проходит нормально.


Цитата:
procedure TForm1.FormCreate(Sender: TObject);
var
i, d, x, y: integer;
begin
Img1:= Timage32.Create(self);
Img1.Parent:= Form1;
Img1.Align:= AlClient;
x:= 0;
y:= 0;

D:=346; // папка откуда файлы

Repeat
for i := 718 to 722 do
begin //Создает динамический массив карты
Im[i] := TImage.Create(self);
Im[i].Parent := Img1;
Im[i].Left:= x;
Im[i].Top := y;
Im[i].Width := 256;
Im[i].Height:= 256;
x:= x+256;

Im[i].Picture.LoadFromFile ('O:\SASPlanet\cache\Gen\z10\'+ IntToStr(d)+ '\' + (IntToStr(i) + '.jpg'))

end;
X:= 0;
Y:= y+256;
d:= d+1;
Until d= 350; // Конечная папка
end;

В строку первые два файла грузятся нормально, за ними вниз тоже нормально. Что делать?
Ответить с цитированием
  #2  
Старый 16.12.2012, 23:39
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Karajal
При загрузки файлов с именами [700..800], в этих пределах, выдается сообщение "Access violation at address 0134C8F9. Write of address 00000023."
Как объявлена переменная Im?
Каким образом задаётся размер этого массива?
Ответить с цитированием
  #3  
Старый 16.12.2012, 23:54
Karajal Karajal вне форума
Прохожий
 
Регистрация: 20.01.2012
Сообщения: 10
Репутация: 10
По умолчанию

Вот полная версия

Цитата:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, Gr32_Image, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Im: Array[1..2] of TImage;
Img1: Timage32;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
FreeAndNil(Img1);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i, d, x, y: integer;
begin
Img1:= Timage32.Create(self);
Img1.Parent:= Form1;
Img1.Align:= AlClient;
x:= 0;
y:= 0;

D:=346; // папка откуда файлы

Repeat
for i := 718 to 722 do
begin //Создает динамический массив карты
Im[i] := TImage.Create(self);
Im[i].Parent := Img1;
Im[i].Left:= x;
Im[i].Top := y;
Im[i].Width := 256;
Im[i].Height:= 256;
x:= x+256;

Im[i].Picture.LoadFromFile ('O:\SASPlanet\cache\Gen\z10\'+ IntToStr(d)+ '\' + (IntToStr(i) + '.jpg'))

end;
X:= 0;
Y:= y+256;
d:= d+1;
Until d= 350; // Конечная папка
end;

end
.

Как задается размер массива? Я только начинаю, не судите строго.
Я понимаю так, количество картинок получаю в цикле. Задаю первый и последний файл. А объявленный массив "Im: Array[1..2] of TImage;" на размер массива не влияет
Ответить с цитированием
  #4  
Старый 16.12.2012, 23:56
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

У тебя массив от 1 до 2, ты же обращаешься к индексам превосходящим допустимый диапазон.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 17.12.2012, 00:07
Karajal Karajal вне форума
Прохожий
 
Регистрация: 20.01.2012
Сообщения: 10
Репутация: 10
По умолчанию

Я ставил 1 к 20. результат не изменился. Но если меняю название файла тогда все работает. В том и вопрос, другие числа работают. В цикле начальное и конечное значения это имена файлов.
Ответить с цитированием
  #6  
Старый 17.12.2012, 00:10
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Поставь от 0 до 1000 и посмотри.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
Karajal (17.12.2012)
  #7  
Старый 17.12.2012, 00:15
Karajal Karajal вне форума
Прохожий
 
Регистрация: 20.01.2012
Сообщения: 10
Репутация: 10
По умолчанию

Поставил от 0 до 1000, все заработало. Но понимание происходящего не пришло.
Ответить с цитированием
  #8  
Старый 17.12.2012, 00:27
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Karajal
Поставил от 0 до 1000, все заработало. Но понимание происходящего не пришло.
Всё просто. У тебя массив объявлен как "Im: Array[1..2] of TImage;", значит имеет всего 2 элемента с индексами 1 и 2 и обращаться можно только к этим двум существующим элементам так "Im[1]:=..." и так "Im[2]:=...". У тебя же в цикле переменная i принимает значения от 718 до 722 и следовательно идёт обращение к несуществующим в этом массиве элементам "Im[718]:=...", "Im[722]:=..." и т.п.
Ответить с цитированием
  #9  
Старый 17.12.2012, 09:36
Karajal Karajal вне форума
Прохожий
 
Регистрация: 20.01.2012
Сообщения: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Всё просто. У тебя массив объявлен как "Im: Array[1..2] of TImage;", значит имеет всего 2 элемента с индексами 1 и 2 и обращаться можно только к этим двум существующим элементам так "Im[1]:=..." и так "Im[2]:=...". У тебя же в цикле переменная i принимает значения от 718 до 722 и следовательно идёт обращение к несуществующим в этом массиве элементам "Im[718]:=...", "Im[722]:=..." и т.п.
В принципе в книге так и написано, но если я пишу " Im[178..182]" или "Im[1437..1441]" , то все загружается. Когда все заработало я увеличиваю или уменьшаю эти значения, все нормально, но когда перехожу на 700, все радости заканчиваются. Происходит то что я писал в первом сообщении.
Ответить с цитированием
  #10  
Старый 17.12.2012, 10:12
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Просто попадал в участок памяти с флагами RW, поэтому ошибки небыло.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #11  
Старый 17.12.2012, 11:56
Karajal Karajal вне форума
Прохожий
 
Регистрация: 20.01.2012
Сообщения: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Просто попадал в участок памяти с флагами RW, поэтому ошибки небыло.
Спасибо. Пойду учебники читать.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:04.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025