TEdit OnChangeTracking

Я хочу отформатировать ##.###.###-# в TEdit, я использую следующий код:

procedure TfrmPropiedad.edtRUTChangeTracking(Sender: TObject);
var
  texto, digito: string;
begin
  with Sender as TEdit do
  begin
    if Length(Text) > 1 then
    begin
      texto := ReplaceStr(ReplaceStr(Text, '.', ''), '-', '');
      if Length(texto) > 1 then
      begin
        digito := Copy(texto, Length(texto), 1);
        texto := FormatFloat(',0', StrToFloat(Copy(texto, 1, Length(texto) - 1)));
        texto := ReplaceStr(texto, ',', '.');
        texto := texto + '-' + digito;
        OnChangeTracking := nil;
        Text := '';
        Text := AnsiUpperCase(texto);
        OnChangeTracking := edtRUTChangeTracking;
        GoToTextEnd;
      end;
    end;
  end;
end;

Но GotoTextEnd не всегда работает.


person Miguel Molina    schedule 17.04.2015    source источник


Ответы (1)


Проблема заключается в том, что код, который вы поместили внутри OnChange, установил новый текст для компонента Edit и создал там новое событие OnChange. Если вы переместите свой код в событие ChangeTracking, он сработает:

procedure TForm15.edtRUTChangeTracking(Sender: TObject);
var
  texto, digito: string;
begin
  with Sender as TEdit do
  begin
    if Length(Text) > 1 then
    begin
      texto := String(Text).Replace('.', '').Replace( '-', '');

      if Length(texto) > 1 then
      begin
        digito := Copy(texto, Length(texto), 1);
        texto := FormatFloat(',0', StrToFloat(Copy(texto, 1, Length(texto) - 1)));
        texto := texto.Replace(',', '.');
        texto := texto + '-' + digito;
        OnChangeTracking := nil;
        Text := '';
        Text := AnsiUpperCase(texto);
        OnChangeTracking := edtRUTChangeTracking;
        GoToTextEnd;
      end;
    end;
  end;
end;
person Jens Borrisholt    schedule 18.04.2015