С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
28 / 24 / 10
Регистрация: 26.04.2015
Сообщений: 307

Дочерние формы (не MDI) и STL::List

22.08.2016, 23:53. Показов 3763. Ответов 63
Метки list (Все метки)

Студворк — интернет-сервис помощи студентам
Хай всем, нашёл тему по форуму, близкую к моей задаче:
Динамическое создание и удаление компонентов.,
но возник вопрос, корректно ли использование того кода для компонентов формы
C++
1
2
3
4
5
6
7
8
void __fastcall TfmSendFile::FormCreate(TObject *Sender)
{
    sbtDel = new TsButton(fmSendFile);
    sbtDel->OnClick = sbtDelClick;
 
    Number = 0;
    vLabel.push_back(new TsLabel(fmSendFile));
...
непосредственно к самой форме? (у меня в программе - список указателей дочерних окон главной формы). И ещё, как удалять из списка эти указатели?
Unit1.cpp
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//===========================================================================
#include <vcl.h>
#include <list.h>
#pragma hdrstop
#include "Unit1.h"
 
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
    list<TForm1*> myList; 
 
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    frm_2 = NULL; //(TForm*) - указатель на дочернюю форму
    ed = NULL;    //(TEdit*) - указатель на Edit этой формы
}
//===========================================================================
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   
//    if ( frm_2 == NULL )
    {
    frm_2 = new TForm( this );            
//  frm_2->Parent = this;
    frm_2->Top = (ClientHeight - frm_2->Height)*0.50; 
    frm_2->Left = (ClientWidth - frm_2->Width)*0.50;
    
//  frm_2->ActiveControl = NULL;
    ::SetParent( frm_2->Handle, Handle ); 
    frm_2->OnClose = &Form2Close;         
    frm_2->Show();                       
 
        ed = new TEdit( frm_2 );           
    ed->Parent = frm_2;
        ed->Top = 20;                         
    ed->Left = 30;
    ed->Font->Style = TFontStyles() << fsBold;    
    }
//--------------------------
    myList.push_back(new TForm1(frm_2)); // <--- вот это интересует в сравнении с темой про компоненты
//--------------------------
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Form2Close(TObject *Sender, TCloseAction &Action)
{
    if (ed!=NULL)
        delete ed;     
    ed = NULL;     
 
    if (frm_2!=NULL)   
        delete frm_2;
    frm_2 = NULL;     
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::WndProc(TMessage &Message)
{
    static bool isAppActive = true;
 
    switch(Message.Msg)
    {
        case WM_NCACTIVATE:
            Message.WParam = isAppActive;
            Message.Result = DefWindowProc(this->Handle, Message.Msg, Message.WParam, Message.LParam);
            break;
 
        case WM_ACTIVATEAPP:
            isAppActive = (Message.WParam != 0);
            LPARAM lp = 0L;
            this->Perform(WM_NCACTIVATE, 0, lp);
            Message.Result = 0;
            return;
    }
    TForm::WndProc(Message); // interited
}
//---------------------------------------------------------------------------
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
23
24
25
26
27
28
29
30
31
32
33
34
//===========================================================================
#ifndef     Unit1H
#define     Unit1H
 
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
 
//---------------------------------------------------------------------------
class   TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    TEdit *Edit1;
    void __fastcall Button1Click(TObject *Sender);
 
private:    // User declarations
    TForm* frm_2;    
    void __fastcall TForm1::Form2Close(TObject *Sender, TCloseAction &Action);  
    TEdit* ed;    
 
protected:
        void __fastcall WndProc(TMessage &Message);
 
public:     // User declarations
    __fastcall  TForm1(TComponent* Owner); 
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif  //(Unit1H)
//===========================================================================
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.08.2016, 23:53
Ответы с готовыми решениями:

Работа с MDI и Дочерние формы
Здравствуйте у меня вопрос, есть 2 формы,главная и дочерняя. Дочерняя выводится через StripMenu. Когда я вывожу не одну дочернюю, а...

MDI вместо закрытия главной формы закрываются дочерние
Собственно есть главная &quot;MainForm&quot; и несколько дочерних, генерируемых динамически, у обоих типов форм есть обработчик закрытия. Проблема в...

Как сделать что бы дочерние формы в MDI application delphi сразу не открывались при запуске программы
Здравствуйте, как сделать что бы дочерние формы в MDI application delphi сразу не открывались при запуске программы, а открывались после...

63
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
25.08.2016, 21:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Wolver Посмотреть сообщение
В TComponentList получается наоборот?
TComponentList это список владения. Во всяком случае по дефаулту без отключения владения. т.е. если мы что то из него удалим оно удалится.

Добавлено через 3 минуты
Цитата Сообщение от Wolver Посмотреть сообщение
И т.е. если мне нужно будет проделать какие-то пользовательские действия с указателем на дочернее окно - их надо делать до его уничтожения?
Естественно что с уничтоженным объектом ничего сделать уже нельзя. TComponentList - список владения. При его уничтожении он уничтожит все объекты указатели на которые в него внесены.
0
28 / 24 / 10
Регистрация: 26.04.2015
Сообщений: 307
25.08.2016, 21:59  [ТС]
я не правильно выразился, уничтожаем мы одно из дочерних окон, но при этом я вижу в дебаге что после отработки OnClose, форма получив Action = caFree убивается, и сразу же уменьшается Count у TComponentList.
В STL::List же в OnClose делал принудительно delete frm_2; frm_2 = NULL; Почему так?
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
TComponentList - список владения.
- я никогда с ним не работал, но я вижу что это офигенный компонент и мне интересно знать механику его работы.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
25.08.2016, 22:11
Цитата Сообщение от Wolver Посмотреть сообщение
- я никогда с ним не работал, но я вижу что это офигенный компонент и мне интересно знать механику его работы
В упрощенном виде смысл работы в том коде с шаблонами что я привел в начале. Тот TComponentList который в комплекте VCL гораздо сложнее так как поддерживает нахождение объекта и корректную обработку удаления для неограниченного количества таких списков. В общем все просто - объект запоминает указатель на список в который он вносится. Из деструктора отправляет списку оповещение (вызывает соответствующий метод) в котором список удаляет указатель на него из себя.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.08.2016, 13:22
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Если уж хочется отдельный список делать то делайте TObjectList или TComponentList которые отслеживают внешнее удаление содержимого.
TObjectList ничего не отслеживает- лишь владеет.
Почему не использовать TObjectList или TComponentList а использовать STL по тому что это дело ситуации в большинстве случаев STL удобнее.
0
 Аватар для SmittWesson
236 / 196 / 21
Регистрация: 04.06.2014
Сообщений: 1,309
28.08.2016, 15:09
Цитата Сообщение от d7d1cd Посмотреть сообщение
Даже в том случае, если приложение закроется?
Я имел в виду закрытие дочерней формы приложения. Статики, даже открытые в этой форме останутся, как и не закрытые области объектов. В случае закрытия приложения, закроется и его Action. Вот его-то деструктор и подчистит всё, что относится к приложению. И статики в том числе, кроме не закрытых областей объектов т.к. они ему не известны.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.08.2016, 19:27
Цитата Сообщение от Avazart Посмотреть сообщение
STL удобнее
Выбрось ее на помойку. Она не для ООП

Добавлено через 39 секунд
Цитата Сообщение от Avazart Посмотреть сообщение
по тому что это дело ситуации
Это дело не ситуации а концепции.

Добавлено через 1 час 48 минут
Цитата Сообщение от SmittWesson Посмотреть сообщение
И статики в том числе,
Что вы подразумеваете под статиками?
Цитата Сообщение от SmittWesson Посмотреть сообщение
В случае закрытия приложения,
В случае закрытия приложения ОС просто высвободит все области памяти назначенные приложению. В том числе кучи и сегмент данных. При этом что там в кучах и как распределено ОС вообще не заботит. Грохнула всю кучу и все. Это не ДОС где можно было пометить раздел памяти как ничей который не удалится при закрытии приложения. Здесь не просто у каждого приложения свои области памяти, у каждого свое адресное пространство которое просто уничтожается при закрытии приложения.
0
29.08.2016, 09:31

Не по теме:

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Выбрось ее на помойку. Она не для ООП
ваша религиозная неприязнь к STL выглядит как детский сад и недостойна профессионала. STL - удобная, гибкая и эффективная библиотека решающая множество самых разнообразных задач. лично мне не понятна ваша позиция.

0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
29.08.2016, 09:32
Цитата Сообщение от vxg Посмотреть сообщение
удобная, гибкая и эффективная библиотека решающая множество самых разнообразныхтиповых задач
Fixed. Так будет правильнее. Тем, кто занимается задачами НЕтиповыми, с STL ловить нечего.
0
29.08.2016, 09:36

Не по теме:

volvo =-O
внезапно, внезапно...
надо полагать что непереносимая VCL способна решать НЕтиповые задачи)?

0
 Аватар для SmittWesson
236 / 196 / 21
Регистрация: 04.06.2014
Сообщений: 1,309
29.08.2016, 10:41
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Что вы подразумеваете под статиками?
Переменные и объекты объявленные как static. Для них выделяется неизменная область памяти, существующая на всём протяжении времени существования приложения. Поскольку оператор static является ключевым словом С++, их положение деструктору известно всегда (я точно не помню, но вроде как такие переменные и объекты включаются в стек объектов ИМХО).

Добавлено через 16 минут
Цитата Сообщение от volvo Посмотреть сообщение
Тем, кто занимается задачами НЕтиповыми, с STL ловить нечего.
Что значит нечего ловить? Контейнеры vector, vallarray, bitset, list, deque, stack чем плохи? Я уж молчу про set, multiset и map, multimap. А в хедере algorithm вообще много полезного. Чего стоит только генератор перестановок next_permutation и prev_permutation.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
29.08.2016, 10:42
Цитата Сообщение от vxg Посмотреть сообщение
непереносимая VCL способна решать НЕтиповые задачи?
Да, способна, и гораздо лучше, чем переносимая STL. Те, кто выбирает VCL, знают, на что идут, и знают, что их приложение будет привязано к Windows. И, по большей части, им большего и не надо. А все эти фишки, типа "Вау! Наша программа работает и под Windows, и под Linux, и под MacOS, и под..." - значит либо что это очередной HelloWorld, который реализует базовый же функционал, либо что это враньё. Ибо не работает программа, написанная на подобных мутантах под разными ОС абсолютно одинаково (и при этом эффективно). Везде есть свои подводные камни, и, чтобы эффективно их обходить, нужно для каждой ОС писать свой код, а не клепать один, усредненный, который "пусть хоть как-то заработает, а мы потом подрихтуем, да еще заставим пользователя обновить аппаратную часть, и будет сносно работать". А мне не надо сносно. Мне нужно, чтобы работало идеально
0
 Аватар для SmittWesson
236 / 196 / 21
Регистрация: 04.06.2014
Сообщений: 1,309
29.08.2016, 10:54
Цитата Сообщение от volvo Посмотреть сообщение
Ибо не работает программа, написанная на подобных мутантах под разными ОС абсолютно одинаково
Во-во-во. Работал в одном офисе. А там на одном компе стояла Винда, а ну другом Линукс. Начальник (в программировании дуб-дубом) дал задание, написать программу, но что-бы работала и там и там. Я весь лоб себе расшиб пытаясь заставить один экзешник работать и там и там. Главное мой код отлично компилился и на Виндовом и на Линусовском компиляторах. Но то, что было откомпилено на Винде, на Винде и работало. То, что на Линуксе, нормально работало на линуксе. Пришлось так и оставить. Начальник был доволен "ведь умеете когда захотите". Ему и в голову не пришло, что работают два разных экзешника . Результат то выдавался один, для одинаковых тестов. Там, не один я смеялся.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
29.08.2016, 11:01
volvo, если я пишу консоль/библиотечную функцию и мне нужно организовать список, то наверное я буду использовать STL (и мне кажется что и вы тоже будете) потому что это переносимое решение не только в другие ОС но и в другие среды причем при нулевых или даже положительных "побочных" эффектах со стороны инструментария
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.08.2016, 11:50
Цитата Сообщение от volvo Посмотреть сообщение
Тем, кто занимается задачами НЕтиповыми, с STL ловить нечего.
Например? Программирование на микроконтроллерах?

Добавлено через 2 минуты
Цитата Сообщение от volvo Посмотреть сообщение
А все эти фишки, типа "Вау! Наша программа работает и под Windows, и под Linux, и под MacOS, и под..." - значит либо что это очередной HelloWorld, который реализует базовый же функционал, либо что это враньё.
Поразительно но Qt работает ... Во всяком случае затраты экономятся на написания именно Gui части огромные.

Одно дело пилить все с нуля под каждую ос, другое устранить огрехи.

Цитата Сообщение от volvo Посмотреть сообщение
Ибо не работает программа, написанная на подобных мутантах под разными ОС абсолютно одинаково (и при этом эффективно).
Для Gui не нужно большой эффективности в большинстве случаем.

Цитата Сообщение от volvo Посмотреть сообщение
Везде есть свои подводные камни, и, чтобы эффективно их обходить, нужно для каждой ОС писать свой код,
Ага поддерживать эти два кода кто будет?
0
28 / 24 / 10
Регистрация: 26.04.2015
Сообщений: 307
29.08.2016, 17:13  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Сообщение от Avazart
STL удобнее
Выбрось ее на помойку. Она не для ООП
Мне кажется ваш спор упускает то, чего нужно ТС))) А мне нужно чтобы задуманное работало, при этом какой контейнер будет использован STL или VCL не важно, задача мне кажется не кроссплатформенная. Конечно мне безумно стало интересно поработать с TComponentList, т.к. для меня это новая инфа и я хочу её знать!) К тому же до этого вы вроде сошлись во мнении, что TComponentList вполне удобен для дочерних форм и моего вопроса.
И последующие комменты Avazart про целесообразность STL весьма разумные, ведь тот же multimap весьма удобен для работы с массивом пар элементов с повторением, а vector приятная замена обычных дин. масс без жёсткого слежения за утечками памяти.
------------------
Конечная задумка программы - это использовать формы-дочки для GUI-визуализации создания таблиц базы данных. Есть программный продукт ER-Win, и в его физ. или логич. моделях графически можно создавать ER-диаграммы "сущность-связь" со всеми ключами и инф. полями. Мне интересно сделать аналогичную функциональность, программно создав файл б.д. (сделано), создать сущности - объекты класса, они же дочерние формы, каждая из которых будет представлять отдельную таблицу б.д. (сделано), наполнить эти формы нужными компонентами TEdit, TButton, TLabel и прочие что понадобятся (это в процессе). Далее после создания и заполнения компонентов именами и типами будущей таблицы сделать SQL->Text на CREATE TABLE.
Почему дочерние формы для этой графич. цели? - потому что полностью всё в openGL я не потяну, да и наверно нет смысла, т.к. ф-циональность формы полностью покрывает потребности)
------------------
В догонку, вопрос по теме: я так и не понял (допустим на дочерних формах сейчас только 1 динамич. Edit), как узнавать то, что я написал какой-то текст в Edit 1-й дочерней формы, а не 3-й? Мне нужно
- проходиться в цикле и сравнивать *Sender формы с чем-то и потом узнав что работаю с формой 3 получать данные с Edit именно 3-й формы;
- или отлавливать активность формы,
- или перефразировать структуру класса, создавая объект TComponentList, в котором будут поля-указатели на саму форму-дочку и TComponentList,ы Edit и других компонентов?
- или что?
Просто пока с этим у меня полная каша... Потому что я хочу правильно связать визуализацию с ООП, чтобы я мог манипулировать дочерними окнами как объектами класса.
На данный момент с подачи volvo, Fulcrum_013 и своих изысканий по гуглу, код выглядит так:
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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//===========================================================================
#ifndef     Unit1H
#define     Unit1H
 
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
 
//---------------------------------------------------------------------------
class   TForm1 : public TForm
{
__published:    // IDE-managed Components
    TPanel *Panel1;
    TButton *Button2;
    TButton *Button3;
        TMemo *Memo1;
    void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
 
private:    // User declarations
    void __fastcall TForm1::Form2Close(TObject *Sender, TCloseAction &Action);  
        void __fastcall TForm1::EditChange(TObject *Sender);        
    TEdit* ed;    
        TComponentList *lst;
        TComponentList *lst_ed;
protected:
        void __fastcall WndProc(TMessage &Message); 
 
public:     // User declarations
    __fastcall  TForm1(TComponent* Owner); 
};
//---------------------------------------------------------------------------
 
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif  //(Unit1H)
//===========================================================================
Unit1.cpp
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//===========================================================================
#include <vcl.h>
#include <list.h>
#pragma hdrstop
#include "Unit1.h"
 
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
    int i=0;
// конструктор формы
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    ed = NULL;    //(TEdit*) - указатель на дин. Edit формы-дочки
    lst=NULL; //nullptr для Embarcadero RAD 10; 
}
//===========================================================================
 
//обработчик закрытия дочерних форм
void __fastcall TForm1::Form2Close(TObject *Sender, TCloseAction &Action)
{
    Action = caFree;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::WndProc(TMessage &Message)
{
    static bool isAppActive = true;
 
    switch(Message.Msg)
    {
        case WM_NCACTIVATE:
            Message.WParam = isAppActive;
            Message.Result = DefWindowProc(this->Handle, Message.Msg, Message.WParam, Message.LParam);
            break;
 
        case WM_ACTIVATEAPP:
            isAppActive = (Message.WParam != 0);
            LPARAM lp = 0L;
            this->Perform(WM_NCACTIVATE, 0, lp);
            Message.Result = 0;
            return;
    }
    TForm::WndProc(Message); 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   lst=new TComponentList();
   lst_ed=new TComponentList();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    i++; //для нумерации в Caption формы-дочки
    TForm *frm = new TForm(this);
    frm->Top = (ClientHeight - frm->Height)*0.50; 
    frm->Left = (ClientWidth - frm->Width)*0.50;
 
    TBorderIcons BI;    //для визуального удаления кнопок сворачивания/разворач. окна
    BI.Clear();
    BI = BI << biSystemMenu;
    frm->BorderIcons = BI;
 
    ::SetParent(frm->Handle, Handle);  
    frm->Show();
    frm->Caption = "my"+IntToStr(i);
    frm->OnClose = &Form2Close;
    lst->Add(frm);
 
    TEdit *ed = new TEdit(frm);              
    ed->Parent = frm;
    ed->OnChange = &EditChange;
    ed->Top = 20;                         
    ed->Left = 30;
    ed->Font->Style = TFontStyles() << fsBold;    
    lst_ed->Add(ed);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    Memo1->Clear();
    for(int i = 0; i <lst->Count; i++)
    {
        Memo1->Lines->Add(static_cast<TForm*>(lst->Items[i])->Caption);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::EditChange(TObject *Sender)
{
    static_cast<TForm*>(lst->Items[???])->Caption=static_cast<TEdit*>(lst_ed->Items[???])->Text;  // <--- тут проблема
}
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.08.2016, 17:36
Может не стоит плодить отдельные формы? Использовать TPageControl + TFrame т.е все внутри основного окна, но со сменой фреймов.

Добавлено через 1 минуту
Цитата Сообщение от Wolver Посмотреть сообщение
lst=new TComponentList(); lst_ed=new TComponentList();
Почему это не делать сразу в конструкторе, при чем в списке инициализиации.

Кстати в деструкторе тоже не плохо удалять их.

Добавлено через 4 минуты
Подмена WndProc тоже не не ясна.

Добавлено через 3 минуты
Если же хотите делать именно формами то может стоит почитать про MDI приложения.
0
28 / 24 / 10
Регистрация: 26.04.2015
Сообщений: 307
29.08.2016, 18:14  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Может не стоит плодить отдельные формы? Использовать TPageControl + TFrame т.е все внутри основного окна, но со сменой фреймов.
TPageControl классная штука, но хочется чтобы визуально было сродни ER-диаграммам, а TPageControl -с виду как закладки, такого не получится добиться(
Цитата Сообщение от Avazart Посмотреть сообщение
Почему это не делать сразу в конструкторе, при чем в списке инициализиации.
а так будет правильнее?
Цитата Сообщение от Avazart Посмотреть сообщение
Кстати в деструкторе тоже не плохо удалять их.
так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
class   TForm1 : public TForm
{
__published:
        ...
        void __fastcall FormDestroy(TObject *Sender); 
        ...
//unit1.cpp
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    delete lst;
    delete lst_ed;
}
Добавлено через 11 минут
Цитата Сообщение от Avazart Посмотреть сообщение
Подмена WndProc тоже не не ясна.
Данная модификация позволяет эмулировать как бы активность главной формы (яркость рамки), при добавлении дочерних, как будто Focus всё ещё находится на главной форме.
Цитата Сообщение от Avazart Посмотреть сообщение
Если же хотите делать именно формами то может стоит почитать про MDI приложения.
эм... это по поводу моего вопроса с указателями?
"Поскольку много подчиненных форм имеют одинаковое имя и одинаковый код, то не следует в коде программы (если код используется несколькими экземплярами формы) использовать имя формы. В модуле формы для ссылок на текущую форму используйте ключевое слово Me." (http://www.codenet.ru/progr/vbasic/bit/MDI.php (с))
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.08.2016, 18:16
Цитата Сообщение от Wolver Посмотреть сообщение
чтобы визуально было сродни ER-диаграммам
Не совсем понимаю о чем вы.
Цитата Сообщение от Wolver Посмотреть сообщение
так?
Это не деструктор.

Если вы не знаете что такое конструктор, список инициализации, деструктор. Советую начать с азов С++, а не формошлепства в билдере.
0
28 / 24 / 10
Регистрация: 26.04.2015
Сообщений: 307
29.08.2016, 18:29  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Если вы не знаете что такое конструктор, список инициализации, деструктор.
деструктор уничтожает объект класса. И у меня никогда не было надобности писать его для формы, мне что писать банально как для пользовательского класса?
C++
1
2
3
4
5
~Form1()
{
    delete lst;
    delete lst_ed;
}
Цитата Сообщение от Avazart Посмотреть сообщение
Сообщение от Wolver
чтобы визуально было сродни ER-диаграммам
Не совсем понимаю о чем вы.
сущности с полями на картинке - в данном случае дочерние формы:
http://ymah.narod.ru/sem8/image022.jpg
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.08.2016, 18:49
Цитата Сообщение от Wolver Посмотреть сообщение
мне что писать банально как для пользовательского класса?
Да.

Цитата Сообщение от Wolver Посмотреть сообщение
сущности с полями на картинке - в данном случае дочерние формы:
А как вы собираетесь линии между "формами" рисовать?

Как по мне вероятно стоило бы не формы использовать, а отрисовывать в TPaintBox руками свои собственные объекты.

Не по теме:

Вот где бы пригодился Qt-шний QGraphicsScene+QGraphicsView, опять же со сглаживанием линий итп...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.08.2016, 18:49
Помогаю со студенческими работами здесь

Дочерние окна MDI
На MDI форме есть кнопка, по нажатию на которую должны выстроиться каскадом все дочерние формы. метод Cascade – выстроить каскадом...

mdi - дочерние окна перетирают друг друга
Здравствуйте форумчане! Сталкнулся с небольшой проблемой для меня. А именно: Написал программу MDI,в каждом окне можно рисовать...

Как настроить соответствие размеров MDI-контейнера и MDI-формы?
Здравствуйте! Я для вкладки &quot;TbpDaSubekt&quot; сделал MDI-форму &quot;FrmTipHran&quot;: FrmTipHran.TopLevel = False FrmTipHran.Parent =...

Работа с STL list + пропись List.h
Здравствуйте! Помогите, пожалуйста, разобраться с STL list. Нужно сделать программу в которой будет содержаться класс Student, прописать...

Чтоб Дочерние формы открывались по иерархии от главной формы
Есть главная форма Form1, Form1 - topmost=true, т.е Form 1 отображается поверх всех окон. Нужно чтоб form2 открывалась не поверх всех окон...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru