Форум: "Основная";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];
ВнизДенежные столбец в TStrinGrid Найти похожие ветки
← →
GanibalLector © (2005-02-08 01:24) [0]Вот какое дело...В гриде необходимо сделать "денежный" столбец.Ну,т.е. блокировать буквы,проверять кол-во символов после запятой и пр.чепуха.
Посмотрел,на событие 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. За сабж сторого не судите.Это я так...ищу правильное решение.
← →
iskatel © (2005-02-08 01:43) [1]ты сколько выпил?
вместо OnSetEditText OnKeyPress не судьба обрабатывать?
← →
GanibalLector © (2005-02-08 01:49) [2]>ты сколько выпил?
Трезвый,но больной(ГРИП) :(
>вместо OnSetEditText OnKeyPress не судьба обрабатывать?
Мне не понравилось,о чем я написал в [0].
← →
iskatel © (2005-02-08 02:02) [3]я нихрена не понял - зачем тебе эдит??? поставь в опциях goEditing=true
и дальше (на сях)
void __fastcall TForm1::StringGrid1KeyPress(TObject *Sender, char &Key)
{
if(Key < "0" | Key > "9") Key=0;
}
(сам добавь код для точки :-))
← →
GanibalLector © (2005-02-08 03:29) [4]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;
и получили непонятные мерцания.Это все от Лукавого!!!
← →
begin...end © (2005-02-08 09:26) [5]> 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 13:31) [6]2 begin...end © (08.02.05 09:26) [5]
Не то,вообще ужасно выглядит.Да и неудобно.
← →
GanibalLector © (2005-02-08 16:30) [7]Все получилось ;) Теперь это классно выглядит.Вводишь ,5 или .5 а в гриде 0,5.
И прочих притных вкусностей навалом ;)
P.S. Я доволен !!!
← →
iskatel © (2005-02-09 00:10) [8]а что ты в итоге сделал?
← →
GanibalLector © (2005-02-09 00:16) [9]>а что ты в итоге сделал?
Исправил свою ошибку в [0].
← →
iskatel © (2005-02-09 00:20) [10]т.е. оставил всю эту мутатень с эдитом???
а не пробовал выкинуть procedure TForm1.StringGrid1SetEditText
и засунуть все что в ней в procedure TForm1.StringGrid1KeyPress
с учетом того что последний символ только вводится...
← →
GanibalLector © (2005-02-09 00:23) [11]>т.е. оставил всю эту мутатень с эдитом???
да.А чем не устраивает?Очень даже хорошо получилось.
← →
iskatel © (2005-02-09 00:28) [12]чем проще тем лучьше...
мое предложение решает твою проблему с появлением/исчезновением т.к. все обрабатывается еще до появления...
ЗЫ нахрена усложнять то, что разработано умными людьми и 100 раз проверено/отлажено...
← →
GanibalLector © (2005-02-09 00:35) [13]>нахрена усложнять то, что разработано умными людьми и 100 раз проверено/отлажено
Да я вроде нихрена не усложнял.И еще,я так понял ты сомневаешься в RX?
← →
iskatel © (2005-02-09 00:49) [14]ну как хочешь, дело конечно твое
я вообще пользуюсь только стандартными компонентами и апи - привычка...
← →
jack128 © (2005-02-09 01:40) [15]Я бы вот так сделал:
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;
← →
GanibalLector © (2005-02-09 01:51) [16]2 jack128 © (09.02.05 01:40) [15]
Да все равно,головняка много.Я смотрел на исходники RX. Далее,предположим,мне понадобиться столбец с тремя числами после запятой.И ШО?Рефакторинг,так бы его.А у TCurrencyEdit-а есть свойства соответствующие.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.037 c