| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > C++Builder. Вызов формы. |
| Автор: Anark1 15.12.2006, 18:20 |
| Недавно начал писать на C++. Использую Borland C++ Builder v 6.0. Для реализации моей программы необходимо вызвать вторую форму. При попытке функции Showmodal(). Если не сложно пропишите код для нажатия кнопки - запуск формы. + Хотелось бы услышать алгоритм для следующей программы - В списке ListBox есть несколько элементов. Можно открыть для каждого элемента своё меню, в котором лежит своя информация, это меню можно редактировать. Но создается только одна шаблонная форма. И под каждый элемент в этом шаблоне должна лежать своя информация. Пример в программах - список контактов в ICQ и инфо о контакте. То есть для всех контактов своя инфа, но одинаковый шаблон заполнения. Помогите начинающему программеру. |
| Автор: witex 15.12.2006, 18:48 | ||
| Скорее всего, ты зыбыл в главной форме забыл сделать инклуд .h файла, втрой формы. Потом надо создать указатель на класс, и только потом SHowModal();
а насчёт шаблоно, сделай опыять же форму, заполняемую из файла к примро по id. А при клик на отдельный элемент берёшь его id, загружаешь инфу из файла по id и потом показываешь форму! |
| Автор: Anark1 15.12.2006, 21:29 |
| Спасибо. Можно поподробнее про ID? |
| Автор: Anikmar 16.12.2006, 00:14 | ||||
Приведенный пример может не работать - указатель непроинициализирован. В Билдере 2 варианта создания форм (настраивается в своствах проекта) - автоматически, это форма создается на этапе инициализации приложения и вручную - тогда форму необходимо создать самому, используя new. В приведенном выше примере подразумевается, что указатель на форму содержит действительно указатель на форму (т.е. форма создана при инициализации приложения) Если брать примером аську - там используется обычное PopUp меню. По реализации могу предложить следующий вариант: В комбобоксе - список неких значений. К комбобоксу цепляему PopUp меню, которое содержит набор (шаблон) действий. При вызове этого меню - берем текущий индекс Комбобокса (или другим способом узнаем текущее его значение) - и уже действуем. Все дело происходит в обработчике PopUp меню. |
| Автор: Anark1 16.12.2006, 20:48 |
| Да. Для ввода согласен. А для просмотра информации? То есть когда мы уже открываем готовый контакт. Может быть стоит создать txt, в котором на каждой строке будет лежать информация по контакту? |
| Автор: Anikmar 16.12.2006, 20:59 |
| Список контактов в файле. загружаем файл. В Листбокс выводим ключевые поля. При нажатии кнопки в листбоксе выводим дополнительную форму с информацией. |
| Автор: Anark1 16.12.2006, 21:16 |
| Ключевые поля? В данном случае имя контакта, так? Если вторая форма содержит несколько полей? Как лучше разбить строку в файле чтобы можно было легко считывать для каждого поля свою информацию? |
| Автор: Anikmar 16.12.2006, 21:23 | ||
Я не люблю текстовые файлы. Я бы делал в собственном формате. Текстовые файлы - стандартно разбиваем, табуляцией. Преимущества такого подхода - этот файл легко формируется в экселе. |
| Автор: Anark1 16.12.2006, 22:53 |
| Собственный формат? база данных? |
| Автор: Anikmar 17.12.2006, 12:49 | ||
Там что, будет 10000 записей? Тогда надо использовать нормальную СУБД А если на 20 - 100 записей, то можно и в файл сохранить |
| Автор: Anark1 17.12.2006, 16:52 |
| Все правильно прописал. При запуске программы, при нажатии кнопки, которая отвечает за вызов второй формы выкидывается сообщение об ошибке ехе-файла. Код ошибки или имеет вид 0000000., или не умещается в окне. Что это? Все таки решил использовать базу данных. Хочется чтобы пользователь работал с окном, где видны все поля ввода, а не талбица. Можно ли работать с базой, не создавая таблицу непосредственно в форме? Если да то какие компоненты? |
| Автор: Anark1 17.12.2006, 22:11 |
| |
| Автор: Anikmar 18.12.2006, 00:05 | ||
Все смещалось в доме Обломских.... В первую очередь вас интересует вызов форму или БД? Если ваша программа выдает некую ошибку - код в студию. Если интересуют вопросы подключения и использования БД - опишите задачу. |
| Автор: Anark1 18.12.2006, 18:22 | ||
| 2Anikmar Ну уж извини. 1)О форме. Есть две формы. Первая - Main. Вторая - доступна ( В окне мэнэджера). При нажатии на кнопку "Добавить" должна открыться Form2 в модальном режиме.
Компилятор ошибок не выявляет и программа запускается. Всплывает форма1, жмем "Добавить" и вылезает ошибка : "Access violation at adress 00401CFF in module "mxat.exe". Read of 00000000." С единственной кнопкой - ОК. 2) Формулирую смысл программы. В главной форме есть компонент ListBox, в котором перечислены имена контактов, и кнопки компоненты для управления списком. При нажатии Добавить или Редактировать\Смотреть всплывает форма2, в которой и вводится информация. Хочется реализовать это с помощью базы данных. И можно ли это сделать таким образом, чтобы не чертить саму таблицу. Как бы работать с базой которая нигде не видна пользователю. Нужно ли её создавть и скрывать, или можно создать как бы "абстрактную" базу. Которая висит в памяти и работает с программой. |
| Автор: Anikmar 18.12.2006, 19:02 |
| Form2 - инициализирован? Эта форма точно создана или в проекте значится как свободная? |
| Автор: Anark1 18.12.2006, 19:35 |
| Что значит инициализирована? И что значит ссвободная? |
| Автор: Anikmar 18.12.2006, 20:05 | ||
В проекте есть настройки создания форм. Если AutoCreate - значит форма автоматически создается при запуске приложения. Если она в окошке "Available" - значит ее нужно в приложении создавать с помощью оператора new Надо открыть меню Projects->Options и посмотреть как создается Form2 |
| Автор: Anark1 18.12.2006, 20:09 |
| Спасибо, мэн. У меня Form2 была Available. Все теперь рабоатет. А вообще как полезно использовать Available. Ведь с виду без разницы как форму запускать? + Не напишешь алгоритм для проги? И ответь плз про базы. |
| Автор: Anikmar 19.12.2006, 10:47 | ||
Тут двояко можно смотреть на этот момент. Созданные автоматически формы всегда находятся в памяти и если их много, то получается расстояительно. Лично я обычно создаю их самостоятельно, но если их немного, то можно и автоматом. Теперь по поводу БД. В стандарте билдера есть некий движок BDE (чисто борландовская тема). Работает неплохо, но имеются некоторые трудности с установкой на другую машину. Лично я использую компоненты ADO. По поводу самой СУБД - тут дело вкуса. Я использую MS SQL 2000. Для более простых задач достаточно использовать PARADOX, но надо сразу определиться - будит ли программа многопользовательская или нет. PARADOX весьма криво поддерживает многопользовательский режим и вероятность слетания базы в нем выше. По поводу алгоритма - я пока честно говоря не понял задачи. Что должна вцелом реализовывать программа. |
| Автор: Anark1 19.12.2006, 17:04 |
| Я уже создал базу данных. Подредактировал кодировку PARADOX. С этим проблем нет. Программа - лист контактов в главной форме + кнопки управления и вторая всплывающая форма, которая содержит информацию по текущему контакту. Можно ли это реализовать при помощи базы данных? |
| Автор: Syrex 19.12.2006, 17:37 | ||
Легко Лучше использовать не PARADOX, а ACCESS |
| Автор: Anark1 19.12.2006, 17:54 |
| В чем разница между PARADOX и ACCESS? Можно увидеть алгоритм? Мне не очень понятно как сделать так, чтобы для каждого контаккта отображалась своя инофрмация. То есть, команды для работы с ячейками, строками. столюцами. полями базы данных. |
| Автор: Syrex 20.12.2006, 10:27 | ||
| Сейчас сам ищу разницу. 1. Удобнее работать с датами 2. Легче настраивать 3. В Access нет геммороя с BDE Форму лучше создавать самому (Available), а не хранить х в памяти.
Вот только не знаю, надо ли потом делать delete Form2? |
| Автор: Anark1 20.12.2006, 15:42 |
| Что означает ключевое слово THIS в скобках? З.Ы. Можно увидеть алгоритм? Мне не очень понятно как сделать так, чтобы для каждого контаккта отображалась своя инофрмация. То есть, команды для работы с ячейками, строками. столюцами. полями базы данных. |
| Автор: Anikmar 20.12.2006, 16:22 | ||||
Лучше создавать форму, передавая ей в качестве параметра не this, а Application Использовать delete надо, если в событии формы OnClose параметр CloseAction не устанавливается в значение caFree. По поводу алгоритма: Там нет никакого алгоритма! Есть список записей - отображается стандартным контролом, допустим DBGrid. Обрабаотываем двойной щелчок. Считываем текущую запись, на основе ее формируем запрос на выборку необходимой информации из БД и уже отображаем ее во второй форме. |
| Автор: Anark1 20.12.2006, 17:26 |
| Не |
| Автор: Syrex 20.12.2006, 18:48 |
| В адо используются стандартные команды SQL |
| Автор: Anark1 20.12.2006, 19:36 |
| Для меня это ничего не меняет. Че, так сложно? |
| Автор: Anikmar 21.12.2006, 10:08 |
| Пример чего? Например так: MyQuery->SQL->Text = "SELECT * FROM MyTable"; MyQuery->Open(); ... MyQuery->Close(); Компоненты ADO располагаются на форме (или модуле данных), в них настраивается подключение к БД, там же можно задать операторы SQL, на форме размещаются компоненты доступа к данным и DatabaseControls - и вперед! |
| Автор: HappyLife 21.12.2006, 10:17 |
| Кхм.... Может быть лучше с Hello world начать? |
| Автор: Syrex 21.12.2006, 11:04 | ||||
я бы сделал так:
|
| Автор: Anark1 21.12.2006, 13:00 | ||
Все эти консольные приложения это элементарно. Хорошо зная Турбо Паскаль это не сложно перенести свои знания. В Си. Остальным спасибо. будут вопросы - напишу. |
| Автор: Syrex 21.12.2006, 13:10 |
| Если что - у мня есть программа работы с БД с помощью ADO |
| Автор: Anark1 21.12.2006, 15:13 |
| А обязательно использовать Query? Например, у меня заполнена форма 2 с данными для первого поля таблицы. Почему нельзя использовать методы при клик кнопки ОК на форме: Form1->Table1->Append(); Form1->Table1->Pos(); и т.д. Только как каждмоу полю строки придать свою информацию. А если использовать Query то поясните пожалста как правильно настроить свойство SQL? |
| Автор: Anark1 21.12.2006, 16:38 |
| 2Anikmar Я так понимаю, что связь между моим ЛистБоксом и БД осуществляется через Name. То есть первое поле БД и элементы списка. Так вот каким методом мне прописать каждому полю свою информацию? Через Table. |
| Автор: Anikmar 21.12.2006, 16:42 |
| Надо использовать компоненты с вкладки DataControls Там есть компоненты, работающие с БД - DBGrid, DBEdit и т.п. В них есть свойство DataSource и FieldName (в DBGrid - Columns) Устанавливаешь при помощи этих свойств связь с БД и вперед. Там же выше предлагали готовый проектик для изучения... И вообще - все-таки надо бы чего-нибудь прочитать. Например Архангельского. |
| Автор: Anark1 21.12.2006, 19:02 |
| Архангельского скачал. Насколько я знаю DBGrid рисует таблицу. Мне это не нужно. Возможно установить связь с БД, не создавая её в форме? |
| Автор: Anikmar 21.12.2006, 19:30 | ||
Кого не создавая? БД? А зачем ее создавать в форме? DBGrid - ОТОБРАЖАЕТ ТАБЛИЦУ БД Он ее на создает. Если есть готовая таблица - ее можно увидеть, используя DBGrid - он предоставляет возможность передвигаться по записям и редактировать поля таблицы. Если интересует только 1 запись - можно сделать SELECT только на одну конкретную запись и менять значения полей при помощи одиночных контролов работы с БД - таких как DBEdit. |
| Автор: Anark1 21.12.2006, 19:42 |
| То есть пользователь не будет видеть эту таблицу? |
| Автор: Anikmar 21.12.2006, 20:42 | ||
Я говорю таблица в понимании Таблица базы данных. А как ее отобразить на форме - это уже личное дело программиста. Не нравится DBGrid используй DBControlGrid либо вообще вручную поля показывает в том, что душа пожелает - хоть с TStatusBar |
| Автор: Anark1 21.12.2006, 21:45 |
| Оке. Попробую. |
| Автор: OutlawZ 29.8.2008, 10:37 | ||
Зачем что то инициализировать? если нужно что бы просто по нажатию на кнопку вылетала вторая форма то делаем так, есть первый проект, создаем вторую форму как показано ниже:
И все работает!!!! |
| Автор: mrbrooks 29.8.2008, 11:20 |
| OutlawZ, имхо я думаю что спустя два года проблему уже решили |
| Автор: OutlawZ 29.8.2008, 11:33 |
| Сорри не посмотрел на дату |
| Автор: Goodilla 11.1.2010, 15:43 |
Зато помогло, спасибо. А то читал весь пост - мало чего получилось... Так сказать основная часть поста не для начинающих. |