![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
Atreides |
![]()
Сообщение
#1
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Добрый день!
Нужно сравнить два ячейки в AdvStringGrid.Казалось, что может быть проще, но что-то у меня возникли трудности. Задача, есть две колонки в гриде "от" и "до". Пользователь может редактировать обе, но значения "до" не должно быть меньше "от" и соответственно "от" не должно превышать "до", строка значений "от" и "до" одинаковая, разница только в колонках. В итоге нельзя отпускать пользователя пока не введет корректно. Не удается привязать ни к одному событию, ибо если число многозначное условие срабатывает на первом символе и не дает ввести дальше. Есть еще варианты кроме просто сравнения? -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Казалось, что может быть проще Оказалось, что не казалось. Ничего проще в TAdvStringGrid-е быть действительно не может. У него есть событие OnEditCellDone, в котором можно проверять, какой именно столбец редактировался, сравнить данные с данными соседнего столбца, и, при необходимости, вернуть пользователя к редактированию через EditorMode = True |
Atreides |
![]()
Сообщение
#3
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Оказалось, что не казалось. Ничего проще в TAdvStringGrid-е быть действительно не может. У него есть событие OnEditCellDone, в котором можно проверять, какой именно столбец редактировался, сравнить данные с данными соседнего столбца, и, при необходимости, вернуть пользователя к редактированию через EditorMode = True Так, а можно немного подробней про EditorMode? Событие срабатывает только когда перескакиваю на другую ячейку (что логично), а вот как тогда остаться на той же в которой только что вводил? Значения второй колонки не могут быть больше значений значений третьей. Код procedure GridEditCellDone(Sender: TObject; ACol, ARow: Integer); begin Grid.EditorMode := False; if Grid.Cells[3,ARow] < Grid.Cells[2,ARow] then ShowMessage('Повторите ввод'); Grid.EditorMode := True; end; Типа как то так? -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
![]()
Сообщение
#4
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
У меня в Дельфи нет этого компонента, есть в Билдере. Но смысл должен быть понятен:
void __fastcall TForm1::AdvStringGrid1EditCellDone(TObject *Sender, int ACol, int ARow) |
Atreides |
![]()
Сообщение
#5
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Не владею С, вот попробовал. Вроде верно отрабатывает, но чет с фокусом не совсем разобрался. Мне как не отпускать пользователя с клетки?
Код procedure TfrmNormRemont.sgNormRemontEditCellDone(Sender: TObject; ACol, ARow: Integer); begin if StrToInt(sgNormRemont.Cells[3, ARow])<StrToInt(sgNormRemont.Cells[2, ARow]) then begin ShowMessage('Oops, error!!!'); sgNormRemont.SetFocus(); sgNormRemont.EditMode :=True; end; end; -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
![]()
Сообщение
#6
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Установи активной ячейкой ту, которая была изначально отредактирована, и только потом переходи в EditMode:
procedure TfrmNormRemont.sgNormRemontEditCellDone(Sender: TObject; ACol, Только зачем тебе это делать при редактировании любой ячейки? Поставь доп. условие, если ACol = 2 или 3, только тогда проверяй... |
Atreides |
![]()
Сообщение
#7
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Я так догадываюсь, что он должен войти в режим ввода числа, а он просто выделяет ячейку.
-------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
TarasBer |
![]()
Сообщение
#8
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> // В Дельфи можешь выделить это во вложенную процедуру, чтоб не дублировать код
Сообщение отредактировано: TarasBer - 19.07.2012 15:14 -------------------- |
IUnknown |
![]()
Сообщение
#9
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
TarasBer, ты на самом деле думаешь, что Билдер (любой, у меня 2009, если что) поддерживает все фишки нового стандарта?
![]() Цитата Я так догадываюсь, что он должен войти в режим ввода числа, а он просто выделяет ячейку. Я написал тебе код во втором сообщении, он работает корректно. Проверить на Дельфи не могу, сказал уже. Тебе что, записать видео, как ведет себя программа при запуске? Пока не введешь в столбцах 2 или 3 корректное число - не выйдешь из режима редактирования. Твой огрызок, который приведен ниже этого не делает.Добавлено через 4 мин. Блин... EditorMode а не EditMode !!! |
Гость |
![]()
Сообщение
#10
|
Гость ![]() |
Работает! Огромное спасибо!
Вопрос не в темку. Как сделать, чтоб запретить ввод значений в двух столбцах. Сделал так, но лочит только последнюю колонку. Надо залочить 0 и 19 колонку. Код procedure TfrmNormRemont.sgNormRemontSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin CanSelect := ACol <> 19; //19 and 0; end; |
IUnknown |
![]()
Сообщение
#11
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
// CanSelect := not (ACol in [0, 19]);Выбирай, что больше нравится |
Гость |
![]()
Сообщение
#12
|
Гость ![]() |
Все нравится! Огромное спасибо!
|
Atreides |
![]()
Сообщение
#13
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Есть ли возможность запретить ввод с клавиатуры в ячейки Грида? При чем оставить возможность выбора из вписанного в эти ячейки комбобокса.
-------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
![]()
Сообщение
#14
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
В событии AdvStringGrid1GetEditorType для тех столбцов (или строк, как тебе нужно) в которых надо запретить ввод с клавиатуры - выставляй AEditor := edNone, тогда Inplace-редактор создаваться не будет, с клавиатуры ничего не введешь. А там, где AEditor := edComboList (Лист, а не Эдит) - и так только выбирать из списка, клавиатура там не помогает.
|
TarasBer |
![]()
Сообщение
#15
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
TarasBer, ты на самом деле думаешь, что Билдер (любой, у меня 2009, если что) поддерживает все фишки нового стандарта? ![]()
-------------------- |
![]() ![]() |
![]() |
Текстовая версия | 19.06.2025 23:08 |