Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
59 / 0 / 0
Регистрация: 12.04.2017
Сообщений: 37

Программа "Паззл": Не могу добиться прилипания панелей друг к другу

21.12.2017, 19:42. Показов 1311. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа на один Паззл. Тоже на Альфаскин. Каждая картинка- Image на Panel. Не могу добиться прилипания панелей друг к другу. Буду рад советам.
Вложения
Тип файла: rar _Pazzle_.rar (4.06 Мб, 5 просмотров)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.12.2017, 19:42
Ответы с готовыми решениями:

Дан список целых чисел. Программа должна вывести число пар элементов, равных друг другу
Дан список целых чисел. Программа должна вывести число пар элементов, равных друг другу. Считается, что любые два элемента, равные друг...

Несколько панелей друг на друге
Здравствуйте, хотелось бы узнать кое-что на счет одного вопроса: у меня есть одна форма и за ней по очереди идут несколько панелей на всю...

Все ли подходит друг к другу?
Всем привет, собственно, сабж Прошу оценить совместимость компонентов, в первую очередь на физическом уровне, форматы, разъемы или еще...

10
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
22.12.2017, 11:20
Прикольно!
Если можно, пожелания...
-уменьши начальный размер окна
-сделай у окна-оригинала position в ScreenCenter
- отслеживай координаты Left и Top у Image - не все помещаются в окно. Возможно, стоит повесить обработчик OnResize для главного окна.
Насчёт прилипашек - идея интересная. Мне и самому любопытно.
0
59 / 0 / 0
Регистрация: 12.04.2017
Сообщений: 37
22.12.2017, 11:41  [ТС]
У меня, действительно, широкоформатник, друг. Работа над адаптацией под все экраны-моя головная боль. За отзыв спасибо.
0
 Аватар для MyEternity
97 / 97 / 25
Регистрация: 25.04.2016
Сообщений: 525
22.12.2017, 13:34
Научитесь резать картинку динамически, это вам поднимет скилл программирования на новую высоту
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
23.12.2017, 07:27
Лучший ответ Сообщение было отмечено Kobart1717 как решение

Решение

Адаптацию под экраны могу научить, сложного тут ничего нет. Прилипание - в целом, тоже. Так как количество картинок небольшое, то можно при событии MouseUp проверять положение всех картинок, и если вдруг получится вот такое:

Delphi
1
if (abs(Image1.left + Image1.Width - Image2.left) < 5)and(abs(Image1.Top - Image2.Top) < 5) then
то менять координаты Image2, чтоб она прилипла.

Можно сделать еще несколько более сложный вариант, тогда можно было бы прилипшие картинки таскать всем скопом. Но для этого картинкам надо добавить свойство ImLeft, ImRigth, ImTop, ImBottom, куда прицеплять ссылки на "пристегнутый" объект.

Добавлено через 1 час 56 минут
Пересмотрел код. Без глобальных изменений можно сделать следующее: каждому TImage присвоить числовое свойство Tag. Потом таким вот циклом перебрать компоненты в событии MouseUp:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var img:TImage;
const sensivity:Byte = 5; //если нужна меньшая чувствительность - то делаем больше и наоборот
begin
img := Sender; //Sender содержит в себе вызвавший событие компонент, т.е., картинку
if ComponentCount > 0 then
for i := 0 to ComponentCount - 1 do
 if (Components[i] is TImage)and(Components[i] <> Sender) then
 begin
 //проверка пристыковки справа
 if (abs(Components[i].Left + Components[i].width - img.Left) < sensivity)and
    (abs(Components[i].Top - img.Top) < sensivity) then
  begin
  img.left := Components[i].left + components[i].width;
  img.top := Components[i].top;
  end;
 //проверка пристыковки справа
 ...
 //проверка пристыковки сверху
 ...
 //проверка пристыковки снизу
 ...
 end;
end;
Ну и про динамическое разрезание дали очень грамотный комментарий. Тут лучше пользоваться массивом из TImage или, что еще лучше, использовать TObjectList<TImage>. Намного более гибкий и универсальный код даст.

Добавлено через 15 часов 39 минут
Так, ну и в продолжение темы, очередной раз. Я еще раз посмотрел код, и есть еще предложения по оптимизации. Малая оптимизация:

В Unit2 есть целая куча процедур

Delphi
1
2
3
4
5
6
7
 procedure TForm1.Image40MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
 const  Sc_dragmove = $F012;
 begin
 ReleaseCapture;
 Panel40.Perform(WM_SYSCOMMAND, Sc_dragmove, 0);
 end;
Скажем так, это сильно нерационально. На первый взгляд, все работает и все хорошо. Но только на первый. Если вдруг захочется внести изменения в процедуру, то придется вносить их вручную во все процедуры. Это нерационально и влечет за собой неизбежные ошибки и человеческий фактор. Вместо сорока таких обработчиков лучше сделать один для всех:
Delphi
1
2
3
4
5
6
7
 procedure TForm1.Image40MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
 const  Sc_dragmove = $F012;
 begin
 ReleaseCapture;
 ((Sender as TImage).Parent as TPanel).Perform(WM_SYSCOMMAND, Sc_dragmove, 0);
 end;
И сделать на него ссылку во всех OnMouseDown для Image'й. Тут, конечно, код тоже не супер, так как в нем серьезное допущение о том, что все TImage имеют родителем TPanel. Но он уже универсален, и вместо сорока процедур можно сделать только одну.


Далее. Можно создать отдельный класс. Вот его "скелет":

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  TPuzzleNode = class(TPanel)
    private
      procedure MouseDown(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: Integer);
    protected
    public
      Img:TImage;
      constructor Create(AOwner:TWinControl); //мы перекрываем стандартный конструктор, так будет удобнее
  end;
 
constructor TPuzzleNode.Create(AOwner: TWinControl);
begin
inherited Create(AOwner);
self.Parent := AOwner;
 
self.Img := TImage.Create(self); //в деструкторе можно не прописывать удаление TImage, так как наша панель является owner'ом для TImage и отвечает за его жизненный цикл.
self.Img.Parent := self;
self.Img.Align := alClient; //Картинка будет растягиваться на всю панель.
self.Img.OnMouseDown := self.MouseDown;
end;
 
procedure TPuzzleNode.MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
 const  Sc_dragmove = $F012;
 begin
 ReleaseCapture;
 self.Perform(WM_SYSCOMMAND, Sc_dragmove, 0);
end;
После этого динамически создавать экземпляры этого класса. Будет еще намного удобнее. Единственной проблемой (на самом деле тоже не проблема) будет загружать картинки, и подстроиться под разрешение экрана (тоже не сильно большая проблема, на самом деле). Чтобы мне не тратить время впустую, если ТСу все это надо, то я готов ему помочь.
1
59 / 0 / 0
Регистрация: 12.04.2017
Сообщений: 37
14.01.2018, 21:21  [ТС]
Я прилепил все 40 картинок на одну команду. Друг... ОНО работает. И кода ПОЧТИ НОЛЬ.
Я тебя уважаю.

Добавлено через 1 минуту
По поводу динамической резки картинок...
Я пробовал. Но картинки... какие-то, воля ваша, покоцанные получаются. Без гладкой каймы. Понимаю, что это мелочи. Но мне было неприятно на них смотреть.

Добавлено через 6 минут
И мерцают Image-и.
Я "противомерцающие" заклятия писал в onCreate формы... Но сильно это не помогало.
0
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
14.01.2018, 22:46
Цитата Сообщение от Kobart1717 Посмотреть сообщение
"противомерцающие" заклятия
Какие это? Двойную буфферизацию подключил?
0
59 / 0 / 0
Регистрация: 12.04.2017
Сообщений: 37
14.01.2018, 22:51  [ТС]
Да.
Delphi
1
Image1.Parent.DoubleBuffered:= True;
И такой код пробовал:
Delphi
1
2
3
4
5
 var i: Integer;
 begin
 for i:=0 to ComponentCount-1 do
 if Components[i] is TWinControl then
 TWinControl(Components[i]).DoubleBuffered:=true;
Добавлено через 31 секунду
Matan, как теги использовать? Чего-то не соображу никак.
0
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
15.01.2018, 00:30
Kobart1717, кликаешь по Delphi и вводишь код в обрамление.
Миниатюры
Программа "Паззл": Не могу добиться прилипания панелей друг к другу  
0
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
15.01.2018, 00:31
То есть [DELPHI.]сюда[/DELPHI.]
Точку поставил, чтобы не заменялись теги.
1
59 / 0 / 0
Регистрация: 12.04.2017
Сообщений: 37
15.01.2018, 01:33  [ТС]
Спасибо, мэн.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.01.2018, 01:33
Помогаю со студенческими работами здесь

Подойдут ли RAM друг к другу
Всем привет! Возник вопрос будут ли работать вместе 2 планки памяти. Сам мало чего понимаю, просто хочу увеличить объем для игрушек. На...

Подойдут ли к друг другу комплектующие?
Здравствуйте, пытаюсь апгрейдить свой 8-летний ПК, вот подобрал некоторые комплектующие: ОЗУ: http://www.oldi.ru/catalog/element/0219556/...

Равны ли строки друг другу
Пользователь вводит две строки если они равны друг другу значит вывести YES иначе NO

Привязка селекторов друг к другу
Здравствуйте! $('#production_1, #production_2, #production_3, #production_4').submit(function (e) { e.preventDefault(); ...

Привязка 2 окон друг к другу
Всем привет, вот задался таким вопросом, есть основное диалоговое окно, есть немодальное окно Допустим я подвожу немодальное окно к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru