| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Формы С++ |
| Автор: Marathon 16.12.2015, 11:09 |
| Доброе утро, форумчане. Есть программа, определяет выпуклый ли многоугольник или нет, и принадлежит ли заданная точка дачному полигону. Но просят сделать ввод координат точки, и координаты вершин через форму, раньше никогда не имел дело с этим, подскажите, пожалуйста, как это можно реализовать. |
| Автор: math64 16.12.2015, 12:35 |
| На чем программируешь? (Visual Studio, C++Builder, Qt, etc.) |
| Автор: Marathon 16.12.2015, 12:39 |
| math64, Builder |
| Автор: Marathon 16.12.2015, 16:06 |
| Разобрался с вводом точки и координаты,но вот как быть с вершинами, смысл понимаю, прогон по циклу и все такое,но в форме... Понятно, что появляется "Введите 1 точку" -> запоминается, затем обнуление ->"Введите точку 2" и т.д. Но вот как дело до реализации,что-то не получается. |
| Автор: xvr 16.12.2015, 16:10 |
Не понимаете |
| Автор: math64 17.12.2015, 08:16 |
| Либо список, либо таблица.Внизу(или вверху) LineEdit и кнопка Add для ввода и добавления новой точки. кнопка Delete для удаления текущей точки. кнопка Calc (или ещё как-то назови) - для вычисления выпуклый ли многоугольник кнопка Show - чтобы показать многоугольник |
| Автор: Marathon 17.12.2015, 13:06 |
| Как делать через Listbox не понял, да и мемо, что-то ткговато, раньше никогда с формами не работал, получается : пользователь вводит координаты в мемо, и они считываются затем strToInt или в цикл это надо? |
| Автор: Marathon 17.12.2015, 13:28 |
| Да и в целом как считывать координаты из мемо, т.е нужно чтобы в строчке было два числа, через пробел |
| Автор: math64 17.12.2015, 13:36 | ||
|
| Автор: Marathon 17.12.2015, 13:46 |
| math64,Спасибо большое, но, честно, ничего не понимаю, и как соединить с своим кодом,. С вершинами и точкой все просто. |
| Автор: Marathon 17.12.2015, 14:27 |
| math64, Начинает доходить |
| Автор: Marathon 17.12.2015, 14:50 | ||
Мне больше не понятно как связать форму эту и код.
|
| Автор: Marathon 17.12.2015, 15:12 |
| math64,Единственное, что я заменил в Вашем варианте Edit на MaskEdit, чтобы ограничить пользователя только цифрами. Но как их считать в программу выше вместо массива d [n]. Ну и очищение поля после ввода : MaskEdit1-> Clear (); Не знаю, насколько это грамотно. |
| Автор: xvr 17.12.2015, 15:25 |
Никак. Для начала создайте в Builder GUI проект (а не консольный, как у вас в коде). Дальше добавьте на форму все органы управления, которые math64 перечислил, создайте для них события (в дезайнере) и скопируйте код от math64 в них. И только потом можете копировать куски своего кода в готовые обработчики. |
| Автор: Marathon 17.12.2015, 15:48 |
| Мне не понятно как работает CalcButton |
| Автор: math64 17.12.2015, 16:09 |
| Ваш код (с соответствующими модификациями) вставляется или вызывается в CalcButtonClick(). По результату выполнения выполняете одно из действий: 1. Вызывается диалог с результатом и кнопкой OK. 2. Устанавлиается или сбрасывается CheckBox или результат вываоться на Label и устанавливается зелёный или красный фон. |
| Автор: Marathon 17.12.2015, 16:11 |
| Еще вопрос возник, ввести нужно количество вершин, в кнопке Add, как сделать счетчик, чтобы количество вводимых вершин было равно нажатию кнопки Add, или же как считать количество вершин из ЛистБокса Добавлено через 5 минут и 27 секунд Лучше, наверное, чтобы определять количество вершин из листбокса Добавлено через 7 минут и 22 секунды Опять же, наверное, через количество клипов по Add... |
| Автор: math64 17.12.2015, 16:34 |
| число кликов Add - число кликов Delete = число айтемов в ListBox = количество вершин А можно добавить кпонпки Load и Save - тогда считать клики будет бессмысленно. |
| Автор: Marathon 17.12.2015, 17:28 |
| math64, это понятно, но как записать что число итемов равно, например, n (количеству вершин). Извините, если задаю глупые вопросы, я только учусь и мне важно понимать |
| Автор: math64 18.12.2015, 08:11 |
| Заполнить список, имея полигон: Очистить список и вызвать Add n раз. Создать полигон имея список: n определяется по числу итемов в списке, потом итемы перебираются в цикле - примерный код я уже давал. К сожалению, Билдер не поддерживает разделение Модель-Вид-Контроллер и создавать модель (в Вашем случае - полигон) из вид (ЛистБокс) и наоборот и поддерживать их синхронизацию приходится самостоятельно |
| Автор: Marathon 18.12.2015, 10:15 | ||||
При написании строчки
|
| Автор: math64 18.12.2015, 10:41 |
| опечатка: Strings. После ввода "ListBox1->Items->" Билдер выдаст подсказку, какие есть свойства/методы у Items. У тебя уже есть свое объявление struct point {int x,int y}. Нужно просто point*poligon. Не нуджно тупо брать мой код 1:1 - он только иллюстрация, как делать. |
| Автор: Marathon 18.12.2015, 10:59 |
| Не показывает, после ввода листбокс1 не выводит подсказку, только ошибку |
| Автор: math64 18.12.2015, 13:41 |
| Ошибку выдает при компиляции, а подсказку - при редактировании, после ввода "->". Если код копипастится, никакой подсказки не будет. |
| Автор: Marathon 18.12.2015, 13:47 |
| Пишу все вручную, и подсказка на этом моменте не выскакивает Добавлено через 9 минут и 38 секунд Хоть убей не понимаю, как он должен считывать и присваивать Х или У. Как это работает. Исправил MaskEdit, просто на Edit, вводить только числа , иначе выскакивает ошибка и пробел между точками. Как это все делать я понял |
| Автор: Marathon 19.12.2015, 20:03 |
| А если разделить на два поля Эдик Х и У может проще будет |
| Автор: math64 20.12.2015, 00:03 |
| Можно. Но тогда вместо листбокс логичнее будет использовать стринггрид. |
| Автор: Marathon 22.12.2015, 11:52 |
| math64, Организовывается это тоже через цикл, с отделением координаты Х от У? |
| Автор: math64 22.12.2015, 12:38 |
| Конечно через цикл. Как использовать грид - смотри документацию и примеры, идущие с Билдером. При использовании грид (не стринггрид) можно организовать разделение модель/вид: в GridDrawCell() рисовать данные из модели. Но число строк грида нужно устанавливать по числу вершин полигона. |
| Автор: Marathon 22.12.2015, 14:51 | ||||
math64, в цикле, который ты присылал, первые строчки
Понятно что это количество строк, n - целое,
Т.е с этого момента начинается разделение на координаты, так а конвертация инт в поинт? И если не сложно, построчно описать что в них собственно происходит |
| Автор: math64 23.12.2015, 08:26 | ||
|
| Автор: Marathon 23.12.2015, 12:19 |
| math64, И еще такой вопрос, а как задать, чтобы вводимое число в Edit = количеству заполняем строчек в Stringgrid |
| Автор: WileyJohn 11.1.2016, 13:08 | ||
math64, Вот у меня почти аналогичная задача, но без всяких выпуклых - вогнутых, по примеру делал как тут,но выдавало некоторые ошибки, в итоге сделал так, но тоже кривенько,может подскажите что не так, пожалуйста
|