Сравнение в AdvStringGrid, Сравнение двух ячеек в AdvStringGrid |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Сравнение в AdvStringGrid, Сравнение двух ячеек в AdvStringGrid |
Atreides |
19.07.2012 11:44
Сообщение
#1
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
Добрый день!
Нужно сравнить два ячейки в AdvStringGrid.Казалось, что может быть проще, но что-то у меня возникли трудности. Задача, есть две колонки в гриде "от" и "до". Пользователь может редактировать обе, но значения "до" не должно быть меньше "от" и соответственно "от" не должно превышать "до", строка значений "от" и "до" одинаковая, разница только в колонках. В итоге нельзя отпускать пользователя пока не введет корректно. Не удается привязать ни к одному событию, ибо если число многозначное условие срабатывает на первом символе и не дает ввести дальше. Есть еще варианты кроме просто сравнения? -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
19.07.2012 12:39
Сообщение
#2
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата Казалось, что может быть проще Оказалось, что не казалось. Ничего проще в TAdvStringGrid-е быть действительно не может. У него есть событие OnEditCellDone, в котором можно проверять, какой именно столбец редактировался, сравнить данные с данными соседнего столбца, и, при необходимости, вернуть пользователя к редактированию через EditorMode = True |
Atreides |
19.07.2012 12:56
Сообщение
#3
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
Оказалось, что не казалось. Ничего проще в 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 |
19.07.2012 13:05
Сообщение
#4
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
У меня в Дельфи нет этого компонента, есть в Билдере. Но смысл должен быть понятен:
void __fastcall TForm1::AdvStringGrid1EditCellDone(TObject *Sender, int ACol, int ARow) |
Atreides |
19.07.2012 13:23
Сообщение
#5
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
Не владею С, вот попробовал. Вроде верно отрабатывает, но чет с фокусом не совсем разобрался. Мне как не отпускать пользователя с клетки?
Код 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 |
19.07.2012 13:49
Сообщение
#6
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Установи активной ячейкой ту, которая была изначально отредактирована, и только потом переходи в EditMode:
procedure TfrmNormRemont.sgNormRemontEditCellDone(Sender: TObject; ACol, Только зачем тебе это делать при редактировании любой ячейки? Поставь доп. условие, если ACol = 2 или 3, только тогда проверяй... |
Atreides |
19.07.2012 13:54
Сообщение
#7
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
Я так догадываюсь, что он должен войти в режим ввода числа, а он просто выделяет ячейку.
-------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
TarasBer |
19.07.2012 15:13
Сообщение
#8
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> // В Дельфи можешь выделить это во вложенную процедуру, чтоб не дублировать код
Сообщение отредактировано: TarasBer - 19.07.2012 15:14 -------------------- |
IUnknown |
19.07.2012 16:09
Сообщение
#9
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
TarasBer, ты на самом деле думаешь, что Билдер (любой, у меня 2009, если что) поддерживает все фишки нового стандарта?
Цитата Я так догадываюсь, что он должен войти в режим ввода числа, а он просто выделяет ячейку. Я написал тебе код во втором сообщении, он работает корректно. Проверить на Дельфи не могу, сказал уже. Тебе что, записать видео, как ведет себя программа при запуске? Пока не введешь в столбцах 2 или 3 корректное число - не выйдешь из режима редактирования. Твой огрызок, который приведен ниже этого не делает.Добавлено через 4 мин. Блин... EditorMode а не EditMode !!! |
Гость |
19.07.2012 17:36
Сообщение
#10
|
Гость |
Работает! Огромное спасибо!
Вопрос не в темку. Как сделать, чтоб запретить ввод значений в двух столбцах. Сделал так, но лочит только последнюю колонку. Надо залочить 0 и 19 колонку. Код procedure TfrmNormRemont.sgNormRemontSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin CanSelect := ACol <> 19; //19 and 0; end; |
IUnknown |
19.07.2012 17:56
Сообщение
#11
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
// CanSelect := not (ACol in [0, 19]);Выбирай, что больше нравится |
Гость |
19.07.2012 20:04
Сообщение
#12
|
Гость |
Все нравится! Огромное спасибо!
|
Atreides |
20.07.2012 10:30
Сообщение
#13
|
Ветеран Броуновского Движения Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: 0 |
Есть ли возможность запретить ввод с клавиатуры в ячейки Грида? При чем оставить возможность выбора из вписанного в эти ячейки комбобокса.
-------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
IUnknown |
20.07.2012 11:04
Сообщение
#14
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
В событии AdvStringGrid1GetEditorType для тех столбцов (или строк, как тебе нужно) в которых надо запретить ввод с клавиатуры - выставляй AEditor := edNone, тогда Inplace-редактор создаваться не будет, с клавиатуры ничего не введешь. А там, где AEditor := edComboList (Лист, а не Эдит) - и так только выбирать из списка, клавиатура там не помогает.
|
TarasBer |
20.07.2012 11:58
Сообщение
#15
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
TarasBer, ты на самом деле думаешь, что Билдер (любой, у меня 2009, если что) поддерживает все фишки нового стандарта?
-------------------- |
Текстовая версия | 28.04.2024 6:07 |