![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Где ошибка [D7, WinXP]
2Wish © (2006-01-15 00:03:00)
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 заканчивается ошибкой, а весь код с выбором работает, я уже проверил, подскажите что делать и как избавить от ошибки.
Набережных С. (2006-01-15 17:20:00) [1]
> 2Wish (15.01.06 15:22) [9]
Да, действительно, я не обратил внимания на эту цепочку if..then. Мне просто в голову не пришло, что столь бредовым способом будет искаться объект, который уже и так присутствует в процедуре в виде Sender.
2Wish (2006-01-15 16:56:00) [2]Спасибо огромное, Zeqfreed. Все круто работает.
Zeqfreed (2006-01-15 16:42:00) [3]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:29:00) [4]нет, драг эн дроп не катит к сожелению, если кто нить может предложить другой метод сделать описанную выше задачу, то пусть напишет плиз.
Плохиш (2006-01-15 16:28:00) [5]
> 2Wish (15.01.06 15:22) [9]
Перед тем как наезжать на отвечающих, советую тебе посмотреть свой код внимательно и если не поймёшь свою ошибку, на которую тебе обратил внимание Набережных С. © (15.01.06 14:55) [8], то бери метлу и переквалифицируйся в дворники.
VirEx (2006-01-15 16:10:00) [6]
> нужно выделить поочередна два из них и они поменяются позициями.
а может просто драг энд дроп?
2Wish (2006-01-15 15:22:00) [7]2 Набережных С.
Перед тем как отвечатеть вас стоило бы внимательно ознакомится с кодом.
> Любопытно, а на каком основании сделано заключение, что это как раз тот объект, который выбрал пользователь? Пользователю запрещено выбирать любой Image, кроме первого в списке Controls?
Любопытно каком основании вы сделали вышесказанное заключение, наверно вы просто невнимательно читали код, если вам кажется, что будет выбираться первый контрол в списке, то замените строчку:
mov1 := (Controls[i] as TImage);
вот этой:
(Controls[i] as TImage).Free;
Изчещает именно тот контрол на котором щелкнули.
> PS А почему топик еще не в "начинающих"? Мне просто интересно.
С дельфями я знаком с 2003 года, не так уж и много, но и не так уж и мало, чтобы писать в топике для начинающих.
Набережных С. (2006-01-15 14:55:00) [8]
> 2Wish
Раз есть AV, значит mov1 указывает в пустоту, то есть не содержит ссылки на существующий объект-потомок TControl. И это не предмет для обсуждения - это просто так и есть.
> // Ищем выбранный контрол и пихаем его в mov1.
Любопытно, а на каком основании сделано заключение, что это как раз тот объект, который выбрал пользователь? Пользователю запрещено выбирать любой Image, кроме первого в списке Controls?
PS А почему топик еще не в "начинающих"? Мне просто интересно.
2Wish (2006-01-15 14:33:00) [9]2Fenik, Я бы с удовольствем как сделал, но весь этот код не сразу работает, эта одна процедура сразу для двух случаев, когда первый объект выбран, и когда еще ничего не выбранно. А Exit;там стоит чтобы не пошла процедура дальше, до того как юзер выбрал та что этот объект поменять, но это не важно, ведь mov1 и mov2 объявленны в public значит не должны терятся пока выполнится первое и второе действие. Для тех кто не понимает зачем этот код, объясняю: на форме лежат TImage, нужно выделить поочередна два из них и они поменяются позициями.
Вот.
Плохиш (2006-01-15 13:42:00) [10]
> 2Wish (15.01.06 10:50) [3]
> 2VirEx
> Почему он пустой, я в него загружаю компонент в коде видно.
Видно, а так же видно, что следующей строчкой идёт выход из процедуры.
Fenik (2006-01-15 12:37:00) [11]Фу ты блин. Хотел написать mov2 := TImage(Controls[i1]);
А лучше
if Controls[i1] is TImage then
with TImage(Controls[i1]) do begin
а здесь все свои обращения к свойствам имага. без присваиваний к mov1
VirEx (2006-01-15 11:09:00) [12]
> 2Wish (15.01.06 10:50) [3]
> 2VirEx
> Почему он пустой, я в него загружаю компонент в коде видно.
>
Access Vialation - доступ к участку памяти запрещен, т.е. этот моментты обращаешся к пустому месту либо к другому объекту (не Image)
2Wish (2006-01-15 10:50:00) [13]2VirEx
Почему он пустой, я в него загружаю компонент в коде видно.
2Fenik
Это не сработает, Mov1, Mov2 это TImage а не TComponent. Есть другие предложения?
Fenik (2006-01-15 00:52:00) [14]mov2 := Controls[i1];
VirEx (2006-01-15 00:13:00) [15]
> оказалось почему-то любые попытки загрузить Left из этого
> самого mov1 заканчивается ошибкой
> Access Vialation
ну ясный пень, значит mov1 в этот момент пустое место и ты хочешь загрузить еще и его свойство...