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


Автор: php5 13.1.2009, 16:36
Имеется многооконное приложение для роботы с БД   при клике  по кнопке открывается  окно  в которое загружаются данные  из БД,  так  вот необходимо как то  пере появлением  содержания  окна  предать    id  для выборки из базы данных, с учетом того что таких окон одновременно может быть открыто  большое количество 

Автор: MAXIQ 13.1.2009, 16:58
Окно создается на базе класса ? Может конструктор с параметрами замутить? 

Автор: orthrus 13.1.2009, 17:02
Как окно создаешь?

Автор: php5 13.1.2009, 17:48
Окно создается классически
Application->CreateForm(__classid(TForm1), &Form1);
Form1->Show();

Автор: vikaz 14.1.2009, 07:52
Когда мне надо было что-то подобное, то я делал класс, и в этом классе создавал окно динамически  и прописывал весь функционал. Естественно, в конструктор мог передать любые параметры.

Автор: Vyacheslav 14.1.2009, 14:21
Цитата(php5 @  13.1.2009,  17:48 Найти цитируемый пост)
Окно создается классически
Application->CreateForm(__classid(TForm1), &Form1);
Form1->Show();


Убираете окно из списка автосоздаваемых и создаете через new. В конструктор своей формы добавляете нужны параметр. Если нужно  добавить только один параметр и этот параметр int, то параметры  следует  поменять местами, иначе получится, что Вы "перегрузили" служебный конструктор TForm(Component *Owner, int)

Код


__fastcall  TForm1::TForm1(int id,  TComponent* Owner) :TForm( Owner) { ... }


  
Вызов формы в коде
Код

// если никаких обращенией к форме в коде не предвидтся, то
  (new TForm1(this, id))->Show(); 
// или если установить Visible в true в дизайне, то просто
  new TForm1(this, id);

// если предполагаются  обращения к форме в коде  то
TForm1* form1 =NULL;
...
form1 =  new TForm1(this, id);

   
  
PS
Чтобы не заморачиваться  с удалением формы по закрытию, не забыть установить для формы  в обработчике OnClose. 
Код


Action = caFree


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

Надеюсь, ничего не напутал. На билдере уже 4 года не работаю

Автор: vikaz 19.4.2009, 16:16
Всем добрый день! Решил написать здесь, так как темы взаимосвязаны.
У меня вопрос  в сл.
Как передать параметр в форму с нами поделился многоуважаемый Vyacheslav.
Но вот как забрать из этой формы какой нибудь параметр, int, char, AnsiString и вернуть этот параметр в то место откуда он был вызван?
Заранее спасибо.


На данный момент, я просто создал переменную extern и пробрасываю через неё. Но может есть более правильное и рациональное решение данной проблемы?

Автор: Anikmar 19.4.2009, 20:38
Цитата(vikaz @  19.4.2009,  16:16 Найти цитируемый пост)
Как передать параметр в форму с нами поделился многоуважаемый Vyacheslav.
Но вот как забрать из этой формы какой нибудь параметр, int, char, AnsiString и вернуть этот параметр в то место откуда он был вызван?

Я передаю вместе с параметрами адрес структуры, в которую форма мне все что нужно пишет.

Автор: vikaz 19.4.2009, 20:53
Anikmar спасибо большое за подсказку, не сообразил. 

Автор: Лапоть 19.4.2009, 21:57
Цитата(vikaz @  19.4.2009,  17:16 Найти цитируемый пост)
как забрать из этой формы какой нибудь параметр, int, char, AnsiString и вернуть этот параметр в то место откуда он был вызван?

А свойства класса для этой формы (в том числе - и добавленные) никто пользовать не запрещает. smile 

Автор: vikaz 20.4.2009, 08:25
Anikmar, Лапоть  smile 
Просто у меня вот в чем возникла проблема. Я могу вернуть параметр или структуру, но это только когда какая-то операция делается в конструкторе. А если мне нужно вернуть параметры, когда я уже сделал какие-то действия на форме, вот так у меня возвращаются пустые значения и это понятно. Вот как это победить?
Заранее спасибо!

Автор: mrbrooks 20.4.2009, 08:54
Цитата(vikaz @  20.4.2009,  08:25 Найти цитируемый пост)
А если мне нужно вернуть параметры, когда я уже сделал какие-то действия на форме, вот так у меня возвращаются пустые значения и это понятно. Вот как это победить?


Цитата(Лапоть @  19.4.2009,  21:57 Найти цитируемый пост)
А свойства класса для этой формы (в том числе - и добавленные) никто пользовать не запрещает.

То бишь если продолжить мысль камрада - юзай переменные описанные в классе используемой формы.

Автор: vikaz 20.4.2009, 09:30
Понятно, все гениальное в ......
Все спасибо!

Автор: artsb 20.4.2009, 12:50
Цитата(vikaz @  20.4.2009,  08:25 Найти цитируемый пост)
Просто у меня вот в чем возникла проблема. Я могу вернуть параметр или структуру, но это только когда какая-то операция делается в конструкторе. А если мне нужно вернуть параметры, когда я уже сделал какие-то действия на форме, вот так у меня возвращаются пустые значения и это понятно. Вот как это победить?

Объявляете в .h файле второй формы структуру, создаёте на неё указатель в закрытой области класса. Также как вам советовали, передаёте в конструкторе указатель на структуру, которую нужно заполнить и присваиваете этот указатель указателю второй формы. В общем, что-то типа:
Unit2.h
Код

//---------------------------------------------------------------------------

#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
typedef struct
{
  AnsiString str1, str2;
} mData;
class TForm2 : public TForm
{
__published:    // IDE-managed Components
        TEdit *Edit1;
        TEdit *Edit2;
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
mData* myData;
public:        // User declarations

        __fastcall TForm2(TComponent* Owner);
        __fastcall TForm2(TComponent* Owner, mData* Data);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif

Unit2.cpp
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner, mData* Data)
        : TForm(Owner)
{
myData = Data;
}
//---------------------------------------------------------------------------

void __fastcall TForm2::Button1Click(TObject *Sender)
{
myData->str1 = Edit1->Text;
myData->str2 = Edit2->Text;
}

Unit1.cpp
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
mData* myData = new mData;
TForm2* form = new TForm2(Application, myData);
if(form->ShowModal() == mrOk)
{
  Edit1->Text = myData->str1;
  Edit2->Text = myData->str2;
}
delete myData;
delete form;
}


Естественно, нужно делать кучу проверок, но я не стал их писать. smile

Автор: vikaz 20.4.2009, 18:52
artsb, спасибо огромное!!!

Автор: vikaz 20.4.2009, 20:24
Камрад, если не сложно, разъясни код. Чего то в голове нет и не могу сложить картину в одно целое. Почему он работает?

Автор: Anikmar 20.4.2009, 22:14
Цитата(vikaz @  20.4.2009,  20:24 Найти цитируемый пост)
если не сложно, разъясни код

Достаточно сложно разъяснить такой код. Сложно найти - что разъяснять.
Что вам непонятно?

Автор: artsb 21.4.2009, 00:39
Цитата(vikaz @  20.4.2009,  20:24 Найти цитируемый пост)
Камрад, если не сложно, разъясни код. Чего то в голове нет и не могу сложить картину в одно целое. Почему он работает? 

Сначало, в Unit2.h описываем новый тип данных, представляющий собой структуру и указатель на объект такого типа в закрытой области класса. Когда мы подключаем Unit2.h в Unit1.h этот тип данных становится доступным и там. Создаём новый конструктор для второй формы, где в качестве второго параметра будет передаваться структура. В реализации просто пишем:
Код

__fastcall TForm2::TForm2(TComponent* Owner, mData* Data)
        : TForm(Owner)
{
myData = Data;
}

Таким образом, указатель, объявленный во второй форме, ссылается теперь на структуру, созданную в первой.
При нажатии Button1 на первой форме, создаём объект определённого нами типа, создаём вторую форму и передаём в качестве второго параметра конструктора указатель на наш объект.
В обработчике нажатия Button1 на второй форме, заполняем поля нашего объекта данными и форма закрывается.
В первой форме проверяем, была ли нажата кнопка (а, следовательно, заполнена наша структура). Если да, выдираем инфу из нашей структуры и куда-нибудь её засовываем.
В самом конце оставляем за собой порядок: удаляем наш объект и вторую форму.

Ну вот, вроде, всё...

Автор: vikaz 21.4.2009, 05:33
Огромное спасибо за разъяснение. Всем по плюсу в бортовой журнал. smile

Автор: THandle 21.4.2009, 11:16
Иногда может понадобится и метод с сообщениями Windows, к примеру. Создавать свои сообщения для каких-то уведомлений. Но это конечно больше используется в двух разных программах, либо в прогах с плагинами. Но иногда бывает удобно и в просто несколькоформенном приложении задействовать такой механизм smile

Автор: artsb 21.4.2009, 11:46
THandle, пример в студию!  smile 

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