Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2016, 09:45   #1
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
Восклицание сократить исключительную ситуацию > 140

Как бы сократить исключительную ситуацию > 140 в OnChange Edit1

Записал так:

Код:
if SelGIF > 140 then
begin
SelGIF := 140;
Edit1.Text := '140';
TrackBarGIF.Position := SelGIF;
end;
Но если ввожу 56 и случайно нажал 7, то будет 140, а как доделать такую исключительную ситуацию, чтобы если ввожу 567 то не получалось 140, а оставался запрет на большое число, но 56 оставалось, а не сбрасывало на Max := 140?


Последний раз редактировалось beegl; 28.04.2016 в 09:47. Причина: Edit text
beegl вне форума Ответить с цитированием
Старый 28.04.2016, 09:55   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
  if SelGIF > 140 then
  begin
    s:=Copy(IntToStr(SelGIF),1,3);
    if s>'140' then s:=Copy(s,1,2);
    SelGIF := StrToInt(s);
    Edit1.Text := s;
    TrackBarGIF.Position := SelGIF;
  end;
Камасутра
Изображения
Тип файла: jpg 1291624211_045.jpg (58.3 Кб, 46 просмотров)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.04.2016 в 10:06.
Аватар вне форума Ответить с цитированием
Старый 28.04.2016, 11:05   #3
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

А если вводим 145, то должно 140, т.к ошиблись границей? Или 14?
А если 157, то 15, т.к одну цифру случайно ввели?
Можно короче
Код:
  while SelGIF > 150 do SelGIF := SelGIF div 10;
  if SelGIF > 140 then SelGIF := 140;
  Edit1.Text := inttostr(SelGIF);
  TrackBarGIF.Position := SelGIF;
или если переход границы не учитывать
Код:
  while SelGIF > 140 do SelGIF := SelGIF div 10;
  Edit1.Text := inttostr(SelGIF);
  TrackBarGIF.Position := SelGIF;
Ну и длину вводимого текста ограничить в свойствах эдитов до 3 символов (тогда while и не нужен будет, а хватит if), чтобы переполнения integer не было

Последний раз редактировалось eoln; 28.04.2016 в 11:09.
eoln вне форума Ответить с цитированием
Старый 28.04.2016, 11:18   #4
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
Лампочка OnChange TrackBarGIF.Position <> Edit1.Text

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
  if SelGIF > 140 then
  begin
    s:=Copy(IntToStr(SelGIF),1,3);
    if s>'140' then s:=Copy(s,1,2);
    SelGIF := StrToInt(s);
    Edit1.Text := s;
    TrackBarGIF.Position := SelGIF;
  end;
Камасутра
Классно. Работает. А как сделать в OnChange TrackBarGIF, чтобы если Edit1.Text := '';, то TrackBarGIF.Position := 1;, но в Edit1.Text := '';

Делал так, зависает программа:

Код:
Edit1.Text := IntToStr(TrackBarGIF.Position);
  if Edit1.Text = '' then
  begin
    TrackBarGIF.Position := 1;
    Edit1.Text := '';
  end;
Цитата:
Сообщение от eoln Посмотреть сообщение
Ну и длину вводимого текста ограничить в свойствах эдитов до 3 символов (тогда while и не нужен будет, а хватит if), чтобы переполнения integer не было
Edit OnKeyPress

Код:
procedure TKamasutraForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = ',' then
    Key := DecimalSeparator; // запятую заменяем на разделитель для числа
  if Key = '.' then
    Key := DecimalSeparator; // точку заменяем на сепаратор (на всякий случай)
  if not (Key in ['0'..'9','-',DecimalSeparator,#8,#13]) // символы которые пропускаются
    or ((Key = DecimalSeparator) // все цифры знак минус разделитель
    and (POS (DecimalSeparator, Edit1.Text) > 0)) // запрет на второй сепаратор
    or ((Key = '-') and (POS ('-', Edit1.Text) > 0)) // запрет на второй минус
    or ((Key = '-') and (Edit1.SelStart <> 0)) // запрет на минус не вначале цифры
    then // (можно и предыдущей строчки но так лучше для понимания)
  begin
      Key := #0; // запрещенный символ заменяем нулем
      MessageBeep (MB_OK); // биб в спикир
  end;
end;
Edit OnChange

Код:
procedure TKamasutraForm.Edit1Change(Sender: TObject);
begin
SetKeys(VK_END);
if (Edit1.Text <= ' ') or (Edit1.Text = '') or (Edit1.Text = '0000') or
(Edit1.Text = '000') or (Edit1.Text = '00') or (Edit1.Text = '0') then
begin
SelGIF := 1;
Edit1.Text := '';
TrackBarGIF.Position := 1;
end else
SelGIF := StrToInt(Edit1.Text);
if FileExists(ExtractFilePath(Application.ExeName) + 'IMG\SEX' + IntToStr(SelGIF) +'.GIF') then
 begin
  DisplayGIF.Image.LoadFromFile(ExtractFilePath(Application.ExeName) +'IMG\SEX' + IntToStr(SelGIF) +'.GIF');
  TrackBarGIF.Position := SelGIF;
  Label3.Caption := 'SEX' + IntToStr(TrackBarGIF.Position) +'.GIF';
end;
if SelGIF > 140 then
  begin
    s := Copy(IntToStr(SelGIF),1,3);
    if s> '140' then s := Copy(s,1,2);
    SelGIF := StrToInt(s);
    Edit1.Text := s;
    TrackBarGIF.Position := SelGIF;
  end;

Последний раз редактировалось beegl; 28.04.2016 в 11:21. Причина: Edit text
beegl вне форума Ответить с цитированием
Старый 28.04.2016, 11:29   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Делал так, зависает программа:
Код:
// Edit1.Text := '';
 Edit1.Text := '1';
Зависает потому, что впадает в цикл без выхода
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.04.2016, 13:02   #6
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от beegl Посмотреть сообщение
...если ввожу 56 и случайно нажал 7, то будет 140, а как доделать такую исключительную ситуацию, чтобы если ввожу 567 то не получалось 140, а оставался запрет на большое число, но 56 оставалось, а не сбрасывало на Max := 140?
Например:
Код:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key in ['0'..'9'] then
if (StrToInt(Edit1.Text+Key)>140) then
key:=Chr(0);
end;
kropotkina-alice вне форума Ответить с цитированием
Старый 28.04.2016, 13:38   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

kropotkina-alice, а ваш код учитывает, что позиция ввода (курсор) может стоять не только в конце поля Edit1, но и в начале, и в середине?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.04.2016, 13:46   #8
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Если я сделаю всё, то ТС совсем не надо будет включать мозг, а это неправильно
Вот и пусть сам добавит проверку на ввод не цифровых значений и прочего.
Главное, что я хотела показать - что обработчик должен быть не на OnChange, а именно на нажатие клавиши...
kropotkina-alice вне форума Ответить с цитированием
Старый 28.04.2016, 13:56   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
обработчик должен быть не на OnChange, а именно на нажатие клавиши
А еще есть Ctrl-V. Так что OnChange, не так конечно как у ТС
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.04.2016, 15:01   #10
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А еще есть Ctrl-V. Так что OnChange, не так конечно как у ТС
Обработка OnChange - это обработка, увы, уже свершившегося факта.
А обработка нажатия - это предварительная обработка с целью недопущения ненужного события...
kropotkina-alice вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проясните ситуацию с С++ ak-o Общие вопросы C/C++ 7 24.01.2012 15:48
Проясните ситуацию с TImage MyLastHit Общие вопросы Delphi 12 17.03.2011 08:37
разъясните пожалуйста ситуацию с массивом: =|винтик|= Помощь студентам 2 20.01.2009 19:49
Как обрабатывать данную ситуацию? Arkuz БД в Delphi 2 08.12.2008 02:51
Как обработать следующую ситуацию? Tanuska___:) БД в Delphi 5 09.09.2008 12:47