Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.20;
Скачать: CL | DM;

Вниз

Денежные столбец в 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.063 c
1-1107472221
Vah
2005-02-04 02:10
2005.02.20
Загрузка кода в память


1-1107363505
БезИмени
2005-02-02 19:58
2005.02.20
Визуальній конструктор


14-1106691207
GanibalLector
2005-01-26 01:13
2005.02.20
ищу хорошую книгу по программированию


3-1106304368
Grab3
2005-01-21 13:46
2005.02.20
Mysql и Delphi


1-1107715186
MMMx
2005-02-06 21:39
2005.02.20
Шифрование