Посмотрел на код и решил еще на пару строк сократить, совместил проверку на "пусто" и минус в одном условии
procedure TFormMain.Edit1ChangeTracking(Sender: TObject);
Var FEdit : TEdit;
FFloat : Single;
begin
If Not (Sender is TEdit) Then // Защитимся от не выспавшегося самого себя
Exit;
FEdit:=(Sender as TEdit); // Для удобства...
FEdit.Text:=FEdit.Text.Replace(' ',''); // Убираем случайные пробелы
if (FEdit.Text.IsEmpty) or (FEdit.Text.Equals('-')) then // Если пусто (ничего не введено или все удалено) или только минус, ничего не делаем
Exit;
FEdit.Text:=FEdit.Text.Replace('.',','); // Заменяйм точку запятой
if FEdit.Text.Equals(',') then // Если введен разделитель, добавляем перед ним ноль для красоты (не обязательно)
begin
FEdit.Text:='0,';
FEdit.CaretPosition:=FEdit.CaretPosition+1; // без этого курсор останется между нулём и запятой
end;
if TryStrToFloat(FEdit.Text,FFloat) Then // Пробуем преобразовать в число
FEdit.TagString:=FEdit.Text // Если удалось, сохраняем в временном хранилище
Else
FEdit.Text:=FEdit.TagString; // Если не удалось, восстанавливаем из временного хранилища
end;