IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> StringGrid, обработка компонента
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


Всем приветы! У меня следующая ситуация, есть 3 столбика (но работа происходит с 2мя первыми) и сколько - то строк в компоненте stringgrid. В главной программе есть параметр, от которого зависит какие значения можно вводить в ячейки стрингрида. Допустим, этот параметр amount. Итак, возможны 2 ветки : 1) 0 < amount <= 9 - значит в ячейку стрингрида можно вводить только цифры от 1 до 9. 2) 10<=amount <=15 - значит в ячейку можно вводить как цифры от 1 до 9, так и числа от 10 до 15. На OnKeyPress я отлавливаю введённые пользователем цифры. А на OnSetEditText я пытаюсь выполнить большую часть описанного, но неособо выходит : вот этой процедурой обрабатывается событие OnSetEditText

procedure TExecute.SDAS(Sender: TObject; ACol, ARow: Integer; const Value: String);
begin
case execute.StringGrid2.Col of //работаем с 2мя первыми столбиками
0..1 :
case (amount) of
1..9 : If ( Length(Value) > 1 ) then StringGrid2.Cells[ACol, ARow] := Value[1]; \\1 ветка
10..15 : If ( Length(Value) > 2 ) then \\2 ветка
begin
if StrToInt (Value[1]) = 1 then
if value[2] In ['1','2','3','4','5'] then
StringGrid2.Cells[ACol, ARow] := Value[1] + Value[2] else
StringGrid2.Cells[ACol, ARow] := Value[1];


end;
end;
end;
end;

Помогите пожалуйста добить это дело.

Сообщение отредактировано: Tan -


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


Вот я уже продвинулся, но ещё что - то не так, возможно вы заметите, что именно :
procedure TExecute.SDAS(Sender: TObject; ACol, ARow: Integer; const Value: String);
begin
case execute.StringGrid2.Col of
0..1 :
case (amount) of
1..9 : If ( Length(Value) = 1 ) then StringGrid2.Cells[ACol, ARow] := Value[1];
10..15 :
If ( Length(Value) >= 2 ) then
begin
If ( ( StrToInt (value[1]) = 1 ) and ( ( StrToInt(Value[2] ) ) <= ( amount mod 10 ) ) )
Then StringGrid2.Cells[ACol, ARow] := Value[2]
Else StringGrid2.Cells[ACol, ARow] := Value[1];

end;

end;

end;
end;

procedure TExecute.FormKeyPress(Sender: TObject; var Key: Char); //Correct
begin
case execute.StringGrid2.Col of
0..1 :
case (amount) of
1..9 : If Not ( Key In ['0'.. chr(ord('0') + amount) ] ) then Key := #0;
10..15 : If Not ( Key In ['0'.. '9'] ) then Key := #0;
end;
end;
end;


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Я не понял, а чего бы тебе не сделать просто:

procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
ARow: Integer; const Value: String);
var
_value: integer;
error: boolean;
begin
error := false;
try
_value := strtoint(value);
except
error := true;
end;

if error or (_value < 0) or (_value > amount)
then StringGrid1.Cells[ACol, ARow] := '';
end;

И попробуй ввести значение больше Amount или меньше 0, точно так же, как и нечисловое значение...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


Хех, как всё оказалось просто и коротко, спасибо вам большое! Пойду разбираться.


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


В процессе разбора у меня возник вопрос. Допустим в одну из ячеек мы ввели значение, а потом переключаемся на другую ячейку и выдаётся ошибка '' is not a valid integer value (или причина в том, что в одной ячейке мы ввели одно значение, потом в ней же изменили его и перешли на другую). Мне интересно, это может быть как - то связано с процедурой, которая описана выше, просто вроде бы до неё такого не было. Спасибо.


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
Допустим в одну из ячеек мы ввели значение, а потом переключаемся на другую ячейку и выдаётся ошибка '' is not a valid integer value
Если не менять ничего кроме того обработчика, который я показал - такого в принципе не может быть, любая попытка ввести нечисловое значение карается исключением, которое выбрасывает StrToInt, следовательно флаг Error будет установлен в True, и некорректное значение будет просто сброшено (вместо него пишется пустая строка).

Если же были какие-то другие махинации с StringGrid-ом - то может быть все, что угодно... Это надо смотреть программу полностью.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Галка "Stop On Delphi Exceptions" у тебя установлена... Сними ее (или запускай программу из Windows Explorer-а а не из IDE)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


огромное спасибо, вопрос исчерпан.


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.09.2020 3:08
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name