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

Функция для выпадающего списка ComboBox в ячейке StringGrid

12.12.2015, 14:50. Показов 5000. Ответов 6
Метки нет (Все метки)

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

Как реализовано: все таблицы (класса StringGrid) являются элементами массива. При нажатии на одну кнопку класса Button рисуется новая таблица, при нажатии на другую кнопку последняя таблица стирается. Для всего массива таблиц есть общие события. Осталось только реализовать динамически создаваемые выпадающие списки.

Любезным Шурик П. в тут была ссылка на сторонний форум был предоставлен рабочий код создания выпадающего списка.

(gr - TStringGrid, cmbGr - TComboBox, изначально - невидимый)
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
void __fastcall TForm1::grSelectCell(TObject *Sender, int ACol, int ARow,
      bool &CanSelect)
{
  if(ACol == 3 && ARow >= 1)
  {
    TRect rc = gr->CellRect(ACol, ARow);
    cl = ACol; rw = ARow;
    TPoint p(rc.Left, rc.Top);
    p = this->ScreenToClient(gr->ClientToScreen(p));
    cmbGr->SetBounds(p.x, p.y, rc.Width(), rc.Height());
 
    cmbGr->ItemIndex = 0;
    for(short i = cmbGr->Items->Count - 1; i >= 0 ; i--)
      if (gr->Cells[ACol][ARow] == cmbGr->Items->Strings[i])
      {
        cmbGr->ItemIndex = i; break;
      }
    cmbGr->Visible = true;
  }
  else
  {
    cmbGr->Visible = false;
    cl = -1; rw = -1;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cmbGrExit(TObject *Sender)
{
  gr->Cells[cl][rw] = cmbGr->Text ;
}
Теперь стоит задача из этого кода для одной таблицы (для события SelectCell) написать функцию, в которую можно было бы передавать в качестве переменных произвольную таблицу и произвольный комбобокс. Чтобы можно было вызывать её из события SelectCell, общего для массива таблиц. Я никак понять не могу, какие ещё параметры нужно передавать в функцию при её вызове. В качестве переменных включал TStringGrid, TComboBox, две переменных - столбца и строки, ACol, ARow, Rect. Но этого недостаточно. Ругается на This.

Помогите, пожалуйста!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.12.2015, 14:50
Ответы с готовыми решениями:

При выборе в ячейке города из выпадающего списка, в соседней ячейке отображать текущее время в этом городе
Добрый всем день. Помогите пжл решить такую задачку: Есть список городов, в т.ч. зарубеж. Нужно сделать, чтобы при выборе в ячейке...

Настроить ширину выпадающего списка для ComboBox
Можно ли программно (или предварительно в свойствах)настроить ширину выпадающего списка для ComboBox? Суть: выпадающий список по...

Сменить цвет обводки для выпадающего у Combobox списка
Вот он выделен на картинке

6
113 / 75 / 28
Регистрация: 26.07.2015
Сообщений: 124
12.12.2015, 16:34
Эта функция не нужна, грид сам прекрасно умеет работать с выпадающими списками, достаточно переопределить CreateEditor, вот тут было показано, как это сделать: Вставка combobox в ячейку stringgrid
1
1 / 1 / 2
Регистрация: 08.12.2015
Сообщений: 24
13.12.2015, 06:56  [ТС]
Почитал тему, нашёл ещё вот эту StringGrid, добавить ComboBox в определенный столбец. Там как раз описано решение моей задачи. Сел делать сам - ничего не получается.

Если не сложно, пожалуйста, скиньте проект с выпадающим списком в определённом столбце таблицы. У меня C++ Builder 6, если это важно. По-другому я никак не разберусь .
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
13.12.2015, 23:44
Может наоборот? Ты выкладываешь проект с попытками, а мы поправим, если что?
0
1 / 1 / 2
Регистрация: 08.12.2015
Сообщений: 24
14.12.2015, 01:43  [ТС]
Уважаемый volvo, очень приятно, что Вы ответили. Попробую изложить последовательность действий и возникающие при этом проблемы.

Для начала, пробую испытать код на простейшем примере. Как у ребят из вышеупомянутых тем, хочу сделать выпадающий список из элементов "0,1,2,3,4,5,6,7,8,9" во втором столбце таблицы класса TStringGrid.

Запускаю Builder, создаю StringGrid1, делаю таблице свойство Options->GoEditing->true.

Вставляю в Unit1.h код, который, насколько я понял, изменяет описание класса TStringGrid.
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
namespace SG_ComboBoxes
{
    class TStringGrid : public Grids::TStringGrid
    {
    private:
        __fastcall void GetCbxItems(int ACol, int ARow, TStrings *Items)
        {
            Items->Clear();
            Items->CommaText = "0,1,2,3,4,5,6,7,8,9";
        }
    protected:
        virtual TInplaceEdit* __fastcall CreateEditor(void)
        {
            TInplaceEditList *inplace = new TInplaceEditList(this);
            inplace->DropDownRows = 5;
            inplace->OnGetPickListitems = GetCbxItems;
            return inplace;
        }
        DYNAMIC TEditStyle __fastcall GetEditStyle(int ACol, int ARow)
        {
            if(ACol == 2) return esPickList;
            return esSimple;
        }
    public:
        __fastcall virtual TStringGrid(Classes::TComponent* AOwner)
            : Grids::TStringGrid(AOwner)
        {
        }
    };
}
Дальше сижу и пытаюсь понять, собственно, что и зачем я тут делаю. В общем, пытаюсь прочитать код.
GetCbxItems - в этой функции //или правильнее назвать это прототипом?// прописано, какие значения будут в выпадающем списке. Ок, хорошо.
CreateEditor - в этой функции дан алгоритм отрисовки самого окна выпадающего списка. Ясно, понятно.
GetEditStyle - функция содержит условие, при соблюдении которого в таблице появится выпадающий список. В данном случае, если столбец таблицы тождественно равен 2.

Если подвести черту, в описание класса введены изменения, отвечающие за появление в таком-то столбце определённого вида выпадающего списка с заданными значениями. Вроде, всё ясно.
Запускаю. Компилятор - без ошибок. Но в программе в таблице нет никаких выпадающих списков! Ни во 2-м столбце, ни где-либо ещё...

Почему? Что я делаю не так?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
14.12.2015, 10:24
Лучший ответ Сообщение было отмечено Enzi как решение

Решение

Цитата Сообщение от Enzi Посмотреть сообщение
Вставляю в Unit1.h код, который, насколько я понял, изменяет описание класса TStringGrid.
Это не полный код, нужен еще #define, который тоже был указан по ссылке:
C++
1
#define TStringGrid SG_ComboBoxes::TStringGrid
Именно он заставляет компилятор заменить стандартный StringGrid на тот, который описан в классе-перехватчике в собственном неймспейсе. Без этой строки ничего работать не будет.

Это во-первых. Во-вторых, ничего в гриде и не будет видно, пока не будет выбрана ячейка, которая должна содержать выпадающий список. Вот когда она будет выбрана - то вместо стандартного текстового редактора как раз появится комбобокс.
2
1 / 1 / 2
Регистрация: 08.12.2015
Сообщений: 24
14.12.2015, 14:14  [ТС]
volvo, большое спасибо! Вот теперь всё отлично.

Единственное что, этот код работает слегка по-другому, чем тот, который я привёл в первом посте данной темы. Он выводит выпадающий список не при выделении ячейки, а когда открывается окно ввода текста. Но это уже не суть. Решение задачи через изменение класса - гораздо более изящное и компактное!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.12.2015, 14:14
Помогаю со студенческими работами здесь

Функция для обработки значений из выпадающего списка optgroup
Добрый день, уважаемые форумчане. У меня не получается реализовать одну идею. У меня есть выпадающий список optgroup с 20+ значениями. Мне...

Добавление выпадающего списка к ячейке
Всем, привет! Ситуация: программно создается несколько книг. Необходимо что бы в ячйках A1, A2,A3 созданных книг появлялся выпадающий...

Создание выпадающего списка в ячейке
Всем здравствуйте. У меня 2 вопроса. Есть БД созданная при помощи компонентов АДО, соединенная с Акцессом, база выводится в ДБГРИД, Поля...

Создание выпадающего списка в ячейке Excel
Всем здравствуйте!!! Я формирую электронные учебные журналы в виде excel файла для одного учебного заведения. И все почти готово. не знаю...

Добавление к ячейке выпадающего списка с элементами, содержащими запятые
Нужно использовать элементы списка, в которых есть запятые. Но в методе Range(ячейка).Validation.Add Type:=xlValidateList,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru