Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2014, 23:45   #11
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Все равно системная ошибка.
Alexandr17 вне форума Ответить с цитированием
Старый 22.07.2014, 23:47   #12
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Все равно системная ошибка
Alexandr17 вне форума Ответить с цитированием
Старый 23.07.2014, 00:22   #13
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

У меня нормально отрабатывает реакцию на удаление. Проходи отладчиком и смотри на какой строке (хотя и так ясно, что в HODPers[i, i1].Free) и при каких параметрах ошибка возникает - есть ли там объект или нет.
Ставь точку останова на HODPers[i, i1].Free;
И смотри что у тебя в переменных
Примерно вот так должно быть:
009.jpg

Кстати, _ClickHODPers удаляет всё. Так и надо? Или одного надо оставить?
eoln вне форума Ответить с цитированием
Старый 23.07.2014, 00:25   #14
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

надо удалять все клетки ходя
Alexandr17 вне форума Ответить с цитированием
Старый 23.07.2014, 01:04   #15
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

исправил практически. Ошибка заключалась в зацикливании модуля pngimage
я сделал так
Код:
procedure TForm1._ClickPersonages(Sender: TObject);
var png:TPNGObject;
begin
.....
  if Personages.Top+32 <> MAPS.Height then begin
    HODPers[Personages.Left div 32, (Personages.Top+32) div 32]:=TImage.Create(Scrollbox1);
    HODPers[Personages.Left div 32, (Personages.Top+32) div 32].Parent:=Scrollbox1;
    HODPers[Personages.Left div 32, (Personages.Top+32) div 32].Left:=Personages.Left;
    HODPers[Personages.Left div 32, (Personages.Top+32) div 32].Top:=Personages.Top+32;
    HODPers[Personages.Left div 32, (Personages.Top+32) div 32].AutoSize:=True;
    HODPers[Personages.Left div 32, (Personages.Top+32) div 32].Picture.Graphic:=png;
    HODPers[Personages.Left div 32, (Personages.Top+32) div 32].OnClick:=_ClickHODPers;
  end;

  if (Personages.Left <> 0)and(Personages.Top <> 0) then begin
    HODPers[(Personages.Left-32) div 32, (Personages.Top-32) div 32]:=TImage.Create(Scrollbox1);
    HODPers[(Personages.Left-32) div 32, (Personages.Top-32) div 32].Parent:=Scrollbox1;
    HODPers[(Personages.Left-32) div 32, (Personages.Top-32) div 32].Left:=Personages.Left-32;
    HODPers[(Personages.Left-32) div 32, (Personages.Top-32) div 32].Top:=Personages.Top-32;
    HODPers[(Personages.Left-32) div 32, (Personages.Top-32) div 32].AutoSize:=True;
    HODPers[(Personages.Left-32) div 32, (Personages.Top-32) div 32].Picture.Graphic:=png;
    HODPers[(Personages.Left-32) div 32, (Personages.Top-32) div 32].OnClick:=_ClickHODPers;
  end;

  if (Personages.Left <> 0)and(Personages.Top+32 <> MAPS.Height) then begin
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32]:=TImage.Create(Scrollbox1);
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].Parent:=Scrollbox1;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].Left:=Personages.Left-32;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].Top:=Personages.Top+32;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].AutoSize:=True;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].Picture.Graphic:=png;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].OnClick:=_ClickHODPers;
  end;

  if (Personages.Left+32 <> MAPS.Width)and(Personages.Top <> 0) then begin
    HODPers[(Personages.Left+32) div 32, (Personages.Top-32) div 32]:=TImage.Create(Scrollbox1);
    HODPers[(Personages.Left+32) div 32, (Personages.Top-32) div 32].Parent:=Scrollbox1;
    HODPers[(Personages.Left+32) div 32, (Personages.Top-32) div 32].Left:=Personages.Left+32;
    HODPers[(Personages.Left+32) div 32, (Personages.Top-32) div 32].Top:=Personages.Top-32;
    HODPers[(Personages.Left+32) div 32, (Personages.Top-32) div 32].AutoSize:=True;
    HODPers[(Personages.Left+32) div 32, (Personages.Top-32) div 32].Picture.Graphic:=png;
    HODPers[(Personages.Left+32) div 32, (Personages.Top-32) div 32].OnClick:=_ClickHODPers;
  end;

  if (Personages.Left+32 <> MAPS.Width)and(Personages.Top+32 <> MAPS.Height) then begin
    HODPers[(Personages.Left+32) div 32, (Personages.Top+32) div 32]:=TImage.Create(Scrollbox1);
    HODPers[(Personages.Left+32) div 32, (Personages.Top+32) div 32].Parent:=Scrollbox1;
    HODPers[(Personages.Left+32) div 32, (Personages.Top+32) div 32].Left:=Personages.Left+32;
    HODPers[(Personages.Left+32) div 32, (Personages.Top+32) div 32].Top:=Personages.Top+32;
    HODPers[(Personages.Left+32) div 32, (Personages.Top+32) div 32].AutoSize:=True;
    HODPers[(Personages.Left+32) div 32, (Personages.Top+32) div 32].Picture.Graphic:=png;
    HODPers[(Personages.Left+32) div 32, (Personages.Top+32) div 32].OnClick:=_ClickHODPers;
  end;
  png.Free;
end;
теперь только при клике на этот имадж происходит ошибка
Код:
iif (Personages.Left <> 0)and(Personages.Top+32 <> MAPS.Height) then begin
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32]:=TImage.Create(Scrollbox1);
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].Parent:=Scrollbox1;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].Left:=Personages.Left-32;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].Top:=Personages.Top+32;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].AutoSize:=True;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].Picture.Graphic:=png;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].OnClick:=_ClickHODPers;
  end;
Alexandr17 вне форума Ответить с цитированием
Старый 23.07.2014, 01:37   #16
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от Alexandr17 Посмотреть сообщение
теперь только при клике на этот имадж происходит ошибка
Код:
iif (Personages.Left <> 0)and(Personages.Top+32 <> MAPS.Height) then begin
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32]:=TImage.Create(Scrollbox1);
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].Parent:=Scrollbox1;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].Left:=Personages.Left-32;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].Top:=Personages.Top+32;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].AutoSize:=True;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].Picture.Graphic:=png;
    HODPers[(Personages.Left-32) div 32, (Personages.Top+32) div 32].OnClick:=_ClickHODPers;
  end;
Это ошибка? Могу только посоветовать проверить зацикливание других модулей
Отладчик в помощь
eoln вне форума Ответить с цитированием
Старый 23.07.2014, 01:39   #17
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

да попрежнему зацикливание у pngimage
Alexandr17 вне форума Ответить с цитированием
Старый 23.07.2014, 01:50   #18
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Цитата:
Сообщение от Alexandr17 Посмотреть сообщение
Код:
procedure TForm1._ClickHODPers(Sender: TObject);
VAR I, I1:INTEGER;
begin
  Xpers:=(Sender AS TIMAGE).Left;
  Ypers:=(Sender AS TIMAGE).Top;
  for i := 0 to length(HODPers)-1 do for i1 := 0 to length(HODPers[0])-1 do begin
    if HODPers[i, i1] <> nil then
      HODPers[i, i1].Free;
  end;
end;
но в событии procedure TForm1._ClickHODPers(Sender: TObject); возникает системная ошибка
Ну и правильно что возникает. Нельзя удалять элементы массива/списка и т.д. и т.п. в прямом цикле for..to. Можно только в обратном
цикле for..downto.

<offtop>
P.S. Уж сколько раз твердили миру что ... А шары всё падают и падают.
</offtop>
northener вне форума Ответить с цитированием
Старый 23.07.2014, 02:02   #19
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Нельзя удалять элементы массива/списка и т.д. и т.п. в прямом цикле for..to. Можно только в обратном
цикле for..downto.
Дык указатели ведь. Удаляется не массив, а то что там хранится
eoln вне форума Ответить с цитированием
Старый 23.07.2014, 20:03   #20
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Так красивее...
Код:
procedure TForm1._ClickPersonages(Sender: TObject);
var dx,dy:integer;
Image:TImage;
begin
  dx:=0;
  dy:=0;
  if Personages.Left <> 0 then dx:=-32;
  if Personages.Left+32 <> MAPS.Width then dx:=+32;
  if Personages.Top <> 0 then dy:=-32;
  if Personages.Top+32 <> MAPS.Height then dy:=+32;
  Image:=TImage.Create(Scrollbox1);
  HODPers[(Personages.Left+dx) div 32, (Personages.Top+dy) div 32]:=Image;
  Image.Parent:=Scrollbox1;
  Image.Left:=Personages.Left+dx;
  Image.Top:=Personages.Top+dy;
  Image.AutoSize:=True;
  Image.Picture.LoadFromFile(PathFileExe+'\HodPers1.png');
  Image.OnClick:=_ClickHODPers;
end;
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 23.07.2014 в 20:17. Причина: Еще красивее :)
Slym вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработка событий при динамическом создании Veronikaa Компоненты Delphi 4 10.05.2012 17:13
Глюк при динамическом создании Label. BingoBongo Общие вопросы Delphi 2 10.05.2011 19:41
Ошибка AV при уничтожении объектов из модулей(dll) puga555 Общие вопросы Delphi 4 08.01.2010 22:14