Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/64: Рейтинг темы: голосов - 64, средняя оценка - 4.58
22 / 20 / 3
Регистрация: 21.05.2013
Сообщений: 408

ComboBox в StringGrid

21.11.2013, 08:20. Показов 12622. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, не нашел способа как в СтрингГрид засунуть компонент КомбоБокс
В Делфи я это уже делал теперь нужно на С++ Builder кто поможет кто подскажет как это делаеться как?

Пишу програмум
Нужно создать матрицу для этого взял стрингГрид + есть ComboBox в котором просто циферки выбираем цифру напремер "5" матрица 5 на 5, если "10" то матрица 10 на 10 по главной диагонали нужны все еденицы это я уже сделал... дальше надо чтобы все остальные ячейки СтрингГрида кроме главной диагонали можно было редактировать и вот для удобства хотелось бы чтобы там были все ячейки ComboBox заполненые цифрами от 1 до 9.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.11.2013, 08:20
Ответы с готовыми решениями:

ComboBox и StringGrid
Мне необходимо с помощью ComboBox, в котором записаны марки машин, организовать выбор фамилии и номера владельцев автомобилей этой марки. В...

Из StringGrid в ComboBox
Как сделать что бы в ComboBox, значения заполнялись из определённого столбца StringGrid'а?

Добавление ComboBox в StringGrid
Здравствуйте. Появилась необходимость добавить ComboBox в StringGrid. Есть таблица StringGrid , состоящая из трёх столбцов. Первые два...

31
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
25.11.2013, 11:24
Студворк — интернет-сервис помощи студентам
StalkerIQ, пробуйте реализовать. Возникнут сложности, обращайтесь.
0
22 / 20 / 3
Регистрация: 21.05.2013
Сообщений: 408
25.11.2013, 11:33  [ТС]
Ну это естественно прям сейчас сижу пытаюсь думаю часа через два отпишусь что получилось ^^
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
25.11.2013, 11:46
Цитата Сообщение от StalkerIQ Посмотреть сообщение
диагональ заполняет еденицами(1) и не даёт редактировать эту диагональ.
Мой код и так не дает редактировать диагональ. А все остальное делается вот таким простым изменением класса-перехватчика:

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
namespace SG_ComboBoxes
{
    class TStringGrid : public Grids::TStringGrid
    {
    private:
        __fastcall void GetCbxItems(int ACol, int ARow, TStrings *Items)
        {
            Items->Clear();
            Items->CommaText = "1,2,3,4,5,6,7,8,9"; // Убираешь 0 отсюда, ибо делить на 0 нельзя
        }
    protected:
        virtual TInplaceEdit* __fastcall CreateEditor(void)
        {
            TInplaceEditList *inplace = new TInplaceEditList(this);
            inplace->DropDownRows = 5;
            inplace->OnGetPickListitems = GetCbxItems;
            return inplace;
        }
        DYNAMIC Grids::TEditStyle __fastcall GetEditStyle(int ACol, int ARow)
        {
            return esPickList;
        }
        virtual bool __fastcall SelectCell(int ACol, int ARow)
        {
            return ACol != ARow;
        }
 
        // Тут, в зависимости от версии Билдера, могут быть разные типы строк, надо посмотреть,
        // какой именно тип используется в данной версии и подставить его в заголовок
        DYNAMIC void __fastcall SetEditText(int ACol, int ARow, const System::UnicodeString Value) // Это добавляем
        {
            double f;
            if(TryStrToFloat(Value, f))
            {
                Cells[ARow][ACol] = FloatToStr(1.0 / f);
                Cells[ACol][ARow] = Value;
            }
        }
        DYNAMIC void __fastcall SizeChanged(int OldColCount, int OldRowCount) // Это добавляем
        {
            for(int i = 0; i < ColCount; i++)
                Cells[i][i] = "1";
        }
    public:
        __fastcall virtual TStringGrid(Classes::TComponent* AOwner)
            : Grids::TStringGrid(AOwner)
        {
            ColCount = 6; // И это добавляем, чтобы сработало заполнение единицами при старте программы...
            RowCount = 6;
        }
    };
}
#define TStringGrid SG_ComboBoxes::TStringGrid
1
22 / 20 / 3
Регистрация: 21.05.2013
Сообщений: 408
25.11.2013, 12:08  [ТС]
Выдает
[C++ Error] Unit1.h(30): E2316 'UnicodeString' is not a member of 'System'
P.S. Я знаю что ваш код не дает редактировать диагональ.
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
25.11.2013, 12:14
StalkerIQ, ээээх)) Велика Лень)))
Написано же в 28-29 строках "Тут, в зависимости от версии Билдера, могут быть разные типы строк, надо посмотреть, какой именно тип используется в данной версии и подставить его в заголовок"
У меня 6я версия. Заметил UnicodeString на WideString в соответствии с прототипом функции. Всё работает.
0
22 / 20 / 3
Регистрация: 21.05.2013
Сообщений: 408
25.11.2013, 12:20  [ТС]
Если заменить на WideString.
[C++ Warning] Unit1.h(71): W8022 '_fastcall TStringGrid::SetEditText(int,int,const WideString)' hides virtual function '_fastcall Grids::TStringGrid::SetEditText(int,int, const AnsiString)'
[C++ Warning] Unit1.h(71): W8022 '_fastcall TStringGrid::SetEditText(int,int,const WideString)' hides virtual function '_fastcall TCustomDrawGrid::SetEditText(int,int,con st AnsiString)'
[C++ Warning] Unit1.h(71): W8022 '_fastcall TStringGrid::SetEditText(int,int,const WideString)' hides virtual function '_fastcall TCustomGrid::SetEditText(int,int,const AnsiString)'
И не работает...

Добавлено через 47 секунд
Заменил просто на String заработало.
P.S. Знал бы что писать не спрашивал бы.
0
 Аватар для Kulgar
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
25.11.2013, 12:20
StalkerIQ, откройте справку на функцию SetEditText и посмотрите какой у Вас там стоит тип строки.
0
22 / 20 / 3
Регистрация: 21.05.2013
Сообщений: 408
25.11.2013, 12:30  [ТС]
ЕСТЬ ПРОБЛЕМА.
Теперь нажимаю на ячейку выбераю цифру например 3 в противоположной ячейке втаёт 0.33 после того как кликаю на другую ячейку цифра 3 проподает, а 0.33 остается там где надо, но надо что бы оба числа оставались, ещё если раскрыть этот выбор 1-9 и не выбрать, а кликнуть на другую ячейку програма выдаёт ошибку.

Добавлено через 3 минуты
Открыл SetEditText посмотрел там WideString но с ним не работает. Только с String работает но с проблемами выше описал проблему.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
25.11.2013, 12:31
Цитата Сообщение от StalkerIQ Посмотреть сообщение
после того как кликаю на другую ячейку цифра 3 проподает, а 0.33 остается там где надо
Неправда. Этого не происходит, значит, что-то недоделал. Но мне, если честно, уже поднадоело... То и дело "не работает, не так работает". Знаешь, что? Пиши-ка сам... Чтобы всё работало так, как тебе хочется.

От темы отписываюсь...
1
22 / 20 / 3
Регистрация: 21.05.2013
Сообщений: 408
25.11.2013, 12:37  [ТС]
Исправил/добавил на
Cells[ARow][ACol] = FloatToStr(1./ StrToFloat(Value));
Cells[ACol][ARow] = FloatToStr(StrToFloat(Value));
Стало лучше, но что теперь делать с ошибкой когда кликаешь на ячейку появляется выпадающие меню, но выбор не сделан и кликается на другую ячейку выдает ошибку.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
25.11.2013, 13:02
... и есть еще вариант "васи пупкина" с невидимым комбобоксом. Он не такой изящный, как метод, предложенный UI, но возможен как выход из положения (плюс раздельные настройки таблицы и комбобокса).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void __fastcall TForm1::StringGrid1Click(TObject *Sender)
{ 
    TRect re = StringGrid1->CellRect(StringGrid1->Col,StringGrid1->Row);
    re.Left += StringGrid1->Left+2;
    re.Top  += StringGrid1->Top+2;
    re.right = re.Left+cbx1->Width ;
    cbx1->BoundsRect = re;
    cbx1->DroppedDown = true;
    cbx1->Visible = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cbx1Click(TObject *Sender)
{
   StringGrid1->Cells[StringGrid1->Col][StringGrid1->Row]=cbx1->Text;
   cbx1->Visible = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
   cbx1->Visible = false;
}
Вложения
Тип файла: rar Project1.rar (183.8 Кб, 28 просмотров)
1
UeArtemis
18 / 18 / 3
Регистрация: 23.09.2011
Сообщений: 205
18.12.2019, 15:51
Так как на форме несколько разных таблиц, решил условия появления комбобокса и списки сделать присваиваемыми, чтобы у каждой таблицы были свои.
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
namespace SG_ComboBoxes
{
    class TStringGrid : public Grids::TStringGrid
    {
    private:
        TNotifyEvent FOnGridButtonClick;
        TOnGetPickListItems FOnGetComboBoxItems;
        void __fastcall SetOnGridButtonClick(TNotifyEvent value)
        {
            FOnGridButtonClick = value;
            if(InplaceEditor)
                OnGridButtonClick = value;
        }
        void __fastcall SetOnGetComboBoxItems(TOnGetPickListItems value)
        {
            FOnGetComboBoxItems = value;
            if(InplaceEditor)
                OnGetComboBoxItems = value;
        }
        TStrings *FComboList;
    protected:
        virtual TInplaceEdit* __fastcall CreateEditor(void)
        {
            TInplaceEditList *inplace = new TInplaceEditList(this);
            inplace->OnGetPickListitems = FOnGetComboBoxItems;
            inplace->OnEditButtonClick  = FOnGridButtonClick;
            FComboList = inplace->PickList->Items;
            return inplace;
        }
        DYNAMIC TEditStyle __fastcall GetEditStyle(int ACol, int ARow)
        {
            TEditStyle MyStyle = esSimple;
            if( MyGetEditStyle )
                MyStyle = MyGetEditStyle(ACol,ARow);
            InplaceEditor->ReadOnly = (MyStyle == esSimple) ? false : true;
            return MyStyle;
        }
        //DYNAMIC void __fastcall SetEditText(int ACol, int ARow, const System::UnicodeString Value) { }
    public:
        __fastcall virtual TStringGrid(Classes::TComponent* AOwner)
            : Grids::TStringGrid(AOwner)
        {
            MyGetEditStyle  = NULL;
            FComboList      = NULL;
        }
        DYNAMIC bool IsCellReadOnly()
        {
            return InplaceEditor->ReadOnly;
        }
        __property TNotifyEvent         OnGridButtonClick   =
            { read = SetOnGridButtonClick,  write = FOnGridButtonClick };
        __property TOnGetPickListItems  OnGetComboBoxItems  =
            { read = SetOnGetComboBoxItems, write = FOnGetComboBoxItems };
        TEditStyle __fastcall (__closure *MyGetEditStyle)(int ACol, int ARow);
        int IndexOfCombo(String Str)
        {
            if(FComboList)
                return FComboList->IndexOf(Str);
            else
                return -1;
        }
        String ComboOfIndex(int i)
        {
            if(FComboList)
                return FComboList->Strings[i];
            else
                return "NULL";
        }
    };
}
#define TStringGrid SG_ComboBoxes::TStringGrid
Добавлено через 7 минут
MyGetEditStyle - функция с условием появления комбобокса,
OnGetComboBoxItems - функция, которая поставляет нужные списки.
В таком варианте их нужно добавлять каждому экземпляру TStringGrid вручную. Зато каждому свою
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.12.2019, 15:51
Помогаю со студенческими работами здесь

Работа с ComBobox в StringGrid
Здравствуйте, господа!! Подскажите, пожалуйста ,следующий момент: создаю несколько ComboBox в определенных ячейках StringGrid,...

StringGrid +check + Combobox
На форуме есть несколько тем внедрение выпадающего списка к таблицам (ТУТ, ТУТ и ТУТ), а вот как добавить к ним check? это возможно?

Сравнение содержания StringGrid и ComboBox
Хотелось бы сравнить содержание строчек таблицы из Form3 с содержащимися элементами компонента ComboBox1. Но их классы несовместимы, а...

Передача значения из ComboBox в StringGrid
Смысл такой... ComboBox рисуется на ячейке StringGrid, в комбе выбирается значение и записывается в эту ячейку. Проблема в том, что если...

Вставка combobox в ячейку stringgrid
Для вставки combobox в в ячейку stringgrid в событии OnSelectCell Stringgrid пишется код ниже (нашёл в интернете). Но при выделении...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru