TEdit OnChangeTracking

时间:2015-04-17 23:03:03

标签: delphi firemonkey delphi-xe7

我想在 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并不总是有效。

1 个答案:

答案 0 :(得分:0)

问题是您在OnChange中放置的代码在编辑组件的新文本中设置,并通过引发新的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;