![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вводить только одну запятую [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]Считать запятые ?