Главная страница
    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.5 MB
Время: 0.043 c
3-1106638164
АМБ
2005-01-25 10:29
2005.02.20
Запрос для DBF


14-1107166520
Alexander Panov
2005-01-31 13:15
2005.02.20
Блин, флудеры.


9-1064947484
Ландграф Павел
2003-09-30 22:44
2005.02.20
Игра Sorcerer`s Doll


10-1083934868
vk220
2004-05-07 17:01
2005.02.20
COM


14-1107338274
syte_ser78
2005-02-02 12:57
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский