Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вводить только одну запятую [D7]


Basilisk ©   (2011-04-30 11:18:00) 

Такая ситуация:
есть stringgrid, прописано,чтобы поля принимали только цифры,бэкспэйс и запятую,но запятых можно поставить несколько,а как сделать чтобы вводить только одну запятую? и при удалении её снова можно было бы вводить запятую


Рамиль   (2011-05-03 14:25:00) [1]


> {Опубликовать по аналогии с TEdit}

Вернее с TLabeledEdit


Рамиль   (2011-05-03 14:24:00) [2]


unit NumEdit;

interface

uses
 Windows, Messages, SysUtils, Classes, Controls, StdCtrls, ExtCtrls;

type
 TNumberType = (ntInteger, ntFloat);
 TNumEdit = class(TCustomLabeledEdit)
 private
   FLastValue: string;
   FLastCarPos: integer;
   FNumberType: TNumberType;
   procedure SetNumberType(const Value: TNumberType);
 protected
   procedure Change; override;
   function CheckNum(Value: string): boolean; dynamic;
   procedure KeyDown(var Key: word; Shift: TShiftState); override;
 public
   constructor Create(AOwner: TComponent); override;
 published
   {Опубликовать по аналогии с TEdit}
   property NumberType : TNumberType read FNumberType write SetNumberType;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents('Additional', [TNumEdit]);
end;

{ TNumEdit }

procedure TNumEdit.Change;
begin
 inherited;
 if not CheckNum(Self.Text) then
 begin
   if Self.Text <> '' then
   begin
     Self.Text := FLastValue;
     Self.SetSelStart(FLastCarPos);
   end;
 end;
end;

function TNumEdit.CheckNum(Value: string): boolean;
var
 OutValExt: extended;
 OutValInt: integer;
begin
 Result := true;
 case FNumberType of
   ntInteger: Result := TryStrToInt(Self.Text, OutValInt);
   ntFloat: Result := TryStrToFloat(Self.Text, OutValExt);
 end;
end;

constructor TNumEdit.Create(AOwner: TComponent);
begin
 inherited;
 Self.Text := '';
 FLastValue := '';
 FLastCarPos := 1;
 FNumberType := ntInteger;
end;

procedure TNumEdit.KeyDown(var Key: word; Shift: TShiftState);
begin
 inherited;
 FLastValue := Self.Text;
 FLastCarPos := Self.GetSelStart + Self.GetSelLength;
end;

procedure TNumEdit.SetNumberType(const Value: TNumberType);
begin
 FNumberType := Value;
end;

end.


Dennis I. Komarov   (2011-05-03 13:27:00) [3]

А я вот точку люблю ]:->


Anatoly Podgoretsky   (2011-04-30 13:53:00) [4]

> Basilisk  (30.04.2011 11:18:00)  [0]

Ну и пусть ставит, никакого зла в этом нет, лишь бы результат был
правильный. Не стоит третировать пользователей.


Inovet   (2011-04-30 13:16:00) [5]

Это весеннее обострение с запятыми регулярно возникает.

а так не может быть:
-113,45
-123,45e-2
+123,45e+2
?

Недавалки вводить запятые - зло. Проверяй после заполнения поля, и в случае ошибки, поднимай исключение.


sniknik   (2011-04-30 13:09:00) [6]

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
 with TStringGrid(Sender) do
   if (Key = ',') and (Pos(',', Cells[Col, Row]) > 0) then raise Exception.Create('Много запятых!');
end;


хотя, это будет очень неудобно пользователю... (ну вот вижу я что не там поставил, и курсор там где нужно, естественно сначала ставишь вторую а после сдвигаешься и удаляешь первую). вообще когда программа считает себя "умнее" пользователя, такая долго не "живет". (если она конечно не навязанная государством ... типа "эгаиса", а на конкурентной основе)


sniknik   (2011-04-30 12:54:00) [7]

if (Key = ',') and Pos(',', EditText) > 0 then raise Exception.Create('Много запятых!').


Jeer   (2011-04-30 12:28:00) [8]


> а пример можно?


Не в состоянии пройти по символам строки сравнить с символом #44 ?
Тогда тебе в другую сторону.


Basilisk   (2011-04-30 12:07:00) [9]

sniknik
а пример можно?


sniknik   (2011-04-30 12:04:00) [10]

не мудри. просто просматривай уже введенный текст в проверке ввода/изменении.


Basilisk   (2011-04-30 11:49:00) [11]

да,но простой счетчик(флаг) не подойдет..ведь если я ввожу счетчик,то придется обнулять его при нажатии бэкспэйс,а что если я удалю не запятую


Jeer   (2011-04-30 11:47:00) [12]

Считать запятые ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо