Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > C++Builder. Вызов формы.


Автор: Anark1 15.12.2006, 18:20
Недавно начал писать на C++. Использую Borland C++ Builder v 6.0.
Для реализации моей программы необходимо вызвать вторую форму. При попытке функции Showmodal(). smile  выдается ошибка о том, что не существует вторая форма. В мэнэджере функций я включил обе формы.
Если не сложно пропишите код для нажатия кнопки - запуск формы.
+ Хотелось бы услышать алгоритм для следующей программы - В списке ListBox есть несколько элементов. Можно открыть для каждого элемента своё меню, в котором лежит своя информация, это меню можно редактировать. Но создается только одна шаблонная форма. И под каждый элемент в этом шаблоне должна лежать своя информация. Пример в программах - список контактов в ICQ и инфо о контакте. То есть для всех контактов своя инфа, но одинаковый шаблон заполнения.
Помогите начинающему программеру.  
 smile 

Автор: witex 15.12.2006, 18:48
Скорее всего, ты зыбыл в главной форме забыл сделать инклуд  .h файла, втрой формы.
Потом надо создать указатель на класс, и только потом SHowModal();
Код

#include "form2.h"

TForm2 *form2;
form2->ShowModal();


а насчёт шаблоно, сделай опыять же форму, заполняемую из файла к примро по id. 
А при клик на отдельный элемент берёшь его id, загружаешь инфу из файла по id и потом показываешь форму!

Автор: Anark1 15.12.2006, 21:29
Спасибо. Можно поподробнее про ID? 

Автор: Anikmar 16.12.2006, 00:14
Цитата(witex @ 15.12.2006,  18:48)
Код

#include "form2.h"

TForm2 *form2;
form2->ShowModal();


Приведенный пример может не работать - указатель непроинициализирован.
В Билдере 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,  21:16)
Как лучше разбить строку в файле чтобы можно было легко считывать для каждого поля свою информацию?

Я не люблю текстовые файлы. Я бы делал в собственном формате.
Текстовые файлы - стандартно разбиваем, табуляцией. Преимущества такого подхода - этот файл легко формируется в экселе.

Автор: Anark1 16.12.2006, 22:53
Собственный формат? база данных?

Автор: Anikmar 17.12.2006, 12:49
Цитата(Anark1 @ 16.12.2006,  22:53)
Собственный формат? база данных?

Там что, будет 10000 записей? Тогда надо использовать нормальную СУБД
А если на 20 - 100 записей, то можно и в файл сохранить

Автор: Anark1 17.12.2006, 16:52
Все правильно прописал. При запуске программы, при нажатии кнопки, которая отвечает за вызов второй формы выкидывается сообщение об ошибке ехе-файла. Код ошибки или имеет вид 0000000., или не умещается в окне. Что это? Все таки решил использовать базу данных. Хочется чтобы пользователь работал с окном, где видны все поля ввода, а не талбица. Можно ли работать с базой, не создавая таблицу непосредственно в форме? Если да то какие компоненты?

Автор: Anark1 17.12.2006, 22:11
 smile 

Автор: Anikmar 18.12.2006, 00:05
Цитата(Anark1 @ 17.12.2006,  16:52)
Все правильно прописал. При запуске программы, при нажатии кнопки, которая отвечает за вызов второй формы выкидывается сообщение об ошибке ехе-файла. Код ошибки или имеет вид 0000000., или не умещается в окне. Что это? Все таки решил использовать базу данных. Хочется чтобы пользователь работал с окном, где видны все поля ввода, а не талбица. Можно ли работать с базой, не создавая таблицу непосредственно в форме? Если да то какие компоненты?

Все смещалось в доме Обломских....

В первую очередь вас интересует вызов форму или БД? Если ваша программа выдает некую ошибку - код в студию. Если интересуют вопросы подключения и использования БД - опишите задачу.

Автор: Anark1 18.12.2006, 18:22
2Anikmar
Ну уж извини.
1)О форме.
Есть две формы.
Первая - Main. Вторая - доступна ( В окне мэнэджера). При нажатии на кнопку "Добавить" должна открыться Form2 в модальном режиме.
Код

#include <mhat2.h> {Форма 2}
...
void _fastcall TForm1::Button1Click (TObject* Sender)
Form2->ShowModal;

Компилятор ошибок не выявляет и программа запускается. Всплывает форма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
Цитата(Anark1 @ 18.12.2006,  19:35)
Что значит инициализирована? И что значит ссвободная?

В проекте есть настройки создания форм. Если AutoCreate - значит форма автоматически создается при запуске приложения. Если она в окошке "Available" - значит ее нужно в приложении создавать с помощью оператора new

Надо открыть меню Projects->Options и посмотреть как создается Form2

Автор: Anark1 18.12.2006, 20:09
Спасибо, мэн. У меня Form2 была Available. Все теперь рабоатет. А вообще как полезно использовать Available. Ведь с виду без разницы как форму запускать?
+ Не напишешь алгоритм для проги?
И ответь плз про базы.

Автор: Anikmar 19.12.2006, 10:47
Цитата(Anark1 @ 18.12.2006,  20:09)
Спасибо, мэн. У меня Form2 была Available. Все теперь рабоатет. А вообще как полезно использовать Available. Ведь с виду без разницы как форму запускать?
+ Не напишешь алгоритм для проги?
И ответь плз про базы.

Тут двояко можно смотреть на этот момент. Созданные автоматически формы всегда находятся в памяти и если их много, то получается расстояительно. Лично я обычно создаю их самостоятельно, но если их немного, то можно и автоматом.

Теперь по поводу БД. В стандарте билдера есть некий движок BDE (чисто борландовская тема). Работает неплохо, но имеются некоторые трудности с установкой на другую машину.

Лично я использую компоненты ADO.

По поводу самой СУБД - тут дело вкуса. Я использую MS SQL 2000. Для более простых задач достаточно использовать PARADOX, но надо сразу определиться - будит ли программа многопользовательская или нет. PARADOX весьма криво поддерживает многопользовательский режим и вероятность слетания базы в нем выше.

По поводу алгоритма - я пока честно говоря не понял задачи. Что должна вцелом реализовывать программа.

Автор: Anark1 19.12.2006, 17:04
Я уже создал базу данных. Подредактировал кодировку PARADOX.  С этим проблем нет.
Программа - лист контактов в главной форме + кнопки управления и вторая всплывающая форма, которая содержит информацию по текущему контакту. Можно ли это реализовать при помощи базы данных?

Автор: Syrex 19.12.2006, 17:37
Цитата

Я уже создал базу данных. Подредактировал кодировку PARADOX.  С этим проблем нет.
Программа - лист контактов в главной форме + кнопки управления и вторая всплывающая форма, которая содержит информацию по текущему контакту. Можно ли это реализовать при помощи базы данных?

Легко

Лучше использовать не PARADOX, а ACCESS

Автор: Anark1 19.12.2006, 17:54
В чем разница между PARADOX и ACCESS?
Можно увидеть алгоритм? Мне не очень понятно как сделать так, чтобы для каждого контаккта отображалась своя инофрмация. То есть, команды для работы с ячейками, строками. столюцами. полями базы данных.  smile 

Автор: Syrex 20.12.2006, 10:27
Сейчас сам ищу разницу.
1. Удобнее работать с датами
2. Легче настраивать
3. В Access нет геммороя с BDE

Форму лучше создавать самому (Available), а не хранить х в памяти.
Код

Form2=new TForm2(this);
From2->ShowModal();


Вот только не знаю, надо ли потом делать delete Form2?

Автор: Anark1 20.12.2006, 15:42
Что означает ключевое слово THIS в скобках?
З.Ы.
Можно увидеть алгоритм? Мне не очень понятно как сделать так, чтобы для каждого контаккта отображалась своя инофрмация. То есть, команды для работы с ячейками, строками. столюцами. полями базы данных.    

 smile  smile  smile 

Автор: Anikmar 20.12.2006, 16:22
Цитата(Syrex @ 20.12.2006,  10:27)
Сейчас сам ищу разницу.
1. Удобнее работать с датами
2. Легче настраивать
3. В Access нет геммороя с BDE

Форму лучше создавать самому (Available), а не хранить х в памяти.
Код

Form2=new TForm2(this);
From2->ShowModal();


Вот только не знаю, надо ли потом делать delete Form2?

Лучше создавать форму, передавая ей в качестве параметра не this, а Application

Использовать delete надо, если в событии формы OnClose параметр CloseAction не устанавливается в значение caFree.

По поводу алгоритма:
Там нет никакого алгоритма! Есть список записей - отображается стандартным контролом, допустим DBGrid. Обрабаотываем двойной щелчок. Считываем текущую запись, на основе ее формируем запрос на выборку необходимой информации из БД и уже отображаем ее во второй форме.

Автор: Anark1 20.12.2006, 17:26
Не  smile сложно прописать тут команды для работы с базой данных?

Автор: 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 начать?smile

Автор: Syrex 21.12.2006, 11:04
я бы сделал так:
Код

ADOQuery->SQL->Text->Clear();
ADOQuery->SQL->Text = "SELECT * FROM MyTable";
ADOQuery->SQL->Active=true;


Код

ADOQuery->SQL->Text->Clear();
ADOQuery->SQL->Text = "INSERT INTO MyTable (Pole1,Pole2,Pole3) values ('name',12.23,:D)
ADOQuery->Parameters->Items[0]->Value=DateToString(Data);
ADOQuery->ExecSQL(); // используется для запросов Insert Delete UPDATE
ADOQuery->SQL->Text->Clear();
ADOQuery->SQL->Text = "SELECT * FROM MyTable";
ADOQuery->SQL->Active=true;

Автор: Anark1 21.12.2006, 13:00
Цитата(HappyLife @ 21.12.2006,  10:17)
Кхм.... Может быть лучше с Hello world начать?smile

Все эти консольные приложения это элементарно. Хорошо зная Турбо Паскаль это не сложно перенести свои знания. В Си.
 Остальным спасибо. будут вопросы - напишу.

Автор: Syrex 21.12.2006, 13:10
Если что - у мня есть программа работы с БД с помощью ADO

Автор: Anark1 21.12.2006, 15:13
А обязательно использовать Query?
Например, у меня заполнена форма 2 с данными для первого поля таблицы.
Почему нельзя использовать методы при клик кнопки ОК на форме:
Form1->Table1->Append();
Form1->Table1->Pos();
и т.д.
Только как каждмоу полю строки придать свою информацию.
А если использовать Query то поясните пожалста как правильно настроить свойство SQL?

Автор: Anikmar 21.12.2006, 16:02
Цитата(Anark1 @  21.12.2006,  15:13 Найти цитируемый пост)
А если использовать Query то поясните пожалста как правильно настроить свойство SQL? 

Свойство SQL - это собственно твой запрос. Почитай для начала описание языка SQL, а пока пользуйся TTable - для изучения пойдет.

Автор: 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
То есть пользователь не будет видеть эту таблицу? smile 

Автор: Anikmar 21.12.2006, 20:42
Цитата(Anark1 @ 21.12.2006,  19:42)
То есть пользователь не будет видеть эту таблицу? smile

Я говорю таблица в понимании Таблица базы данных. А как ее отобразить на форме - это уже личное дело программиста.
Не нравится DBGrid используй DBControlGrid либо вообще вручную поля показывает в том, что душа пожелает - хоть с TStatusBar  smile 

Автор: Anark1 21.12.2006, 21:45
Оке. Попробую.

Автор: OutlawZ 29.8.2008, 10:37
Зачем что то инициализировать? если нужно что бы просто по нажатию на кнопку вылетала вторая форма то делаем так, есть первый проект, создаем вторую форму как показано ниже:
Код

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h" //Подключаем вторую форму .h второго проекта формы
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form2->ShowModal(); //Вызываем ее
}


И все работает!!!! 

Автор: mrbrooks 29.8.2008, 11:20
OutlawZ, имхо я думаю что спустя два года проблему уже решили  smile 

Автор: OutlawZ 29.8.2008, 11:33
Сорри не посмотрел на дату smile

Автор: Goodilla 11.1.2010, 15:43
Цитата(OutlawZ @  29.8.2008,  09:33 Найти цитируемый пост)
Сорри не посмотрел на дату smile 


Зато помогло, спасибо. А то читал весь пост - мало чего получилось... Так сказать основная часть поста не для начинающих.  smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)