Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/35: Рейтинг темы: голосов - 35, средняя оценка - 4.57
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35

Наследник TForm

14.11.2012, 22:22. Показов 6803. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем. Такая проблема: создал модуль, в нем описал класс:
C++
1
2
3
4
5
6
7
8
9
10
#include <Forms.hpp>
 
class TMyForm : public TForm
{
  __published:
    __fastcall FormCreate(TObject* Sender);
    __fastcall FormClose(TObject* Sender, TCloseAction &Action);
  public:
    __fastcall TMyForm(TComponent*);
};
Соответственно прописал обработчики этих двух событий в cpp-файле.
Вопрос: как создать приложение с такой формой? Пытался создавать дефолтное новое приложение, инклудил в него этот мой класс формы, исправлял наследование: вместо TForm наследовал от моего класса, но во время разработки и выполнения таким образом используется все равно стандартное окно C++ Builder. Вот код h-файла из программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "classes/TMyForm.h"
 
 
class TForm1 : public TMyForm
{
__published:    // IDE-managed Components
private:    // User declarations
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.11.2012, 22:22
Ответы с готовыми решениями:

Переcоздание TForm
Ребят, в общем задача простая: есть форма, на ней n-контролов (боксы, едиты, листы и пр.), которые заполняются. Есть кнопка по нажатию...

Вопрос по TForm
Есть главная форма приложения Form1. Есть дополнительная форма Form2, которая создаётся сразу же при запуске приложения, но не...

копии TForm
мне надо создать больше двух копий TForm. как мне сделать что бы после создания копий, и закрытия главной формы, не закрывались...

15
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
15.11.2012, 00:10
Если это единственная форма приложения, то нужно редактировать дефолтную форму приложения.
Если это не главная форма приложения, то нужно в проекте добавлять новую форму и ее редактировать.
А вообще непонятно чего вы хотите.
Вложения
Тип файла: rar TwoForms.rar (4.5 Кб, 30 просмотров)
0
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35
15.11.2012, 18:35  [ТС]
gumi250, нужно разработать класс формы, наследник TForm, для последующего использования в различных программах; в них я буду наследовать, например, TForm1, не от TForm, а от моего класса-наследника формы. В этом моем классе-наследнике должны сохраняться и восстанавливаться координаты объекта формы. Но загвоздка в том, что создавая приложение в C++ Builder, создается дефолтная форма. наследник TForm. Ручками правлю родителя на мой класс, чтобы от него наследовалось - запущенное приложение содержит дефолтную форму, но никак не мою из моего класса.

Добавлено через 12 минут
Вопрос снят. Был глупый недочет - мало было в классе написать обработчики событий нужных, нужно было еще назначить их соответствующим событиям.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.11.2012, 18:35
Цитата Сообщение от alex.gorbach Посмотреть сообщение
gumi250, нужно разработать класс формы, наследник TForm, для последующего использования в различных программах; в них я буду наследовать, например, TForm1, не от TForm, а от моего класса-наследника формы. В этом моем классе-наследнике должны сохраняться и восстанавливаться координаты объекта формы. Но загвоздка в том, что создавая приложение в C++ Builder, создается дефолтная форма. наследник TForm. Ручками правлю родителя на мой класс, чтобы от него наследовалось - запущенное приложение содержит дефолтную форму, но никак не мою из моего класса.
Дефолтная форма и есть форма унаследованная от TForm, только без добавленных вами обработчиков, свойств, событий

А для вашего случае есть шаблоны проектов и компонентов
Миниатюры
Наследник TForm   Наследник TForm  
0
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35
15.11.2012, 21:18  [ТС]
Вот, обрадовался, что работает, не заметил вот чего: если в классе, у меня именуемым TMainForm, наследнике моего класса, определить событий FormCreate, то оно перекрывает событие родителя, то есть моего класса. Как реализовать, чтобы выполнялся и код, написанный мною в классе моей формы, и позднее добавленный код обработчика FormCreate в непосредственно в пользовательском классе формы? Слов много, вот код:
TMyForm.h
C++
1
2
3
4
5
6
7
class TMyForm : public TForm
{
  public:
    __fastcall TMyForm(TComponent*);
    void __fastcall Create(TObject*);
    void __fastcall Close(TObject*, TCloseAction&);
};
TMyForm.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
__fastcall TMyForm::TMyForm(TComponent* Owner) : TForm(Owner)
{
  OnCreate = Create;
  OnClose = Close;
}
 
void __fastcall TMyForm::Create(TObject* Sender)
{
    TIniFile* ini = new TIniFile("ini/" + Name + ".cfg");
    Top = ini->ReadInteger("Coordinates", "top", 100);
    Left = ini->ReadInteger("Coordinates", "left", 100);
    delete ini;
}
 
void __fastcall TMyForm::Close(TObject* Sender, TCloseAction& Action)
{
    TIniFile* ini = new TIniFile("ini/" + Name + ".cfg");
    ini->WriteInteger("Coordinates", "top", Top);
    ini->WriteInteger("Coordinates", "left", Left);
    delete ini;
}
Unit1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//---------------------------------------------------------------------------
class TMainForm : public TMyForm
{
__published:    // IDE-managed Components
    TMainMenu *mainMenu;
    TMenuItem *N1;
    TMenuItem *N2;
    TMenuItem *N3;
    TMenuItem *N4;
    TMenuItem *N5;
    TMenuItem *N6;
    TStatusBar *statusBar;
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall N2Click(TObject *Sender);
private:    // User declarations
    ExitButton *exButton;
public:     // User declarations
    __fastcall TMainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
Unit1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
    : TMyForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
    exButton = new ExitButton(this);
    exButton->Top = 400;
    exButton->Left = 600;
}
//---------------------------------------------------------------------------
Как сделать, чтобы выполнялся код на создание формы и из TMyForm, и из Unit1?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
15.11.2012, 23:54
C++
1
2
3
4
5
6
void __fastcall TMainForm::FormCreate(TObject *Sender) {
    TMyForm::Create( this );
    exButton = new ExitButton(this);
    exButton->Top = 400;
    exButton->Left = 600;
}
Далеко не самый изящный вариант... лучше перегружай одни и те же методы.
0
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35
27.11.2012, 12:36  [ТС]
Так, вроде почти со всем разобрался, ломаю голову только вот над чем: я при закрытии формы сохраняю в файл ее координаты, размеры и состояние. Нужно сделать так, что если закрываю развернутую форму, то сохранялись ее размеры и координаты перед максимизацией и состояние wsMaximized. Соответственно, при следующем открытии окно будет развернуто, но восстанавливаться оно должно к тем самым небольшим размерам. Я завел поля для хранения размеров и координат, которые будут записаны, осталось их заполнить перед максимизацией. Переопределяю Resize, в нем проверяю состояние окна, но как я заметил при максимизации в этом методе WindowState == wsNormal и размеры формы уже развернутой, а не обычной.
Вопрос: как отловить событие максимизации?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
27.11.2012, 13:16
я такое делаю при закрытии приложения: if (WindowState!=wsMaximized) ... - в этом случае сохраняю габариты формы и признак max. Иначе - габариты не сохраняются (остаются прежние; можно сохранять их на событие FormResize), а записывается только признак max.
0
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35
27.11.2012, 13:36  [ТС]
nick42, как я не додумался просто не сохранять размеры развернутой формы... Работает, спасибо. Чуть-чуть не так, как я хотел, но может быть пойдет.
0
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35
02.12.2012, 01:02  [ТС]
Не подошел такой способ. Конкретнее сформулирую задачу: нужно перед максимизацией формы сохранить ее размеры. В Resize-е при развертывании размеры формы уже поменялись на максимизированные.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
02.12.2012, 17:06
Лови сообщение WM_SIZE, смотри wParam на равенство SIZE_MAXIMIZED. Если не равно - сохраняешь новые размеры, если равно - игнорируешь и, следовательно, остаются размеры последнего ресайза.
0
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35
02.12.2012, 21:44  [ТС]
BRcr, стыдно спросить, как отловить сообщение? Читал что-то про макросы, про перекрытие оконной процедуры... Или как это по-человечески сделать?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.12.2012, 15:04
Можно и без MESSAGE MAP. Вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// В *.h
private: * *// User declarations
* * TWndMethod Old_Form_Proc;
* * void __fastcall New_Form_Proc(TMessage& msg);
*
// В *.cpp
void __fastcall TForm1::FormCreate(TObject *Sender)
{
* * Old_Form_Proc = WindowProc;
* * WindowProc = New_Form_Proc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::New_Form_Proc(TMessage& msg)
{
* * switch (msg.Msg) {
* * * * case WM_MOVE: // при перемещении формы
* * * * * * if (Form2) {
* * * * * * * * Form2->Top = Top + Height;
* * * * * * * * Form2->Left = Left;
* * * * * * * * Form2->Width = Width;
* * * * * * }
* * * * * * break;
* * * * case WM_SIZE: // при изменении размеров формы
* * * * * * if (Form2) {
* * * * * * * * Form2->Top = Top + Height;
* * * * * * * * Form2->Left = Left;
* * * * * * * * Form2->Width = Width;
* * * * * * }
* * * * * * break;
* * * * default:
* * * * * * ;
* * }
*
* * Old_Form_Proc(msg);
}
WParam в данном случае находится внутри msg.
0
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35
03.12.2012, 22:22  [ТС]
BRcr, покопался, в итоге, получилось, спасибо! Только осталось вот что: при перемещении надо бы тоже сохранять положение формы, только вот при максимизации сообщение WM_MOVE тоже посылается, и сохраняются координаты развернутой формы. А проверить состояние окна, наподобие как был wParam в WM_SIZE не получается - интернеты говорят, что wParam в данном случае не используется.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
03.12.2012, 22:40
вот же любят люди себе жизнь усложнять! Только несколько строчек в обработчике FormClose - и нет проблем__
C++
1
2
3
4
5
6
     if (Form1->WindowState==wsMaximized) Reg->WriteInteger("WinMax", 1);
     else   {
       Reg->WriteInteger("WinWidth", Form1->Width);
       Reg->WriteInteger("WinHeight", Form1->Height);
       Reg->WriteInteger("WinMax", 0);
     }
сюда же можно пару параметров положения формы добавить.
0
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35
03.12.2012, 22:43  [ТС]
nick42, стояла задача сохранить координаты перед развертыванием формы, чтобы позже, после перезапуска и нормализации оно принимало те же размеры.
Кстати, достаточно было вместо WM_MOVE обрабатывать WM_MOVING, с ним корректно работает все.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.12.2012, 22:43
Помогаю со студенческими работами здесь

Класс перехватчик к TForm
Добрый день, добавляю к TForm доп строку namespace SLE { class TF : public Vcl::Forms::TForm { private: AnsiString...

Создание наследника TForm
Всем привет. При попытке создать наследника TForm получаю ошибку &quot;Resource MyClass not found.&quot; Unit1.cpp ...

Доступ к обьектам TForm
Задача в следующем: есть TForm и в на нём лежит порядка 100 кнопок. Кнопки имеют определённые имена, и именно с помощью этих имён я и хочу...

Вопрос по TForm::OnKeyPress
Есть форма. На ней расположен TStringGrid и несколько кнопочек. Хочется отработать нажатие на клавишу (независимо от того, на каком из...

Вывод текта на TForm
Здравствуйте. Как на TForm вывести RichEdit1-&gt;Text. Пробую через Form1-&gt;Canvas-&gt;TextOutA(0,0,RichEdit1-&gt;Text), но только выводит он всесь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru