@artem78

Perl + Win32::GUI — Как отменить стандартное поведение обработчика события?

Использую библиотеку Win32::GUI. Хочу сделать фильтр для TextField - если пользователь вводит что-то неправильно, игнорировать ввод символов. Пробовал return -1 - программа закрывается, на другие возвращаемые значения не реагирует. По сути нужен аналог preventdefault из javascript.

use Win32::GUI();

$w = Win32::GUI::Window->new(
	-size => [300, 200],
);

$w->AddTextfield(
	-name => 'tf',
	-pos => [10, 10],
	-size => [100, 20]
);

sub tf_Update {
	if ($w->tf->Text() !~ m/^([0-9]{0,8}(?:[\.,][0-9]{0,2})?)$/) {
		# preventdefault
		# игнорируем ввод
	}
}

$w->Center();
$w->Show();

Win32::GUI::Dialog();

sub w_Terminate {
    return -1;
}
  • Вопрос задан
  • 2398 просмотров
Пригласить эксперта
Ответы на вопрос 2
@gangabass
sub tf_Update {

    if ( $w->tf->Text() !~ m/^([0-9]{0,8}(?:[\.,][0-9]{0,2})?)$/ ) {

        $w->tf->Text("");
    }
}


Этот код очищает поле полностью. Если нужно удалять только последний введённый символ, то можно отсекать его от текущего значения поля...
Ответ написан
Комментировать
@UraBogort
use Win32::GUI();

$w = Win32::GUI::Window->new(
  -size => [300, 200],
);

$w->AddTextfield(
  -name => 'tf',
  -pos => [10, 10],
  -size => [100, 20],
  -text => '',
);

$w->Center();
$w->Show();

Win32::GUI::Dialog();

sub w_Terminate {
    return -1;
}
sub tf_Update {

  my $buf = $w->tf->Text();
  $buf=~s/(\s|\d)//;                        #фильтруем цифры буквы
  $w->tf->Text($buf);
  #$w->tf->SetSel(length($buf),length($buf));
  $w->tf->SetSel( $buf=length($buf), $buf); #как установить курсор а конец красивее? Я незнаю!
  
  return 1;
  
}
__END__
#или так
sub tf_Update {

    my @gs  = $w->tf->GetSel();
    my $buf = $w->tf->Text();
    if ( $buf =~ s/(\s|\d)// ) {
        $w->tf->Text($buf);
        if ( $gs[0] > 0 ) {
            $w->tf->SetSel( $gs[0] - 1, $gs[0] - 1 );
        }
    }

    return 1;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы