Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [delphi] ограничение на edit, ПОМОГИТЕ 
:(
    Опции темы
porsche
Дата 23.9.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.9.2010

Репутация: нет
Всего: нет



Код

unit Unit1;

interface

 uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
  var a,b:real;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label5: TLabel;
    Label6: TLabel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
 uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
var c,d:real;

begin
 a:=StrToFloat(Edit1.Text); //переводим из строки в число
 b:=StrToFloat(Edit2.Text); //переводим из строки в число
    c:=sum(a,b); //вызываем функцию из Unit2 сложения
    d:=raz(a,b); //вызываем функцию из Unit2 разности

 label5.Caption:='равна '+ FloatToStr(c); //выводим сумму
 label6.Caption:='равна '+ FloatToStr(d); //выводим разность

end;

procedure TForm1.Button2Click(Sender: TObject); //очищаем поля
begin
edit1.Clear;
edit2.Clear;
label5.Caption:=' ';
label6.Caption:=' ';
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
  var //цифровая маска
  vrPos, vrLength, vrSelStart: byte; s,ss:string;a,b:integer;
const
  I: byte = 8;
    //I+8 = количество знаков после запятой (в данном случае - 9 знака)
begin

  with Sender as TEdit do
  begin
    vrLength := Length(Text); //определяем длину текста
    vrPos := Pos(',', Text); //проверяем наличие запятой
    vrSelStart := SelStart; //определяем положение курсора
    s:=edit1.Text;
    ss:=edit1.text;
  end;

  case Key of
     '0': begin
     if vrlength=1 then
     if  edit1.Text[1] = '0' then key:=#0 ;
     if vrlength=2 then
     if (edit1.text[2]='0') then
     if (edit1.Text[1] = '-') or(edit1.Text[1] = '+') then key:=#0;
     end;
    '1'..'9': begin
    if vrlength=1 then
    if edit1.Text[1]='0' then begin delete (s,1,1); edit1.Text:=s;end;
     if vrlength=2 then
    if (edit1.Text[1]in['-','+']) and (edit1.Text[2]='0') then
     begin edit1.Clear;delete (s,2,1);edit1.text:=s;end;

        //проверяем положение курсора и количество знаков после запятой
        if (vrPos > 0) and (vrLength - vrPos > I) and (vrSelStart >= vrPos) then
          Key := #0; //"погасить" клавишу
      end;
    ',', '.':
      begin
        //если запятая уже есть или запятую пытаются поставить перед
        //числом или никаких цифр в поле ввода еще нет
        if (vrPos > 0) or (vrSelStart = 0) or (vrLength = 0) then
          Key := #0 //"погасить" клавишу
        else
          Key := #44; //всегда заменять точку на запятую
      end;
    #8: ; //позволить удаление знаков клавишей 'Back Space'
    '+','-':
     begin
     if (vrSelstart>0) then
        Key :=#0 //"погасить" клавишу
       end;

  else
    Key := #0; //"погасить" все остальные клавиши
  end;
end;
end.

Проблема в том что при вводе в поле edit допустим -03 должна произойти замена на -3 а происходит на 3- не могу понять проблемы а в случаи для 03 все работает как надо получается 3...изучал паскаль делфи только начал поэтому сделал как мог...проблема в строчках 88-89
PM MAIL   Вверх
DarkProg
Дата 23.9.2010, 18:22 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Я потерялся в вашем коде  smile 
а десятки бессмысленых вложений if вообще добили smile  smile 

У вас он слишком формализвоан что ли - никогда не вводите десятки ненужных переменных - только сами запутаетесь

Попробуйте что-ливыполнить трассировку и поглядеть что у вас там программа вытворяет


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
SeregaAltmer
Дата 23.9.2010, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 15.9.2010

Репутация: нет
Всего: нет



Возьми TSptinEdit, не мучайся

Сори для флота он не подойдет. В любом случае код изначально не верен так-как ты обрабатываеш лишь реакцию на нажатие клавиш. А если значение вставят мышкой? Если и делать адаптацию эдита к флоту, то делать это нужно минимум в onchange и приминительно ко всей строке.


     if vrlength=2 then  //дело в этом условии для "03" оно выполяняется, а для "-03" нет
    if (edit1.Text[1]in['-','+']) and (edit1.Text[2]='0') then
     begin edit1.Clear;delete (s,2,1);edit1.text:=s;end;


в любом случае лучше переписать весь код целиком, и делать это точно не в кейпрэссе

Это сообщение отредактировал(а) SeregaAltmer - 23.9.2010, 21:50
PM MAIL   Вверх
superVad
Дата 23.9.2010, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 7
Всего: 15



Возможно регулярные выражения помогут тебе.

Что бы ты не делал... (это намек)

Это сообщение отредактировал(а) superVad - 23.9.2010, 21:52
PM MAIL   Вверх
ivan219
Дата 26.9.2010, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 5
Всего: 12



Процедура позволяет вводить вещественные значения от 0 и до.... с отрицательными числами придётся самому разбиратся они как то коряво реализованы.

Код

{Процедура ограничения в вода в Edit с преобразованием '.' в ',' ('0..9',',','.','E','+','-')}
procedure EditCh(Sender:TObject);
const
    WrongSepArr : array[0..1] of char =('.',','); //создаём константу - массив для хранения символов, которые надо преобразовать в разделитель
var
  CurStr: String;
  Counter,SelPos,SeparatorPos  :Integer;
begin
  SelPos:=TLabeledEdit(Sender).SelStart; //положение курсора
  CurStr:=TLabeledEdit(Sender).Text;//Текст из эдита, который изменён
  if CurStr='' then //Если текста нет
   begin
    TLabeledEdit(Sender).Text:='0';     //Поставить 0
    TLabeledEdit(Sender).SelStart:=1;   //Отвести курсор на 1
    Exit;          //Выйти
   end;
  for counter := 0 to 1 do  //Перечисление по массиву
   if WrongSepArr[counter]<> DecimalSeparator then
    while Pos(WrongSepArr[counter],CurStr)>0 do   //ищем данный элемент масива в тексте
     CurStr[Pos(WrongSepArr[counter],CurStr)]:=DecimalSeparator;//Заменяем на сепаратор
  SeparatorPos:=Pos(DecimalSeparator,CurStr); //Ищем первый сепаратор
  for Counter:= Length(CurStr) downto 2 do  //Перечисление по строке от конца до 2 элемента (обратный, т.к. может быть удалены символы и как следствие - уменьшина длина)
   begin
    if (curStr[Counter] in [DecimalSeparator])and(Counter=SeparatorPos) then //если сепаратор и он не первый
     curStr[Counter] := DecimalSeparator  //удаляем
    else
     if not (curStr[Counter] in ['0'..'9','E','e','-','+']) then    //иначе ели не разрешённый символ
      begin
       Delete(CurStr,counter,1);  //удаляем
       dec(SelPos); //Уменьшить на 1
      end;
  end;
  if (curStr[1] in [DecimalSeparator])and(SeparatorPos=1) then //Если первый знак . или , то поставить 0,
   begin
    curStr[1]:=DecimalSeparator;
    insert('0',curStr,0);
    inc(SelPos); //Увеличить на 1
   end;
  if (curStr[length(curStr)]='E')or(curStr[length(curStr)]='e') then //Если последний символ E
   Delete(CurStr,length(curStr),1);  //Удалить
  if (curStr[length(curStr)]='-')or(curStr[length(curStr)]='+') then //Если последний символ знак
   Delete(CurStr,length(curStr),1);  //Удалить
  if length(curStr)>=2 then //Если длина больше 1
   if (curStr[1] in ['+','-'])and(curStr[2] in [DecimalSeparator]) then  //Если первый символ знак
    begin
     insert('0',curStr,2); //Вставить 0 вторым символом
     inc(SelPos);  //Увеличить на 1
    end;
  if not (curStr[1] in ['0'..'9','+','-']) then   //Если первый сивол запрещён
    Delete(CurStr,1,1); //Удалить
  while (length(curStr)>=2)and(curStr[1]='0')and(curStr[2]<>DecimalSeparator)do //удалить нули в начале числа
   delete(CurStr,1,1); //Удалить
  while (length(curStr)>=3)and(curStr[1]in['+','-'])and(curStr[2]='0')and(curStr[3]<>DecimalSeparator)do //удалить нули в начале числа, если первый символ - знак
   delete(CurStr,2,1); //Удалить
  TLabeledEdit(Sender).Text:=CurStr;  //Результат
  TLabeledEdit(Sender).SelStart:=SelPos;  //Результат
end;


Код

procedure TForm1.Edit1Change(Sender: TObject);
begin
 EditCh(Sender);
end;


Это сообщение отредактировал(а) ivan219 - 26.9.2010, 01:39
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0770 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.