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

Повторное заполнение ComboBox

11.09.2016, 17:20. Показов 744. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер! Проблема такая: делаю список доступных Com портов, сначала ищу их и заполняю combobox, затем при повторном вызове диалогового окна, я хочу заполнить бокс тем же списком, что и был, поэтому чтобы не искать два раза, сразу же заполняю и массив указателей и из него забираю данные для заполнения, первый раз всё работает нормально, но при последующих выскакивает такая ерунда, кто подскажет в чём ошибка?

Глобальные переменные:
C++
1
2
3
4
5
static int cIndex,cIndexLess10;
char * CONNECT[19];
int FLAG_COMLIST_FULL=0; // флаг заполнения списка com портов
int FLAG_CONNECTION=0; // флаг соединения
int k,newcon=0;
Функция диалога:
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
INT_PTR CALLBACK Dialog3(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hWndComboBox;
    char * less10 = "COM";
    char * more10 = "\\\\.\\COM";
    char * more10new="\\\\.";
    int ERR;
    switch(message)
    {
    case WM_INITDIALOG:
        {
        hWndComboBox = GetDlgItem(hDlg,IDC_COMBOB1);
        int i;
        char str[3];
        if(FLAG_COMLIST_FULL == 0) // ищем доступные порты и заполняем первый раз
        {
        for(i=0;i<19;i++)
        {
            char * buf1 = new char[strlen(_itoa(i,str,10))+strlen(less10)+1];
            char * buf2 = new char[strlen(_itoa(i,str,10))+strlen(more10)+1];
            if(i<10) // если номер порта меньше 10
            {
                strcpy(buf1,less10);
                strcat(buf1,str);
                port = CreateFile(buf1,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
                ERR = GetLastError();
                if(ERR!=2)
                {
                    //SendMessage(hWndComboBox,CB_ADDSTRING,0,(LPARAM)buf1);
                    CONNECT[k]=buf1;
                    SendMessage(hWndComboBox,CB_ADDSTRING,0,(LPARAM)CONNECT[k]);
                    k++;
                    cIndexLess10++;
                }
                if(ERR==0)  
                    CloseHandle(port);
            }
            else // если больше 10
            {
                strcpy(buf2,more10);
                strcpy(buf1,less10);
                strcat(buf2,str);
                strcat(buf1,str);
                port = CreateFile(buf2,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
                ERR = GetLastError();
                if(ERR!=2)
                {
                    CONNECT[k]=buf1;
                    SendMessage(hWndComboBox,CB_ADDSTRING,0,(LPARAM)CONNECT[k]);
                    k++;
                }
                if(ERR==0)
                    CloseHandle(port);
            }
            delete[] buf1;
            delete[] buf2;
        }
        SendMessage(hWndComboBox,CB_SETCURSEL,cIndex,0);
        FLAG_COMLIST_FULL = 1 ; // список заполнен
        newcon=k; // количество найденных портов
        }
        else // заполняем в n-й раз
        {
            for(i=0;i<newcon;i++)
                SendMessage(hWndComboBox,CB_ADDSTRING,0,(LPARAM)CONNECT[i]);
            SendMessage(hWndComboBox,CB_SETCURSEL,cIndex,0);
        }
 
        return TRUE;
        }
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
            case IDOK:
                cIndex = SendMessage(hWndComboBox,CB_GETCURSEL,0,0);
                if(cIndex>cIndexLess10) // если номер порта >=10
                {
                    char * buf3 = new char[strlen(CONNECT[cIndex])+strlen(more10new)+1];
                    strcpy(buf3,more10new);
                    strcat(buf3,CONNECT[cIndex]);
                    port = CreateFile(buf3,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
                    ERR = GetLastError();
                    if(ERR==0)
                    {
                        SetWindowText(hStat1,"Connected");
                        FLAG_CONNECTION = 1;
                        dcb = SetDCB(dcb);
                        ct = SetCMTM(ct);
                        SetupComm(port,8192,2048);
                        SetCommState(port,&dcb);
                        SetCommTimeouts(port,&ct);
                    }
                    else
                        MessageBox(hWnd,"Unable to open a serial port","ERROR",MB_OK);
                    delete[] buf3;
                }
                else
                {
                    port = CreateFile(CONNECT[cIndex],GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
                    ERR = GetLastError();
                    if(ERR==0)
                    {   
                        SetWindowText(hStat1,"Connected");
                        FLAG_CONNECTION = 1;
                        dcb = SetDCB(dcb);
                        ct = SetCMTM(ct);
                        SetupComm(port,8192,2048);
                        SetCommState(port,&dcb);
                        SetCommTimeouts(port,&ct);
                    }
                    else
                        MessageBox(hWnd,"Unable to open a serial port","ERROR",MB_OK);
                }
                if(FLAG_CONNECTION==1)
                    EnableMenuItem(hMenu1,111,MF_BYCOMMAND|MF_DISABLED);
                    InvalidateRect(GetParent(hDlg),NULL,1);
            case IDCANCEL : 
            return EndDialog(hDlg, 0);
        }
        return TRUE;
    default: return FALSE;
    }
    return FALSE;
}
Миниатюры
Повторное заполнение ComboBox   Повторное заполнение ComboBox  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.09.2016, 17:20
Ответы с готовыми решениями:

Заполнение ComboBox
Добрый день! Пытаюсь заполнить ComboBox с помощью кода программы BOOL WINAPI WndProc (HWND hwnd,UINT uMsg,WPARAM wpar,LPARAM lpar ) ...

Заполнение Combobox'a процессами
Не получается заполнить combobox . ... hWndComboBox = CreateWindow(&quot;Combobox&quot;, &quot;&quot;, WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST, ...

Повторное заполнение progressBar из таймера
есть progressbar и есть timer все подсоединил , все работает (один раз ) я хочу что бы эта полоска обновлялась и снова плыла в право ......

6
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
11.09.2016, 17:26
Цитата Сообщение от Dimasick77 Посмотреть сообщение
при последующих выскакивает такая ерунда
Потому что у тебя buf1 локализована в цикле. Сделай ее глобальной.
0
0 / 0 / 0
Регистрация: 17.03.2015
Сообщений: 7
11.09.2016, 22:07  [ТС]
Цитата Сообщение от Hikari Посмотреть сообщение
Потому что у тебя buf1 локализована в цикле. Сделай ее глобальной.
Объявил char * buf1,*buf2,*buf3 глобально, не помогло :/

Добавлено через 4 часа 32 минуты
Причем, если не освобождать память с помощью delete[], то всё работает..
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
12.09.2016, 14:24
Цитата Сообщение от Dimasick77 Посмотреть сообщение
если не освобождать память с помощью delete
А ты еще и освобождаешь?
Ну конечно же не делай этого )
https://msdn.microsoft.com/en-... s.85).aspx
Строка добавляемая не копируется куда-то, а просто на нее добавляется указатель для контрола.
0
0 / 0 / 0
Регистрация: 17.03.2015
Сообщений: 7
12.09.2016, 16:28  [ТС]
Цитата Сообщение от Hikari Посмотреть сообщение
Строка добавляемая не копируется куда-то, а просто на нее добавляется указатель для контрола.
Так, а я же создаю массив с указателями, разве не оттуда берется указатель? массив же никуда не девается, а buf1 я просто использовал в промежутке кода и удалил. В принципе программа много памяти не занимает, и если не удалять, ничего плохого не будет, просто, я думал, что это плохой стиль) Возможно со своим абстрактным представлением я что-то путаю))
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
12.09.2016, 16:52
Цитата Сообщение от Hikari Посмотреть сообщение
Строка добавляемая не копируется куда-то, а просто на нее добавляется указатель для контрола.
Копируется. Просто он удаленными указателями заполняет, когда это происходит второй раз.

Dimasick77, а если порт подключили во время работы программы?
0
0 / 0 / 0
Регистрация: 17.03.2015
Сообщений: 7
12.09.2016, 17:48  [ТС]
Цитата Сообщение от GoshaM Посмотреть сообщение
а если порт подключили во время работы программы?
Ну тут просто требуется перезапустить программу, первый поиск занимает довольно много времени, поэтому постоянно его проводить невыгодно. Возможно потом как-нибудь додумаю этот вариант.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.09.2016, 17:48
Помогаю со студенческими работами здесь

Заполнение одного ComboBox-а в зависимости от выбранного значения в другом ComboBox-е
Можно ли сделать так, чтобы если я выбирают первый пункт в первом ComboBox1, а во втором при определенном услови заполнялись нужные данные....

Заполнение ComboBox из БД в зависимости от выбранного значения в другом ComboBox
Т.к. я не профессионал, прошу сразу не закидывать палками )) Проблема следующая, грубо говоря на форме преславутые зависимые ComboBox,...

Заполнение ComboBox в соответствии со значением другого ComboBox
Значицца имеются, например, две таблички: Дисциплина (Математика, История, Язык, Информатика, и т.д.) и Работа (Модуль 1, Модуль 2,...

Стирание ранее заполненного DataSet и повторное заполнение. Нарушение отображения в DataGridView
Доброго времени суток, Господа. У меня возникла проблема, которую не могу решить уже не первый день... Вообщем есть БД, в ней есть...

Заполнение comboBox по 2м параметрам из других comboBox
Доброе время суток. Можете подсказать как решить задачу. Написан вот такой код namespace WindowsFormsApp1 { public partial...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru