Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.12;
Скачать: CL | DM;

Вниз

Где ошибка   Найти похожие ветки 

 
2Wish   (2006-01-15 00:03) [0]

public
 mov1,mov2: TImage;

...

procedure TForm1.Image18Click(Sender: TObject);
var i,i1,x,y:integer;
begin
if selected = false then
 begin
 selected:=true;
 for i:=0 to controlcount - 1 do
 if Controls[i] is TImage then
   begin
   if mouse.CursorPos.X - form1.left >= (Controls[i] as TImage).Left then
   if mouse.CursorPos.X - form1.left <= (Controls[i] as TImage).Left + 64  then
   if mouse.CursorPos.Y - form1.top >= (Controls[i] as TImage).Top then
   if mouse.CursorPos.Y - form1.top <= (Controls[i] as TImage).Top + 64 then
   mov1 := (Controls[i] as TImage); // Ищем выбранный контрол и пихаем его в mov1.
   exit;
   end;
 end;
if selected then
 begin
 for i1:=0 to controlcount - 1 do
 if Controls[i1] is TImage then
   begin
   if mouse.CursorPos.X - form1.left >= (Controls[i1] as TImage).Left then
   if mouse.CursorPos.X - form1.left <= (Controls[i1] as TImage).Left + 64  then
   if mouse.CursorPos.Y - form1.top >= (Controls[i1] as TImage).Top then
   if mouse.CursorPos.Y - form1.top <= (Controls[i1] as TImage).Top + 64 then
   mov2 := (Controls[i1] as TImage);
   // Теперь когда юзер выбрал оба компанента меняем позицию TImagе"ов.
   x := mov1.Left;
   y := mov1.Top;
   mov1.Left := mov2.Left;
   mov1.Top := mov2.Top;
   mov2.left := x;
   mov2.Top := y;
   cselected := false;
   end;
 end;
end;


Отладчик находит ошибку Access Vialation в сроке x := mov1.Left;, как оказалось почему-то любые попытки загрузить Left из этого самого mov1 заканчивается ошибкой, а весь код с выбором работает, я уже проверил, подскажите что делать и как избавить от ошибки.


 
VirEx ©   (2006-01-15 00:13) [1]


> оказалось почему-то любые попытки загрузить Left из этого
> самого mov1 заканчивается ошибкой


> Access Vialation

ну ясный пень, значит mov1 в этот момент пустое место и ты хочешь загрузить еще и его свойство...


 
Fenik ©   (2006-01-15 00:52) [2]

mov2 := Controls[i1];


 
2Wish   (2006-01-15 10:50) [3]

2VirEx
Почему он пустой, я в него загружаю компонент в коде видно.

2Fenik
Это не сработает, Mov1, Mov2 это TImage а не TComponent. Есть другие предложения?


 
VirEx ©   (2006-01-15 11:09) [4]


> 2Wish   (15.01.06 10:50) [3]
> 2VirEx
> Почему он пустой, я в него загружаю компонент в коде видно.
>

Access Vialation - доступ к участку памяти запрещен, т.е.  этот момент ты обращаешся к пустому месту либо к другому объекту (не Image)


 
Fenik ©   (2006-01-15 12:37) [5]

Фу ты блин. Хотел написать mov2 := TImage(Controls[i1]);
А лучше
if Controls[i1] is TImage then
 with TImage(Controls[i1]) do begin
 а здесь все свои обращения к свойствам имага. без присваиваний к mov1


 
Плохиш ©   (2006-01-15 13:42) [6]


> 2Wish   (15.01.06 10:50) [3]
> 2VirEx
> Почему он пустой, я в него загружаю компонент в коде видно.

Видно, а так же видно, что следующей строчкой идёт выход из процедуры.


 
2Wish   (2006-01-15 14:33) [7]

2Fenik, Я бы с удовольствем как сделал, но весь этот код не сразу работает, эта одна процедура сразу для двух случаев, когда первый объект выбран, и когда еще ничего не выбранно. А Exit; там стоит чтобы не пошла процедура дальше, до того как юзер выбрал та что этот объект поменять, но это не важно, ведь mov1 и mov2 объявленны в public значит не должны терятся пока выполнится первое и второе действие. Для тех кто не понимает зачем этот код, объясняю: на форме лежат TImage, нужно выделить поочередна два из них и они поменяются позициями.
Вот.


 
Набережных С. ©   (2006-01-15 14:55) [8]


> 2Wish

Раз есть AV, значит mov1 указывает в пустоту, то есть не содержит ссылки  на существующий объект-потомок TControl. И это не предмет для обсуждения - это просто так и есть.

> // Ищем выбранный контрол и пихаем его в mov1.

Любопытно, а на каком основании сделано заключение, что это как раз тот объект, который выбрал пользователь? Пользователю запрещено выбирать любой Image, кроме первого в списке Controls?

PS А почему топик еще не в "начинающих"? Мне просто интересно.


 
2Wish   (2006-01-15 15:22) [9]

2Набережных С.
Перед тем как отвечатеть вас стоило бы внимательно ознакомится с кодом.

> Любопытно, а на каком основании сделано заключение, что это как раз тот объект, который выбрал пользователь? Пользователю запрещено выбирать любой Image, кроме первого в списке Controls?

Любопытно каком основании вы сделали вышесказанное заключение, наверно вы просто невнимательно читали код, если вам кажется, что будет выбираться первый контрол в списке, то замените строчку:
mov1 := (Controls[i] as TImage);
вот этой:
(Controls[i] as TImage).Free;
Изчещает именно тот контрол на котором щелкнули.

> PS А почему топик еще не в "начинающих"? Мне просто интересно.

С дельфями я знаком с 2003 года, не так уж и много, но и не так уж и мало, чтобы писать в топике для начинающих.


 
VirEx ©   (2006-01-15 16:10) [10]


> нужно выделить поочередна два из них и они поменяются позициями.

а может просто драг энд дроп?


 
Плохиш ©   (2006-01-15 16:28) [11]


> 2Wish   (15.01.06 15:22) [9]

Перед тем как наезжать на отвечающих, советую тебе посмотреть свой код внимательно и если не поймёшь свою ошибку, на которую тебе обратил внимание Набережных С. ©   (15.01.06 14:55) [8], то бери метлу и переквалифицируйся в дворники.


 
2Wish   (2006-01-15 16:29) [12]

нет, драг эн дроп не катит к сожелению, если кто нить может предложить другой метод сделать описанную выше задачу, то пусть напишет плиз.


 
Zeqfreed ©   (2006-01-15 16:42) [13]

2Wish   (15.01.06 0:03)

> на форме лежат TImage, нужно выделить поочередна два
> из них и они поменяются позициями.


var
 sel : TImage = nil;

. . .

procedure TForm1.Image1Click(Sender: TObject);
var
 p : TPoint;
begin
 if not Assigned(sel) then
  sel := (Sender as TImage)
 else if (Sender as TImage) <> sel then begin
  p.X := sel.Left;
  p.Y := sel.Top;

  sel.Left := (Sender as TImage).Left;
  sel.Top := (Sender as TImage).Top;

  (Sender as TImage).Left := p.X;
  (Sender as TImage).Top := p.Y;

  sel := nil;
 end;
end;


Достаточно назначить этот обработчик всем компонентам, которые должны учавствовать в перестановках и все будет работать как надо. Без всяких извратов.


 
2Wish   (2006-01-15 16:56) [14]

Спасибо огромное, Zeqfreed. Все круто работает.


 
Набережных С. ©   (2006-01-15 17:20) [15]


> 2Wish   (15.01.06 15:22) [9]

Да, действительно, я не обратил внимания на эту цепочку if..then. Мне просто в голову не пришло, что столь бредовым способом будет искаться объект, который уже и так присутствует в процедуре в виде Sender.



Страницы: 1 вся ветка

Текущий архив: 2006.02.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.052 c
15-1137610275
Ксардас
2006-01-18 21:51
2006.02.12
Подскажите прогу...


4-1133334120
BVV
2005-11-30 10:02
2006.02.12
Реестр и файловая система


1-1137068572
oleg__
2006-01-12 15:22
2006.02.12
Формат даты


15-1137521628
TStas
2006-01-17 21:13
2006.02.12
Text-To-Speach


2-1138344320
Daria
2006-01-27 09:45
2006.02.12
Как открыть CSV по OLE из программы