Текущий архив: 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.48 MB
Время: 0.042 c