Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1107779213
Vcoder
2005-02-07 15:26
2005.02.20
Генерация большого отчета - как лучше?


14-1107165684
1008
2005-01-31 13:01
2005.02.20
McSimm ©


14-1106902612
Antonn
2005-01-28 11:56
2005.02.20
Про мощные видяхи и хилые БП


3-1106245115
Alexandr--
2005-01-20 21:18
2005.02.20
VarbinaryToVarchar ?


3-1106449961
SarDoX
2005-01-23 06:12
2005.02.20
Поиск в БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский