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

StringGrid удаление выделенной строки с выползающим меню

09.12.2016, 11:03. Показов 3545. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день уважаемые форумчани!
У меня в программе есть вкладка Журнал событий , в нее записываются ошибки ,предупреждения ,процессы. На рисунке ниже вы можете увидеть мою вкладку .
Я хочу сделать удаление тревог из журнала событий по нажатию на строку , но чтобы вылезло меню с надписью подтвердить.
Этими действиями оператор данной машины будет подтверждать исправленные им ошибки , а оставшиеся будут висеть как не сделанные. При удаление хотелось бы последующие записи смещать вверх.
Миниатюры
StringGrid удаление выделенной строки с выползающим меню  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.12.2016, 11:03
Ответы с готовыми решениями:

Отрисовка выделенной строки и ячейки в StringGrid
Есть компонент TStringGrid SGLoads. В событии OnDrawCell я выделяю светло-голубым цветом ячейки...

Прокрутить вертикальный скролбар до выделенной строки в StringGrid
Добро всем :senor: У меня в шестой колонке стоит дата которую я проверяю на корректность и если...

Выделение и удаление памяти, выделенной для динамической строки
Данная функция производит ввод и собственно контроль ввода (размер массива от 1 до 20, иначе должна...

11
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33369 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,890
Записей в блоге: 12
09.12.2016, 11:21
Лучший ответ Сообщение было отмечено djelmik777 как решение

Решение

C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::StringGrid1Click(TObject *Sender)
{
    if(MessageDlg(L"Удалить строку?", mtWarning, TMsgDlgButtons() << mbOK << mbCancel, 0) == mrOk)
    {
        TStringGrid *grid = static_cast<TStringGrid*>(Sender);
        grid->DeleteRow(grid->Row);
    }
}
, чтобы открыть метод DeleteRow - нужно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
// в h-файле, перед описанием класса формы:
namespace StringGrid_Delete
{
    class TStringGrid : public Grids::TStringGrid
    {
    public: // открываем в перехватчике оба метода
        using Grids::TStringGrid::DeleteRow;
        using Grids::TStringGrid::DeleteColumn;
    };
};
// и подсовываем перехватчик вместо стандартного компонента
#define TStringGrid StringGrid_Delete::TStringGrid
2
0 / 0 / 0
Регистрация: 07.07.2015
Сообщений: 41
09.12.2016, 11:48  [ТС]
Огромное спасибо именно то что я и хотел , только как мне выделить строку а потом над этой строкой сделать удаление , чтоб не по центру вылетало а над строкой .
Заранее благодарен

Добавлено через 4 минуты
После удаления , почемуто курсор вниз StringGridа бросает, не подскажите почему ?
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
09.12.2016, 13:51
djelmik777,
можно выделить так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TColor cwet = clGradientActiveCaption,// цвет курсора в списке
         int count = StringGrid1->RowCount; // подсчет количества строк
         int row = StringGrid1->Row;  // строка на которой стоит курсор
{
////////////////////////////////////////////////////////////////////////////////
     cwet = clRed; // закрашиваю красным строку для удаления
 
////////////////////////////////////////////////////////////////////////////////
        TGridRect rect;
        rect.Top = StringGrid1->Row;  // номер строки которую хотим выделить;
        rect.Left = 0; //номер колонки, с которой хотим выделить;
        rect.Right = 3; //  номер колонки, до которой хотим выделить;
        rect.Bottom = StringGrid1->Row; // номер строки которую хотим выделить;
        StringGrid1->Selection = rect;// закрашиваем строку
}
Добавлено через 53 минуты
перемещение строк
C++
1
2
3
4
5
6
7
8
//..............................................................................
     for ( int i = row; i < count-1; i++ )//начать перемещение с помеченой строки
        {       //перезаписываю нижнюю строку в верхнюю
                StringGrid1->Rows[i] = StringGrid1->Rows[i+1];//перемещение строк вверх
        }
        StringGrid1->RowCount--; // удаляю последнею строку!
        StringGrid1->Rows[count-1]->Clear();// очистка последней строки!!!
// --------------------------------------------------------------------------
Добавлено через 4 минуты
Цитата Сообщение от djelmik777 Посмотреть сообщение
После удаления , почемуто курсор вниз StringGridа бросает, не подскажите почему ?
после всех действий укажи на какой строке должен быть курсор
C++
1
StringGrid1->Row = row;
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33369 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,890
Записей в блоге: 12
09.12.2016, 13:57
Цитата Сообщение от lifeforce Посмотреть сообщение
перемещение строк
Зачем? DeleteRow это делает сам.
0
0 / 0 / 0
Регистрация: 07.07.2015
Сообщений: 41
09.12.2016, 15:08  [ТС]
lifeforce спасибо за пример , но он почему то у меня не заработал. Volvo а исходя из вашего примера как можно выделив строку удалить и переместить на первую строку StringGrid , и меню чтоб над строкой вышло.
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
10.12.2016, 00:40
Цитата Сообщение от volvo Посмотреть сообщение
Зачем? DeleteRow это делает сам.
Я привел простой пример, без использования класса.
Цитата Сообщение от djelmik777 Посмотреть сообщение
lifeforce спасибо за пример , но он почему то у меня не заработал.
Что именно не заработало?
0
0 / 0 / 0
Регистрация: 07.07.2015
Сообщений: 41
10.12.2016, 13:06  [ТС]
C++
1
2
3
4
5
6
7
int Index = StringGrid3->Selection.Top;
if(Index != StringGrid3->RowCount-1)
 {
for(int i=Index; i<StringGrid3->RowCount-1; i++)
   StringGrid3->Rows[i] = StringGrid3->Rows[i+1];
   StringGrid3->RowCount--;
}
Ребята я в конце использовал этот код , он не бросает меня вниз , но хотел бы спросить как мне при нажатии вызвать PopupMenu а в нем уже сделать подтвердить удаление.

То есть я нажимаю на строку , выпадает PopupMenu в нем строка подтвердить.

C++
1
2
3
4
5
 if(MessageDlg(L"Удалить строку?", mtWarning, TMsgDlgButtons() << mbOK << mbCancel, 0) == mrOk)
    {
        TStringGrid *grid = static_cast<TStringGrid*>(Sender);
        grid->DeleteRow(grid->Row);
    }
в таком случае какие то мигания в таблице происходят , меня устраивает такой запрос на удаление , но по нажатию 2 раза мигает таблица после удаление тоже 2 раза мигает и бросает в самый низ таблицы.


И еще проблема появилась в том , что при удалении нумерация столбцов не соблюдается , то есть удалил 3 строка из 5 , номера 1 , 2 , 4 , 5 . Как мне эту проблему решить ?
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
11.12.2016, 15:44
Цитата Сообщение от djelmik777 Посмотреть сообщение
И еще проблема появилась в том , что при удалении нумерация столбцов не соблюдается , то есть удалил 3 строка из 5 , номера 1 , 2 , 4 , 5 . Как мне эту проблему решить ?
После каждого удаления строки, циклом проходиться по таблице и устанавливать новые номера строк.
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
11.12.2016, 22:30
djelmik777, можешь воспользоваться советом от Почтальон,
или как пользуюсь я, в своей программе.
C++
1
2
3
4
5
6
7
8
9
10
11
12
        String dlina = IntToStr (StringGrid1->RowCount).Length();//подсчет знаков в счетчике
     // здесь автоматическое  переименование строк!
        for ( r = 0; r < count; r++)
            {
        String strg = IntToStr (r+1); // определение длины текущего знак счетчика
//--------отнять из количества знаков в счетчике - текущий знак (длина) --------
        int nul = (dlina-strg.Length());//определяю сколько нужно добавить нулей в начало счетчика
        for (int t = nul; t > 0; t--) {
                          nn = nn+"0";}
        StringGrid1->Cells[0][r]=nn+strg;  //  [колонка] [строка]  "000"+
         nn="";
            }
при таком методе удобно делать сортировку по номеру строк. будет выведен правильный порядок строк(01...10,11...99). а не как 1,10...19, 2,20....29
1
0 / 0 / 0
Регистрация: 28.10.2020
Сообщений: 1
30.11.2020, 22:25
Цитата Сообщение от lifeforce Посмотреть сообщение
nn = n
что такое nn ?
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,355
Записей в блоге: 3
01.12.2020, 06:11
Строковая переменная, содержащая определенное количество нулей. По коду понятно же...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.12.2020, 06:11
Помогаю со студенческими работами здесь

Удаление выделенной строки из таблицы базы данных
Здравствуйте форумчане. Пишу базу данных по учету книг библиотекой. Столкнулся с проблемой:...

Удаление выделенной строки из стринггрида,запись в столбик
Ребят в общем такая проблема. Нужно организовать запись в файл столбиком, у меня получилось в...

Как передать выделенную строку из одного StringGrid в другой?
Собственно, такая задача: Есть таблица с данными и пустая таблица. Свойство StringGrid`а...

Выделение и перенос выделенных строк из DBGrid в memo или StringGrid c дальнейшем построением отчёта
Добрый день всем! Имеется DBGrid c записями,необходимо: 1) Выделять записи в гриде, с помощью...

Как в Stringgrid переместить выделенную ячейку в видимую область?
При реализации поиска в Stringgrid столкнулся с тем, что выделенная ячейка (результат поиска) часто...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru