Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/56: Рейтинг темы: голосов - 56, средняя оценка - 4.54
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172

StringGrid событие по окончанию ввода

13.10.2013, 11:33. Показов 11301. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как отлавливать событие, когда завершается ввод данных в ячейку StringGrid? Я хочу сделать, чтобы, когда пользователь ввёл данные в ячейку StringGrid, - данные всей таблицы будут обрабатываться, сортироваться, таблица будет обновлена и т.п. Но не могу найти соответствующее событие на окончание ввода, в стандартных событиях такого нет, как я понял. Если использую OnSetEditText, то оно наступает постоянно в процессе ввода, что расточительно в данном случае и неудобно.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.10.2013, 11:33
Ответы с готовыми решениями:

Событие по окончанию изменений
Всем привет. Имеется приложение на C# под Win.Forms. На форме есть ползунок типа TrackBar. Хочется реализовать событие, которое будет...

Выполнение скрипта по окончанию ввода
Добрый день. Помогите решить проблему, необходимо сделать текстовое поле, при вводе в которое осуществляется ajax запрос к php файлу - с...

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

13
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
13.10.2013, 12:40
Цитата Сообщение от Obert Посмотреть сообщение
OnSetEditText, то оно наступает постоянно в процессе ввода
Можно одновременно с этим проверить, чему равно свойство EditorMode, если false - то редактирование завершено. Это спасет при завершении через нажатие Enter-а, но не спасет, если пользователь просто активирует на другую ячейку.

Вот тут я показывал один из путей определения момента, когда закончено редактирование ячейки грида: https://www.cyberforum.ru/post4540923.html
1
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
13.10.2013, 14:48  [ТС]
Да, первый способ действительно не работает при ненажатии на Enter, а потому бесполезен. А вот в вашем примере всё работает правильно, спасибо.

Добавлено через 1 час 50 минут
UI, вот разбираю ваш пример, не получается... Вот вы создаёте StringGrid и затем:

C++
1
g->OnChangeMode = ChangedMode; // Вот это событие возникает в начале/конце редактирования
У меня StringGrid готовый, вот пытаюсь написать в FormCreate:

C++
1
MainStringGrid->OnChangeMode = ChangedMode;
У меня не принимает:
E2316 'OnChangeMode' is not a member of 'TStringGrid'
E2316 'OnChangeMode' is not a member of '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
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    g = new TMyStringGrid(NULL);
    g->Parent = this;
    g->Align = alTop;
 
    g->OnChangeMode = ChangedMode; // Вот это событие возникает в начале/конце редактирования
}
 
// Кнопка и Memo - только для проверки, что событие нормально работает
// и при переходе на другие контролы тоже
 
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ChangedMode(TObject *Sender)
{
    if(g->IsEditMode())
        Caption = dynamic_cast<TStringGrid*>(Sender)->ClassName() + L" : Редактируется";
    else
        Caption = "";
}
 
 
//---------------------------------------------------------------------------
void __fastcall TMyInplaceEdit::WndProc(Winapi::Messages::TMessage &Message)
{
    if((Message.Msg == WM_SETFOCUS) || (Message.Msg == WM_KILLFOCUS))
        ChangeMode(Message.Msg == WM_SETFOCUS);
    TInplaceEdit::WndProc(Message);
}
 
void TMyInplaceEdit::ChangeMode(bool mode)
{
    FMode = mode;
    if(FOnChangeMode)
    {
        FOnChangeMode(Grid);
    }
}
 
TInplaceEdit* __fastcall TMyStringGrid::CreateEditor()
{
    SpecEditor = new TMyInplaceEdit(this);
    SpecEditor->FOnChangeMode = FOnChangeMode;
    return SpecEditor;
}


Компилятор ругается уже на строке
C++
1
g = new TMyStringGrid(NULL);
E2451 Undefined symbol 'g'

Ваш же пример компилируется нормально... Что я делаю неправильно?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
13.10.2013, 15:28
Цитата Сообщение от Obert Посмотреть сообщение
E2451 Undefined symbol 'g'
У меня в приватной части класса TForm1 описана переменная g типа TMyStringGrid*, у тебя, как видно, ее нет...
1
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
13.10.2013, 16:53  [ТС]
Не, это кошмар какой-то... Уже несколько часов бьюсь, бесит уже...
В конце концов добавил в свой h всё из h вашего примера, добавил в свой cpp всё из вашего cpp. Всё равно не компилируется:

[ilink32 Error] Error: Unresolved external '__fastcall TMyInplaceEdit::WndProc(Winapi::Messages ::TMessage&)' referenced from D:\DOCUMENTS\PROGRAMMING\C++\XE5\OTTO\WI N32\DEBUG\UNIT1.OBJ

Добавлено через 1 минуту
Компилироваться перестаёт как только видит g = new TMyStringGrid(NULL);
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
13.10.2013, 17:13
Ну чудес ведь не бывает, правда? Если мой проект нормально компилируется, значит, там все добавлено. Надо искать, чего не хватает... К сожалению, теоретически (не видя твоего проекта) помочь ничем не могу...

Цитата Сообщение от Obert Посмотреть сообщение
TMyInplaceEdit::WndProc
у меня в Unit1.cpp начиная с 37-ой строки, что значит "Unresolved"?
0
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
13.10.2013, 17:38  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Ну чудес ведь не бывает, правда? Если мой проект нормально компилируется, значит, там все добавлено. Надо искать, чего не хватает...
Ну да, не бывает... Вернулся к предыдущей сохранённой версии своего проекта, вставил строки из твоего примера снова, сейчас всё заработало... Дальше, надеюсь, разберусь...
0
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
15.10.2013, 17:59  [ТС]
Вот сделал гораздо проще:

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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
 
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------}
void EditingEnd() // редактирование завершено
{ Beep();
}
 
 
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1SetEditText(TObject *Sender, int ACol, int ARow,
          const UnicodeString Value)
{
    if (!StringGrid1->EditorMode) {
        EditingEnd();
    }
}
//---------------------------------------------------------------------------}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow,
          bool &CanSelect)
{   static int CRw, CCl;
    if (((CRw!=StringGrid1->Row)||(CCl!=StringGrid1->Col))&(StringGrid1->EditorMode)) {
        EditingEnd();
    }
    CRw=StringGrid1->Row; CCl=StringGrid1->Col;
}
//---------------------------------------------------------------------------
Реагирует как на Enter, так на просто клик по другой ячейке, так и на потерю фокуса при нажатии Tab.
2
UeArtemis
18 / 18 / 3
Регистрация: 23.09.2011
Сообщений: 205
19.08.2019, 13:12
Я так делаю.
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::StringGrid1SetEditText(TObject *Sender, int ACol, int ARow, const UnicodeString Value)
{
    static String TMPstr("!!!");
    if(TMPstr == Value)
    {
 
    }
    else TMPstr = Value;
}
//---------------------------------------------------------------------------
Редактирование ячейки завершается повтором последнего значения.
0
Модератор
 Аватар для D1973
9917 / 6454 / 2455
Регистрация: 21.01.2014
Сообщений: 27,389
Записей в блоге: 3
19.08.2019, 15:58
Цитата Сообщение от TheDarkMax2 Посмотреть сообщение
Редактирование ячейки завершается повтором последнего значения.
TheDarkMax2, раз уж Вы подняли давно мертвую тему, то будьте любезны объяснить, что в Вашем случае произойдет при вводе слова "длинношеее"???
0
UeArtemis
18 / 18 / 3
Регистрация: 23.09.2011
Сообщений: 205
19.08.2019, 16:43
Я запоминаю строку, а не символ.
0
Модератор
 Аватар для D1973
9917 / 6454 / 2455
Регистрация: 21.01.2014
Сообщений: 27,389
Записей в блоге: 3
19.08.2019, 17:55
Цитата Сообщение от TheDarkMax2 Посмотреть сообщение
Я запоминаю строку, а не символ.
т.е. Вы предлагаете всю строку повторно ввести для того, чтобы она один раз отобразилась??? Или как Ваше высказывание понять:
Цитата Сообщение от TheDarkMax2 Посмотреть сообщение
Редактирование ячейки завершается повтором последнего значения
Вы уж или объясните популярно, или не лезьте в мертвые темы... А по Вашему коду можно понять только одно: там нифига не понятно, что происходит!
0
UeArtemis
18 / 18 / 3
Регистрация: 23.09.2011
Сообщений: 205
19.08.2019, 18:58
Я имею в виду, что функция срабатывает при каждом изменении в строке и ЕЩЁ ОДИН раз при завершении редактирования. Сравнив новое значение с предыдущим, можно понять, закончился ли ввод в ячейку.
Два последних срабатывания функции будут с одинаковыми Value.
1
0 / 0 / 0
Регистрация: 15.04.2021
Сообщений: 1
16.04.2021, 08:07
Цитата Сообщение от TheDarkMax2 Посмотреть сообщение
Я запоминаю строку, а не символ.
Логика!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.04.2021, 08:07
Помогаю со студенческими работами здесь

Событие OnGetEditText в StringGrid
с событием OnGetEditMask в StringGrid понятно ,там если захотим ввести определенный формат цифр или сочетание букв и цифр то...

Stringgrid событие OnSetEditText
Доброго времени суток! Подскажите как исправить код, чтобы при повторном изменении ячейки не выдавало ошибки. Заранее спасибо. ...

Событие на пустую область StringGrid
Добрый день. Событие MouseDown реагирует на клик в том числе и по пустой области грида. Возможно пресечь данное поведение? Добавлено...

Динамическое событие onDrawCell у StringGrid
Я создал динамический StringGrid. Теперь хочу ему сделать событие OnDrawCell. Функцию с нужными параметрами создал, но при компиляции...

Событие клика на ячейку StringGrid
Добрый вечер. Есть StringGrid1 на форме Form1. Он заполнен различной информацией. Информация в первом столбце - порядковый номер строки....


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

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