Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

Создание глобальной переменной по ходу работы программы

03.03.2013, 18:33. Показов 3108. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
И так, мне нужно создать глобальную переменную в ходе исполнения программы. На самом деле всё чуть сложнее, нужно создать глобальный идентификатор.

Просто глобальную переменную можно через динамический массив, например заранее создать динамический массив int типов, и просто по ходу исполнения программы добавлять новую перменную в массив.

Можно даже создать HWND hCombo/hEdit и т.п. используя принцип динамического массива.

Но как создать идентификатор для этих окон? ( имеется в виду #define ID_COMBO[n] )
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.03.2013, 18:33
Ответы с готовыми решениями:

Добавление новой переменной по ходу работы программы
Принимаю пакеты, ставлю их в очереди в соответствии с IP отправителя. В том смысле, что есть такое соответствие: IP - очередь. ...

Создание глобальной переменной
Использую code igniter. Как создать переменную? Такую же как например base_url();

Создание глобальной переменной
Доброго времени суток, форумчане! После ввода пароля в поле стартовой формы Аксесс 2003, при ее выгрузке запросом...

14
78 / 78 / 9
Регистрация: 26.12.2011
Сообщений: 217
06.03.2013, 13:25
По-моему, вы сами ответили на свой вопрос.
То есть создайте динамический массив типа int и заполняйте его уникальными числами вида 100, 101 и т.д.
Что есть #define ID_EDIT 100? это обычная константа с целым значением. Вместо ID_EDIT можно написать mas[0].
А в процедуру обработки сообщений добавить что-то в этом роде:

C++
1
2
3
4
5
6
7
case WM_COMMAND:
// обработка обычных действий
if(mas.size()!=0) {
// сверяем идентификаторы
// ...
}
break;
Но, как-то извращенно будет выглядеть, по-моему.
Может суть самой задачи изложите м альтернативное решение найдем? ))

Добавлено через 12 секунд
По-моему, вы сами ответили на свой вопрос.
То есть создайте динамический массив типа int и заполняйте его уникальными числами вида 100, 101 и т.д.
Что есть #define ID_EDIT 100? это обычная константа с целым значением. Вместо ID_EDIT можно написать mas[0].
А в процедуру обработки сообщений добавить что-то в этом роде:

C++
1
2
3
4
5
6
7
case WM_COMMAND:
// обработка обычных действий
if(mas.size()!=0) {
// сверяем идентификаторы
// ...
}
break;
Но, как-то извращенно будет выглядеть, по-моему.
Может суть самой задачи изложите м альтернативное решение найдем? ))
1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
06.03.2013, 14:25  [ТС]
Может суть самой задачи изложите м альтернативное решение найдем? ))
Суть - написать универсальный алгоритм, чтоб пользователь сам мог создавать/изменять/удалять всевозможные "боксы". Естественно в самом начале нужно иметь уже комбо с выбором объекта для создания и пару эдитов для ввода всяких там значений.

Спасибо большущее за помощь, в выходные проверю ваше решение этой "весьма удобной затеи" =)
Единственное, вопрос по идентификатору:
#define ID_EDIT 100
Как вы знаете, 100 - всего лишь число, а ID_EDIT - всего лишь идентификатор бокса (как вы пояснили что может быть и char в динамике), тогда можно ли обращяться к этому идентификатору через всякие SendMessage типа ADD_STRING (в комбо например)?
0
78 / 78 / 9
Регистрация: 26.12.2011
Сообщений: 217
06.03.2013, 15:10
Хм.. вполне возможно.
Но я бы хранил и описатели окон для взаимодействия. Пример для вашего вопроса:

C++
1
2
3
#include <windowsx.h>
.....
ComboBox_AddString(HWND combohwnd, LPCTSTR str)
Но насчет идентификаторов -это в теории и по логике вещей, сам такое не пробовал.

Добавлено через 9 минут
Я бы подобную задачу реализовал иначе: создал бы новый класс для дочерних окон, в процедуре которого по событию WM_CREATE создавался бы Edit.
В динамическом массиве хранил бы описатели создаваемых окон.
И все действия по изменению эдита обрабатывал процедурой этих дочерних окон.
И никаких манипуляций с идентификаторами.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
06.03.2013, 15:53  [ТС]
Цитата Сообщение от zelim Посмотреть сообщение
Хм.. вполне возможно.
Но я бы хранил и описатели окон для взаимодействия. Пример для вашего вопроса:

C++
1
2
3
#include <windowsx.h>
.....
ComboBox_AddString(HWND combohwnd, LPCTSTR str)
Но насчет идентификаторов -это в теории и по логике вещей, сам такое не пробовал.

Добавлено через 9 минут
Я бы подобную задачу реализовал иначе: создал бы новый класс для дочерних окон, в процедуре которого по событию WM_CREATE создавался бы Edit.
В динамическом массиве хранил бы описатели создаваемых окон.
И все действия по изменению эдита обрабатывал процедурой этих дочерних окон.
И никаких манипуляций с идентификаторами.
Я против классового программирования. Хочу всё через структуру сделать.
Типа:
C++
1
2
3
4
5
6
7
8
9
10
typedef enum {edit, static, combo, listview} window;
int kolw=0; // кол-во окон
struct Box
{
char Identefikator[30]; // идентификатор
int X1, X2, Y1, Y2; // позиция окна
grade window; // тип окна
int addsettings; // кол-во настроек
char settings[addsettings]; // типа массив специфических настроек окна
};win
А потом в WM_CREATE:
C++
1
2
3
4
For(int i=0;i<kolw;i++)
{
CreateWindow(...);
}
В общем это пока что теория, в выходные затестирую =)
0
54 / 54 / 10
Регистрация: 26.09.2011
Сообщений: 186
06.03.2013, 17:38
Цитата Сообщение от Izual Посмотреть сообщение
Я против классового программирования. Хочу всё через структуру сделать.
А в чем смысл?
0
78 / 78 / 9
Регистрация: 26.12.2011
Сообщений: 217
06.03.2013, 18:14
Цитата Сообщение от Izual Посмотреть сообщение
Я против классового программирования. Хочу всё через структуру сделать.
Я не c++ - шные классы имел ввиду, а оконные.
С ними намного проще работать, чем с такой структурой. Вам нужно будет лишь описатели окон хранить, а остальные данные можно взять из готовых API функций. Например, координаты можно получить функцией GetWindowPos.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
06.03.2013, 18:16  [ТС]
Цитата Сообщение от denys_l Посмотреть сообщение
А в чем смысл?
Смысл в простоте использования и понимания. Классы - очень "замухристая" тема, которую многие начальные программисты не понимают, и я в их числе. А вот структуры - очень даже, причём хоть и именно классы являются основой ООП, тем не менее с помощью структур так же можно создавать объекты... Всё дело опять же - в простоте! Как написания так и чтения...
0
78 / 78 / 9
Регистрация: 26.12.2011
Сообщений: 217
06.03.2013, 22:48
Вы моё сообщение неправильно трактуете. Перечитайте сначала.
Я предлагаю создать класс окна для регистрации через RegisterClassEx и последующего использования. Если вы знакомы с самым минимумом, то должны знать, что для этого нужно создать структуру WNDCLASSEX и заполнить её поля. После этого регистрируете и используете. Ничего сложного и заоблачного в этом нет.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
09.03.2013, 17:06  [ТС]
В общем вроде получается пока что по задуманному плану:
В глобальных:
C++
1
2
3
4
5
6
7
8
9
10
11
int dm=0;
 
struct dinamic
{
    char type[20];
    char ident[20];
    int x1, y1, x2, y2;
    int id;
    HWND hb;
};
dinamic *window;
В WM_CREATE (функции WndProc):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char vb[30]="";
dm=1;
        if(dm != 0)
        {
            window=new dinamic[dm];
            for(int i=0;i<dm;i++)
            {
                window[i].id = i+100;
                lstrcpy(window[i].type,"button");
                lstrcpy(window[i].ident,"ID_BOX");
                itoa(i,vb,10);
                strcat(window[i].ident,vb);
                window[i].x1 = 10;
                window[i].y1 = 10;
                window[i].x2 = 80;
                window[i].y2 = 30;
                window[i].hb = CreateWindow(TEXT(window[i].type), TEXT(window[i].ident), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, window[i].x1, window[i].y1, window[i].x2, window[i].y2, hWnd, (HMENU) window[i].ident, hInst, NULL);
                ShowWindow(window[i].hb,SW_HIDE);
            }
В итоге - функция ShowWindow делает невидимым это окно =)
Пойду немного отдохну и буду пробовать флаги добавлять...
0
78 / 78 / 9
Регистрация: 26.12.2011
Сообщений: 217
09.03.2013, 19:19
В обработчик сообщения WM_QUIT или WM_DESTROY не забудьте добавить освобождение памяти, выделенной на окна.
А так, зря моего совета насчет оконного класса не послушали )
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
09.03.2013, 19:29  [ТС]
Цитата Сообщение от zelim Посмотреть сообщение
В обработчик сообщения WM_QUIT или WM_DESTROY не забудьте добавить освобождение памяти, выделенной на окна.
А так, зря моего совета насчет оконного класса не послушали )
А разве при закрытии приложения память автоматом не освободится?... Так то я пишу delete если переменные не нужны, но вот если они по ходу всей программы нужны, то я даже не заморачивался никогда что память не освободится...
0
78 / 78 / 9
Регистрация: 26.12.2011
Сообщений: 217
09.03.2013, 20:01
Цитата Сообщение от Izual Посмотреть сообщение
А разве при закрытии приложения память автоматом не освободится?... Так то я пишу delete если переменные не нужны, но вот если они по ходу всей программы нужны, то я даже не заморачивался никогда что память не освободится...
Есть вероятность, что ОС не решится освободить память сама. Отсюда будет и так называемая утечка памяти.
Да и вообще:чистить за собой - знак хорошего стиля программирования )
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
09.03.2013, 21:02  [ТС]
Цитата Сообщение от zelim Посмотреть сообщение
Есть вероятность, что ОС не решится освободить память сама. Отсюда будет и так называемая утечка памяти.
Да и вообще:чистить за собой - знак хорошего стиля программирования )
Убирать за собой - быть хорошим человеком =) Спс. возьму на заметку.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.03.2013, 10:10  [ТС]
Раз уж, до сих пор актуально, то добавлю:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int dm=0;
 
struct dinamic
{
    char type[20];
    char ident[20];
    DWORD style;
    int x1, y1, x2, y2;
    int id;
    HWND hb;
};
dinamic *window;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
case WM_CREATE:
 
        dm=1;
        if(dm != 0)
        {
            window=new dinamic[dm];
            for(int i=0;i<dm;i++)
            {
                window[i].id = i+100;
                lstrcpy(window[i].type,"button");
                lstrcpy(window[i].ident,"ID_BOX");
                itoa(i,vb,10);
                strcat(window[i].ident,vb);
                window[i].x1 = 10;
                window[i].y1 = 10;
                window[i].x2 = 80;
                window[i].y2 = 30;
                window[i].style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;
                window[i].hb = CreateWindow(TEXT(window[i].type), TEXT(window[i].ident), window[i].style, window[i].x1, window[i].y1, window[i].x2, window[i].y2, hWnd, (HMENU) window[i].ident, hInst, NULL);
                //ShowWindow(window[i].hb,SW_HIDE);
            }
        }
        break;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.03.2013, 10:10
Помогаю со студенческими работами здесь

Создание глобальной переменной
Добрый день! Помогите, пожалуйста, с такой ситуацией: Есть записанный макрос в определенном файле, который вызывает форму. Название...

Создание объектов по ходу программы
Хаи гайсы. Давно мыслил над тем как создаются объекты прямо по ходу программы. Так вот столкнулся с такой вот проблемой. Мне нужно вот...

Как правильно расширять размер строки по ходу работы программы?
Как сделать динамическую строку ( string в С++ )? Пробовал вот так: char ch; int k = 0; do

Различие глобальной и глобальной статической переменной
у нас есть заголовочный файл со стражами, допустим global.h , его используют несколько других хейдеров и с++ файлов . когда там описаны...

Описание массивов по ходу работы
Здравствуйте. У меня есть вопрос, его суть объясню на небольшом примере: Есть несколько уже описанных массивов с которыми я веду работу....


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru