
Отфильтрирываем цифры от текста:
function FiltLit(str: string): string; - возвращает текст с цифрами и с одной комой (точка заменивается именно комой) в случае наличия ее в тесте (все другое отсеивается)...
показательный пример:
FiltLit('aa1aa2f.f4f,5')='12,45'
function FiltLit(var edit:Tedit):string; - добавочная, (является вовсе не обьязательной) функция для облегчения использования функции с обьектами TEdit, благодаря ей курсор не прыгает на начало при вводе нечислового символа.
Ее запускать нужно во время события OnChangle
Показательный пример: (inproc необходимо обьявить в разделе var(var inproc:boolean=false;))
Код:
procedure TForm1.Edit1Change(Sender: TObject);
begin
if inproc then exit; //данная строка должна быть в самом начале
//с целью защиты от зацикливаний
FiltLit(Edit1);
end;
А вот именно и код функции:
...
private
function FiltLit(str: string): string; overload;
function FiltLit(var edit:Tedit):string; overload;
...
...
var
inproc:boolean=false;
...
...
function TConfigForm.FiltLit(str: string): string;
var
com,lit:boolean;
i, j:integer;
str2:string;
const
num:string='1234567890,.'; //в том случае, если num:='123456789' то только будут целые числа
begin
inproc:=true;
com:=false;
lit:=false;
///////////////////////////////////////////////////////////
for i:=1 to length(str) do
begin
/////////////////////////////////
for j:=1 to length(num) do
if str[i]=num[j] then
if (str[i]='.') or (str[i]=',') then
if com then break
else
begin
com:=true;
lit:=true;
break;
end
else
begin
lit:=true;
break;
end;
////////////////////////
if lit then
begin
if (str[i]='.') then str[i]:=',';
str2:=str2+str[i];
end;
lit:=false;
end;
////////////////////////////////////////////////
if (str2<>'') and (str2[1]=',') then str2:='0'+str2;
com:=false;
if Length(str2)>9 then str2:=copy(str2,1,9); //9 потому что в integer не влазит больше (при желании можно стереть данную строку)
if (str2='') then str2:='0';
result:=str2;
inproc:=false;
end;
function TConfigForm.FiltLit(var edit: Tedit): string;
var
tmp:integer;
str:string;
begin
tmp:=edit.SelStart;
str:=edit.Text;
Edit.text:=FiltLit(Edit.text);
if (edit.Text='0') then
edit.SelLength:=1
else
begin
if tmp<=length(Edit.text) then
if (str=edit.Text) then
Edit.SelStart:=tmp
else
Edit.SelStart:=tmp-1
else
Edit.SelStart:=length(Edit.text);
end;
end;
...
Спонсор поста: вашей компании необходимо развернуть офисную АТС либо мини-АТС? Советуем обратить внимание на уже готовое решение - офисные ip атс. С данной АТС у Вас не будет необходимости создания отдельных сетей передачи данных, достаточно будет включить сервер IP АТС в сеть Ethernet и Вы получите все преимущества IP-телефонии!