Конструктор форм

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Гость

Сообщение Гость »

Здравствуйте!

Нужно создать конструктор форм. В принципе, на окне надо расположить какое-то количество entry - полей, затем сохранить их координаты и размеры.
Как создавать контролы используя CREATE понятно, с координатами тоже всё ясно.
Вопрос только в том, как после создания контролов перетаскивать их мышкой по форме и изменять их размеры?

Может кто решал подобную задачу?

С уважением, Анатолий
Написал: ClaList(2)
Гость

Сообщение Гость »

Либо на выбранном контроле генерироваьть "регионы-зацепочки" и таскать их, (как таскать регионы д.б. либо в хелпе, либо в ФАК-е), либо поставить слайдеры/спин-ы и манипулировать ими. Можно еще entry поля на форме ;))

WBR, Nick Tsigouro mailto:nick@arsis.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

Да я уже почти все сделал, сейчас идет процесс отладки, если бы не другие проекты, уже бы все работало. В принципе это надо будет встроить в другой проект

--
Best regards,
Anatoly
Написал: ClaList(2)
Гость

Сообщение Гость »

Если сделал через зацепочки, не пожалей, сделай их 8, как в клаше, а то 4-мя по жизни бывает неудобно рулить. И про Entry, это не совсем шутка. Как параллельный инструмент очень полезно.

WBR, Nick Tsigouro
Написал: ClaList(2)
Гость

Сообщение Гость »

Ну, я решал. Кладёшь на экран Region и выделяешь-двигаешь .

---------------------------------------
C уважением,
Юрий Философов,
Главный программист
Корпорация "Диполь", Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@mail.ru (дом)
ICQ#75924439
Написал: ClaList(2)
Гость

Сообщение Гость »

С регионами понятно!

Подскажите, как привязать эти зацепочки к конкретному контролу?
Т.е. как определить по какому из контролов я кликнул мышкой?

С уважением, Анатолий
Написал: ClaList(2)
Гость

Сообщение Гость »

Как вариант. На каждый контрол накладываешь регион. Все равно он нужен, чтобы таскать контрол. Ну а дальше просто ловишь клик (Event:Accepted) в соответствующем регионе.

WBR, Nick Tsigouro mailto:nick@arsis.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

Так плохо получается... Контролы накладываются, регионы накладываются. И зацепляешь совсем не то. А для растяжки контрола требуется зацепить его слегка за краем. А то случайно сожмёшь, а растянуть не получится. Лучше просто поискать наиболее подходящий элемент.

---------------------------------------
C уважением,
Юрий Философов,
Главный программист
Корпорация "Диполь", Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@mail.ru (дом)
ICQ#75924439

Проще создать очередь контролов с их координатами, а регион на все окно.

--
Сергей Редькин mailto:SPR@enigmasoft.com.ua
ЧП "Энигма Софт
Написал: ClaList(2)
Гость

Сообщение Гость »

MouseX - MouseY.
И не забудь про координаты своего (созданного) контрола/региона.

Александр Агеев (aageev@satren.ru)
Написал: ClaList(2)
Гость

Сообщение Гость »

Я просто просматривал все контролы и искал контрол с наиболее близкой границей, но для которого курсор находится внутри или снаружи не слишком далеко.

Хочешь текстов - пиши лично

---------------------------------------
C уважением,
Юрий Философов
Написал: ClaList(2)
Гость

Сообщение Гость »

Все контролы, для которых вы собрались применять такое выделение и перетаскивание в конструкторе форм, однозначно, надо сабклассить. Хотя бы для того, чтобы отсечь все события, на которые контрол не должен реагировать в таком конструкторе.

Далее в новой WNDPROC каждого контрола ловим событие WM_LBUTTONDOWN и связываем "зацепочки" с этим контролом. Для того чтобы, сам контрол не реагировал на клик по нему мышкой, возвращаем FALSE на события WM_LBUTTONDOWN, WM_LBUTTONUP без вызова CallWindowProc. Ну и на все прочие события по обстоятельствам.

Вообще, само собой напрашивается решение в стиле ООП. Вот слабал на коленке, на примере оно всегда нагляднее, см рыбу во вложении ryba.clw (не тестировал). После открытия окна все контролы, которыми хочется управлять (например, все Entry) инициализируются методом Init, в методах Activate и Deactivate нужно сделать привязку и отвязку зацепок. Соответственно при перетаскивании зацепки меняем размеры контрола активного объекта, для чего можно еще один метод сделать.

Кстати, сами зацепки тоже напрашивается оформить в виде объектов, а группу из 8 зацепок в виде некоего объекта управления. И создавать такой управляющий объект непосредственно в объекте контрола, в динамике, когда контрол выделяется, уничтожать объект управления, когда контрол деактивизируется. Потому что выделить можно, по идее несколько контролов. Ннадо будет в примере изменить тогда политику активизации и деактивизации, анализируя статус клавиши [Ctrl], и видимо держать глобально не один активный объект а очередь таковых и т.д. и т.п.

Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)
Написал: ClaList(2)
Гость

Сообщение Гость »

В догон к предыдущему вложению ryba.clw.

Опять в рыбу рыбу заворачивали :), ошибка в ClaControl:WndProc, после MySelf.Kill() свойство MySelf.WndProc очистится и на выходе получим GPF, исправленный пример приложен.

Удачи!
__________________________________
Владимир Якимченко
Написал: ClaList(2)
Гость

Сообщение Гость »

Хотя бы для того, чтобы отсечь все события, на которые контрол не должен реагировать в таком конструкторе.
Да не реагируют они, если контрол накрыт регионом (номер региона больше чем номер контрола на окне). Кроме OCX, которые приходится заменять картинками во время редактирования. Ну и сами регионы приходится во время редактирования представлять панельками, потому что иначе их просто не видно.

---------------------------------------
C уважением,
Юрий Философов
Написал: ClaList(2)
Гость

Сообщение Гость »

Да, точно. Тогда можно обойтись без сабклассинга (или сабклассингом клиентской части окна с ловлей WM_PARENTNOTIFY на клик мыши). Один регион поверх всей области конструктора, под ним создавать все конструируемые контролы, а над ним все регионы-зацепки. Обрабатывать события на нем и искать при клике наиболее подходящий контрол. Все правильно, Юрий, рациональное решение и кроме того в таком стиле можно обеспечить интеллектуальное выделение, например линий и пересекающихся контролов.

Но есть ограничение на количество конструируемых контролов ;) Правда оно обходится, главный регион можно пересоздать с большим FEQ.
Ну и сами регионы приходится во время редактирования представлять панельками, потому что иначе их просто не видно.
А это не понял, зачем? 8 региончиков-зацепов, выделенных цветом, что еще нужно?

Удачи!
__________________________________
Владимир Якимченко
Написал: ClaList(2)
Гость

Сообщение Гость »

Правда оно обходится, главный регион можно пересоздать с большим FEQ.
Зачем? Мы можем запомнить MaxField#=0{Prop:MaxField} и сразу создать регион с номером, например, 100000 .А потом создавать поля MaxField#+1, MaxField#+2 и тд . Но я нумерую с шагом 4, чтобы иметь возможность создавать "контейнеры" из нескольких элементов, например, кнопка с текстурой.
А это не понял, зачем? 8 региончиков-зацепов, выделенных цветом, что еще нужно?
А убрали зацепы - и где был регион ? Он же не имеет внешнего представления :). Кстати, если рисовать зацепы, например, на кнопку, они рисуются ПОД кнопкой и их не видно, приходится чуть отодвигать.

---------------------------------------
C уважением,
Юрий Философов
Написал: ClaList(2)
Ответить