![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Денежные столбец в TStrinGrid [D5, Win95/98, WinXP]
GanibalLector © (2005-02-08 01:24:00)Вот какое дело...В гриде необходимо сделать "денежный" столбец.Ну,т.е. блокировать буквы,проверять кол-во символов после запятой и пр.чепуха.
Посмотрел,на событие OnSetEditText,сделал,работает,НО жутко мне не нравиться это.Т.е. когда я ввожу букву,она появляется в гриде,а потом исчезает.
Поэтому,я пошел по другому пути.Возможно и ошибочному...Вам решать.
Так вот,присмотрел я компонент TCurrencyEdit,тот который в RX.Вроде,неплохой компонент ;) Ну,и я решил его засвечивать вместо TInplaceEditora грида.
Сделал,сабж ниже.
Проблема в том,что '0','.',',' как-то по особому обрабатываются этим TCurrencyEdit.Т.е.если нажать любую цифру,то "засвечивается" мой TCurrencyEdit и
в нем сидит эта цифра.А вот,если нажать '0','.',',' то ничего не появляется!!!Появляется,после повторного ввода.А нажимать по два раза это от Лукавого.
Кто чем поможет??
Вот сабж :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Mask, ToolEdit, CurrEdit, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Edit1: TCurrencyEdit;
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure Edit1Exit(Sender: TObject);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
GrACol,GrArow:Cardinal;
implementation
{$R *.DFM}
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
var R:TRect;
begin
R := StringGrid1.CellRect(GrACol,GrArow);
R.Left := R.Left + StringGrid1.Left;
R.Right := R.Right + StringGrid1.Left;
R.Top := R.Top + StringGrid1.Top;
R.Bottom := R.Bottom + StringGrid1.Top;
Edit1.Left := R.Left + 1;
Edit1.Top := R.Top + 1;
Edit1.Width := (R.Right + 1) - R.Left;
Edit1.Height := (R.Bottom + 1) - R.Top;
Edit1.Text:=StringGrid1.Cells[GrACol,GrArow]+Key;
Edit1.Visible := True;
Edit1.SetFocus;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
Flag: Cardinal;
word_name:string;
begin
if (Acol<>0) and (Arow<>0) then begin
StringGrid1.Canvas.Brush.Color := clwhite;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.Font.Color := clblack;
end
else begin
StringGrid1.Canvas.Brush.Color := clbtnface;
StringGrid1.Canvas.Font.Style:=[fsBold];
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.Font.Color := clblack;
end;
if gdselected in state then begin
GrAcol:=Acol;GrARow:=ARow;
StringGrid1.Canvas.Brush.Color :=$cbe08b ;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.Font.Color := clblack;
end;
word_name:=StringGrid1.Cells[Acol,Arow];
Flag := DT_CENTER or DT_WORDBREAK;
DrawText(StringGrid1.Canvas.Handle,PChar(word_name),
length(word_name),Rect,Flag);
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
StringGrid1.Cells[StringGrid1.Col,
StringGrid1.Row] :=Edit1.Text ;
Edit1.Visible := False;
StringGrid1.SetFocus;
end;
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=vk_return then
begin
StringGrid1.Cells[StringGrid1.Col,
StringGrid1.Row] :=Edit1.Text ;
Edit1.Visible := False;
StringGrid1.SetFocus;
end;
end;
end.
P.S. За сабж сторого не судите.Это я так...ищу правильное решение.
GanibalLector (2005-02-09 01:51:00) [1]2 jack128 © (09.02.05 01:40) [15]
Да все равно,головняка много.Я смотрел на исходники RX. Далее,предположим,мне понадобиться столбец с тремя числами после запятой.И ШО?Рефакторинг,так бы его.А у TCurrencyEdit-а есть свойства соответствующие.
jack128 (2005-02-09 01:40:00) [2]Я бы вот так сделал:
type
TCustomGridCrack = class(TCustomGrid);
TInplaceEditCrack = class(TInplaceEdit);
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
var
Editor: TInplaceEditCrack;
begin
Editor := TInplaceEditCrack(TCustomGridCrack(StringGrid1).InplaceEditor);
if not Assigned(Editor) then Exit;
// тут обрабатываешь текст едитора
end;
iskatel (2005-02-09 00:49:00) [3]ну как хочешь, дело конечно твое
я вообще пользуюсь только стандартными компонентами и апи - привычка...
GanibalLector (2005-02-09 00:35:00) [4]>нахрена усложнять то, что разработано умными людьми и 100 раз проверено/отлажено
Да я вроде нихрена не усложнял.И еще,я так понял ты сомневаешься в RX?
iskatel (2005-02-09 00:28:00) [5]чем проще тем лучьше...
мое предложение решает твою проблему с появлением/исчезновением т.к. все обрабатывается еще до появления...
ЗЫ нахрена усложнять то, что разработано умными людьми и 100 раз проверено/отлажено...
GanibalLector (2005-02-09 00:23:00) [6]>т.е. оставил всю эту мутатень с эдитом???
да.А чем не устраивает?Очень даже хорошо получилось.
iskatel (2005-02-09 00:20:00) [7]т.е. оставил всю эту мутатень с эдитом???
а не пробовал выкинуть procedure TForm1.StringGrid1SetEditText
и засунуть все что в ней в procedure TForm1.StringGrid1KeyPress
с учетом того что последний символ только вводится...
GanibalLector (2005-02-09 00:16:00) [8]>а что ты в итоге сделал?
Исправил свою ошибку в [0].
iskatel (2005-02-09 00:10:00) [9]а что ты в итоге сделал?
GanibalLector (2005-02-08 16:30:00) [10]Все получилось ;) Теперь это классно выглядит.Вводишь ,5 или .5 а в гриде 0,5.
И прочих притных вкусностей навалом ;)
P.S. Я доволен !!!
GanibalLector (2005-02-08 13:31:00) [11]2 begin...end © (08.02.05 09:26) [5]
Не то,вообще ужасно выглядит.Да и неудобно.
begin...end (2005-02-08 09:26:00) [12]> GanibalLector © (08.02.05 01:24)
Может быть, подойдёт обработчик TStringGrid.OnGetEditMask?
procedure TForm1.StringGrid1GetEditMask(Sender: TObject; ACol,
ARow: Integer; var Value: String);
begin
Value := '0000000,00'
end.
GanibalLector (2005-02-08 03:29:00) [13]2 iskatel © (08.02.05 02:02) [3]
Ну,смотри сам...
var
old:string;
...
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9','.',',',#8, #13]) then Key:=#0;
if (Key='.') or (Key=',') then Key:=DecimalSeparator;
end;
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
ARow: Integer; const Value: String);
begin
try
StrToFloat(StringGrid1.Cells[Acol,ARow]);
if pos(DecimalSeparator,Value)>0 then
if Length(Value)>pos(DecimalSeparator,Value)+2 then Raise Exception.Create('LOL');
StringGrid1.Cells[Acol,ARow]:=Value;
Old:=Value;
except
StringGrid1.Cells[Acol,ARow]:=Old;
end;
end;
и получили непонятные мерцания.Это все от Лукавого!!!
iskatel (2005-02-08 02:02:00) [14]я нихрена не понял - зачем тебе эдит??? поставь в опциях goEditing=true
и дальше (на сях)
void __fastcall TForm1::StringGrid1KeyPress(TObject *Sender, char &Key)
{
if(Key < '0' | Key > '9') Key=0;
}
(сам добавь код для точки :-))
GanibalLector (2005-02-08 01:49:00) [15]>ты сколько выпил?
Трезвый,но больной(ГРИП) :(
>вместо OnSetEditText OnKeyPress не судьба обрабатывать?
Мне не понравилось,о чем я написал в [0].
iskatel (2005-02-08 01:43:00) [16]ты сколько выпил?
вместо OnSetEditText OnKeyPress не судьба обрабатывать?