На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Обработка события кнопки на виртуальной форме
    Понимаю, что эта тема избита. Перечитала множество статей и ссылок. Но не получается :wall: :wall: :wall: Помогите.
    Суть в том, чтово время события Greate Form1 хочу подключить другой cpp и .h файлы. Это успешно делаю. В новом cpp файле создаю функцию, в которой динамически создаю виртуальную форму FormConnect. Все работает. А вот когда на форму бросаю кнопку и прописываю на нее событие, компеляции не происходит. Кнопка не опознается.
    Код сокращенный такой:

    .cpp основной
    ExpandedWrap disabled
      #pragma hdrstop
       
      #include "Unit1.h"
      #include "Conn.h"
       
       void __fastcall TForm1::FormCreate(TObject *Sender)
      {
       SERVER_REGI();  //функция
      }
      //---------------------------------------------------------------------------

    .h не привожу. Тут все понятно.

    Далее привожу коды cpp и .h файлов, которые подключаю.

    ExpandedWrap disabled
      #include <vcl.h>
      #pragma hdrstop
       
      #include "Conn.h"
      #include "Unit1.h"
       
       void  SERVER_REGI()
      {
       
          TForm *FormConnect =new TForm(Application);
             FormConnect->Visible = true;
             FormConnect->Show();
       
          Speed= new TSpeedButton(FormConnect);  
             Speed->Parent=FormConnect;
             Speed->Visible=true;
             Speed->OnClick = SpeedClick;
      }
      -------------------------------------------------------------
       void __fastcall TFormConnect::SpeedClick(TObject *Sender)
       
      {
        ShowMessage("Отработка события);
      }



    В h.файле
    ExpandedWrap disabled
      #ifndef ConnH
      #define ConnH
       
          void  SERVER_REGI();
       
        class TFormConnect : public TForm
      {
      __published:    // IDE-managed Components
       
              TSpeedButton *Speed;
       
        void __fastcall SpeedClick(TObject *Sender);
       
      private:    // User declarations
      public:     // User declarations
       
         virtual __fastcall TFormConnect(TComponent* Owner);
       
      };
       
      //---------------------------------------------------------------------------
      #endif

    Ошибка - не определяется Speed и SpeedClick.

    У меня это первый опыт подключения другого cpp, как-то обходилось без этого. Буду благодарна за ликбез. Все, что для этого прочитала, четкого объяснения не дало.
      Цитата laifik @
      Перечитала множество статей и ссылок.

      Не похоже. Затем тебе динамически создавать форму?
      Создавай в дизайн- тайме с Visible= false.
        Цитата laifik @
        Ошибка - не определяется Speed и SpeedClick

        А с чего им "определяться"? Speed и SpeedClick это члены класса TFormConnect, а в SERVER_REGI они у тебя "сами по себе" без указания членства и типа - просто неопределенные символы

        Цитата bobjones @
        Затем тебе динамически создавать форму?
        Создавай в дизайн- тайме с Visible= false

        Если форма задана в дизайне, то ее можно и динамически создать через new TFormConnect(..), только при этом не нужно заново создавать кнопку Speed, т.к. она автоматически создается вместе с формой со всеми свойствами, заданными в дизайне.
          Цитата leo @
          Если форма задана в дизайне, то ее можно и динамически создать через new TFormConnect(..), только при этом не нужно заново создавать кнопку Speed, т.к. она автоматически создается вместе с формой со всеми свойствами, заданными в дизайне.

          А это как? Мне просто пока не понятно, как кнопка создается сама по себе.
          Функция SERVER_REGI также "сама по себе" из-за того, что я решила создать файл без форм, где собраны все мои функции, которые я использую в каждой программке, которые пишу. Поэтому все компоненты создаю динамически. В том числе и форму.
          Хотела бы узнать, как это делается правильно. :)
            Какая задача, может проще использовать Frames?
              Цель - получить строку подключения к БД. Формирование строки происходит в отдельном файле, который подключаю к основной программе.
              При отработке функции, которая находится в отдельном файле, при невыполнении каких-то условий может возникнуть необходимость вызова формы, где находятся поля с информацией, из которых складывается строка подключения. При клике на кнопку она и формируется.
              Frames использовать не хочу, чтобы не плодить файлы.
              Уже подсказали, что форму открыть через ShowModal. И действовать через кнопки. Но с этим на рабочем компе какие-то глюки, форма куда-то исчезает.
              Да и интерес проснулся, почему не могу создать кнопку внутри класса TForm.
                Если надо создавать динамический компонет то определяйте его в разделе public также и их события.
                оператор new для динамических обьектов перенесите в раздел конструктора формы, чтобы новые компонеты были членом формы а неизвестно кому принадлежащие.
                  Цитата Bas @
                  чтобы новые компонеты были членом формы, а не неизвестно кому принадлежащие.
                  :blush:
                    Цитата laifik @
                    Цель - получить строку подключения к БД. Формирование строки происходит в отдельном файле, который подключаю к основной программе.
                    При отработке функции, которая находится в отдельном файле, при невыполнении каких-то условий может возникнуть необходимость вызова формы, где находятся поля с информацией, из которых складывается строка подключения. При клике на кнопку она и формируется.
                    Ничё не понял... Строка соединения с БД формируется на основании имени юзера и его пароля
                    ExpandedWrap disabled
                        Conn->Close();  // Conn - это TADOConnection
                        Conn->ConnectionString = Format("Provider=MSDASQL.1;Data Source=%s;User ID=%s;Password=%s;Persist Security Info=false",
                                                         ARRAYOFCONST((FODBCName, FEdPassword->UserName, FEdPassword->Password)));
                        try {
                          Conn->Open();
                        }
                        catch (Exception *E) {
                          ::Application->MessageBox(E->Message.c_str(), L"Соединение невозможно", MB_ICONWARNING);
                          Screen->Cursor = crDefault;
                          return false;
                        }
                    У меня ТУТ ещё имя источника данных, но это только потому, что работаю и на локальном и на сетевом серверах Oracle. То же самое - на MS SQL, про Акцесс вообще молчу, на InterBase (и его клонах) когда-то делал то же самое. Если речь вот о ТАКОЙ формочке - то не городи огород с динамикой! Используй обычное модальное окно.
                    user posted image
                    Сообщение отредактировано: #SI# -
                      Цитата laifik @
                      А это как? Мне просто пока не понятно, как кнопка создается сама по себе.

                      Точно также, как и в основной форме TForm1. Для каждой формы, сконструированной в дизайнере, в экзешник добавляется dfm-ресурс, в котором прописаны все дочерние компоненты формы со всеми их свойствами. Конструктор формы автоматически создает и инициализирует все компоненты формы, прописанные в ее dfm-ресурсе. Поэтому для динамического создания формы, созданной в дизайнере, нужно просто:
                      1) отключить ее автосоздание в опциях проекта
                      2) в рантайме создать экземпляр этой формы через new TFormConnect(Application)
                      3) показать форму вызовом ее метода ShowModal
                      4) проанализировать результаты вызова (св-во ModalResult и т.п.)
                      5) удалить экземпляр формы вызовом delete
                      Усё. Никакие кнопки создавать не нужно, т.к. они будут созданы и проинициализированы автоматически, как было задано в дизайнере.
                        Цитата Bas @
                        Если надо создавать динамический компонет то определяйте его в разделе public также и их события.
                        оператор new для динамических обьектов перенесите в раздел конструктора формы, чтобы новые компонеты были членом формы а неизвестно кому принадлежащие.

                        Bas, все так и делаю. Все равно не определяется кнопка, а вместе с нею и событие.
                        Как-то я весь проект составила на динамических компонентах, поупражнялась вдоволь. Но там все понятно - форма визуальная.
                        Существует какая-то тонкость, о которой я не знаю. Если можно, "пошлите" меня туда, где есть пример или полное описание процесса. В Архангельском нет.
                        Модальную форму тоже сегодня создавала. Потом поняла, что у меня сначала запускается проверка функции (перебираются все сервера с нужной БД), если коннекта не происходит, то открывается моя многострадальная форма. Форма эта создается с компонентами TLabel и TEdit, да и TSpeedButton, все прекрасно показывается, пока не навешиваю на кнопку событие.
                        Так вот, как модальная она мне не нужна. Ведь основная форма запускается только после того, как будет сложена строка подключения.

                        Добавлено
                        Цитата #SI# @
                        Ничё не понял... Строка соединения с БД формируется на основании имени юзера и его пароля

                        Мне этой информации мало. Нужно еще наименование сервера и имя БД.
                          Цитата laifik @
                          Нужно еще наименование сервера и имя БД
                          И что, каждый пользователь ЭТО тоже вводит???
                          Кстати - что за БД? На каком движке?

                          Добавлено
                          Цитата laifik @
                          Как-то я весь проект составила на динамических компонентах, поупражнялась вдоволь.
                          Припоминаю :D ...
                          Сообщение отредактировано: #SI# -
                            Цитата laifik @
                            Ведь основная форма запускается только после того, как будет сложена строка подключения.

                            Может вам нужна заставка?
                            Часть 1. Почти все о заставках
                            Использовал заставку при соединении с БД если ,из файла настроет, база не найдена предлагал ввести путь и продолжить работу.

                            Добавлено
                            ExpandedWrap disabled
                              void __fastcall TDM::DMCreate(TObject *Sender)
                              {try{
                                DelTemp(ExtractFilePath(Application->ExeName));
                                Splash1();
                                user=0;
                                AnsiString UID=_argv[1],par_,f_log;
                                par_=UID+"1.log";
                                AnsiString P_p;
                                  try{
                                     P_p=ExtractFilePath(Application->ExeName)+"lb.ini";
                                    }catch (EDatabaseError &e) {Application->MessageBox(P_p.c_str(),"P_p",MB_OK);}
                                 TIniFile *R=new TIniFile(P_p);
                                 if (!UID.IsEmpty()) P=R->ReadString("LB",UID.Trim(),"C:\\");
                                 else P=R->ReadString("CLB","KL","C:\\BASE\\");
                                 delete R;
                              bool fil_=true;
                              int fil_count=0;
                               if (P.SubString(P.Length(),1)!="\\") P=P+"\\";
                                AnsiString P1=P+"Ank.dbf";
                                while(fil_)
                                {//w
                                 if(!FileExists(P1)&&P1!=".")
                                 {
                                 fil_count++;
                                  if(!InputQuery("Select data directory",P1+" is invalid",P)) P1=".";
                                 else P1=P+"ank.dbf";
                                  if(FileExists(P1)&&P1!=".")
                                    {
                                     TIniFile *R=new TIniFile(P_p);
                                     R->WriteString("LB",UID.Trim(),P.Trim());
                                     Application->MessageBox("lb","ini",MB_OK);
                                     delete R;
                                     fil_=false;
                                    }
                                 if (fil_count==3) P1="."; fil_=false;
                                 }
                                 else
                                 {
                                  fil_=false;
                                 }
                                } //\w
                                if(P1==".")
                                {Application->Tag=1;
                                 Application->MessageBox("Не найдены данные\nОбратитесь к администратору.","Error",MB_OK);
                                }else
                                {
                                 try{
                                  /* DBIEnv Env; memset(&Env,0,sizeof(DBIEnv));
                                  strcpy(Env.szWorkDir,P.c_str());//P.c_str());
                                  Ms(DbiInit(&Env),"[Init]");*/
                                  AdsConn->IsConnected=false;
                                  AdsConn->ConnectPath=P;
                                  try{
                                  AdsConn->IsConnected=true;
                                     }catch(Exception& e) {Application->ShowException(&e);}
                                  String pat=P_p;
                                  SetCurrentDir(DM->P.Trim());
                                DM->modstru();
                                }
                                user=1;
                               }__finally {Splash2();}
                              }

                            Проект закрыт очень старый, но проработал 17 лет. Работа через BDE и датамодуль. Запускаеться форма заставка Splash1, далее идет проверка ели алиас и анкета по указанному пути, если нет то предлагаем ввести путь.

                            Добавлено
                            Ой, это уже переделанный на адвантаж датасет. Но смысл не меняется.
                            Сообщение отредактировано: Bas -
                              Цитата #SI# @
                              Цитата laifik @
                              Нужно еще наименование сервера и имя БД
                              И что, каждый пользователь ЭТО тоже вводит???
                              Кстати - что за БД? На каком движке?

                              Нет, конечно. Поиск БД на сервере осуществляется один единственный раз, затем информация записывается в реестр и строка подключения формируется из него.
                              Весь этот "огород" из-за того, что сервером в нашей конторе заведуют люди, мало представляющие, что такое БД. Например, админ посчитал, что если создать копию БД под тем же именем на другом SQL сервере, то тем самым он ее сохранит. Про bak понятия не имел. Имена серверов часто меняются. Поэтому и придумала код, чтобы найти. А вот если не найду, то хотя бы смогу сформировать строку подключения в динамической форме, которая затем пропишется в реестре.
                              Бред конечно, но в такие условия ставят коллеги.

                              Добавлено
                              Цитата Bas @
                              Может вам нужна заставка?

                              А это выход! Как сама до этого не додумалась?! Спасибо огромное. Теперь все должно "сростись".
                              Сообщение отредактировано: laifik -
                                Цитата laifik @
                                Бред конечно, но в такие условия ставят коллеги.
                                Знакомый случай...
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0838 ]   [ 17 queries used ]   [ Generated: 19.04.24, 01:18 GMT ]