Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.042 c
1-1137400279
Kolya
2006-01-16 11:31
2006.02.12
DragDrop в ListView


15-1137908295
Skorpion-555
2006-01-22 08:38
2006.02.12
Помогите


15-1137871164
parovoZZ
2006-01-21 22:19
2006.02.12
IntraWeb


2-1138275738
Андр
2006-01-26 14:42
2006.02.12
Как преобразовать строку из UTF-8 в WIN-1251


15-1137754436
Piter
2006-01-20 13:53
2006.02.12
404 Not Forund





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский