【问题标题】:TEdit OnChangeTrackingTEdit OnChangeTracking
【发布时间】:2015-04-17 23:03:03
【问题描述】:

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

【问题讨论】:

    标签: delphi firemonkey delphi-xe7


    【解决方案1】:

    问题是您放置在 OnChange 中的代码为 Edit 组件设置了新的 Text,并在那里引发了一个新的 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 2014-09-28
      • 2016-07-28
      • 2012-01-26
      • 2016-01-10
      • 2017-02-10
      • 2013-09-15
      相关资源
      最近更新 更多