Форум: "WinAPI";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
ВнизWM_KILLFOCUS Найти похожие ветки
← →
GanibalLector © (2005-02-11 01:05) [0]
type
TForm1 = class(TForm)
...
private
procedure KillFocus(var Message: TMessage); message WM_KILLFOCUS;
public
end;
procedure TForm1.KillFocus(var Message: TMessage);
begin
inherited;
Caption:=Caption+"Что-то нет нифига...";
if HWND(Message.WParam)=TMGrid(StringGrid1).InplaceEditor.Handle then ...
end;
Сообщение не ловиться :(
Странно,однако.Почему?
← →
GanibalLector © (2005-02-11 01:09) [1]И еще,вдогонку...
Я пока слаб в ООП,так вот,сделал наследника от TCustomGrid у него имеется WMKillFocus.Я имею право его заменить в своем наследнике?
Кстати,и как правильно заменить метод в наследнике или ловить сообщение как в [0]?
← →
GuAV © (2005-02-11 01:21) [2]GanibalLector © (11.02.05 1:05)
TForm1 = class(TForm)
...
private
procedure KillFocus(var Message: TMessage); message WM_KILLFOCUS;
public
end;
У формы нет фокуса. Лови WM_ACTIVATE.
> Кстати,и как правильно заменить метод в наследнике или
> ловить сообщение как в [0]?
Какой метод, какое сообщение ?
← →
GuAV © (2005-02-11 01:22) [3]
> Я имею право его заменить в своем наследнике?
да.
методы сообщений это как виртуальные или динамичесие методы (ближе к динамическим).
← →
GanibalLector © (2005-02-11 01:25) [4]>У формы нет фокуса.
Да ты не понял,я с гридом(StringGrid) играюсь.А у него есть TInplaceEditor ,который ИМХО обязан принимать WM_KILLFOCUS после своего ввода.
← →
Игорь Шевченко © (2005-02-11 01:37) [5]GuAV © (11.02.05 01:22) [3]
> методы сообщений это как виртуальные или динамичесие методы
> (ближе к динамическим).
Точнее просто динамические. За тем исключением, что при переопределении override не пишется.
GanibalLector © (11.02.05 01:25) [4]
> Да ты не понял
Если не трудно, то пиши пожалуйста так, чтобы по коду обработки WM_KILLFOCUS в форме было сразу понятно, что ты с гридом играешься. А то мне тоже непонятно. Когда двое не понимают, это должно заставить задуматься.
> Сообщение не ловиться :(
А зачем ему ловиться ? Оно же приходит родительскому компоненту, а не форме.
← →
GanibalLector © (2005-02-11 02:48) [6]>А зачем ему ловиться ? Оно же приходит родительскому компоненту, а не форме.
Понял.Тогда так :
type
TInplace = class(TInplaceEdit)
private
procedure WMKillFocus(var Msg: TMessage); message WM_KILLFOCUS;
end;
...
procedure TInplace.WMKillFocus(var Msg: TMessage);
begin
inherited;
Caption:=Caption+"че-то опять нету?";
end;
Опять не ловиться :(
← →
GanibalLector © (2005-02-11 03:05) [7]Хм...это я поспешил.TInplaceEdit не имеет метода WMKillFocus
← →
GuAV © (2005-02-11 08:35) [8]GanibalLector © (11.02.05 3:05) [7]
TInplaceEdit не имеет метода WMKillFocus
Имеется ли он в предках - не важно. Уверен что твой создаётся заместо стандартного TInplaceEdit, TStringGrid.CreateEditor переопределил ?
← →
GanibalLector © (2005-02-11 14:49) [9]>Уверен что твой создаётся заместо стандартного TInplaceEdit, TStringGrid.CreateEditor переопределил ?
Нет,не уверен. :(
Пытался сделать,но пока не получается.В инете есть примеры замены TInplaceEdit,НО !!! все это реализовано в виде компонент.
Т.е. :
-создается наследник от TStringGrid с методом function CreateEditor: TInplaceEdit; override;
-создается наследник от TInplaceEdit у которого появляется метод procedure WMKillFocus(var Message: TMessage); message WM_KillFocus;
-и примерно так :
function TZDataGrid.CreateEditor: TInplaceEdit;
begin
Result := TZInplaceEdit.Create(Self);
end;
Я могу сделать все описанное,но а как потом обьявить что грид,который на форме вовсе не от TStringGrid, а от TMyLOLGrid?
З.Ы.В общем,я понял,все мои беды от не знания ООП,млин.
И еще...
Собственно,из-за чего все это.Целью явилось создание в StringGrid "денежного" столбца.Данный вопрос был пару дней назад в "Основной".
Я решил попробовать по предложенной Jack128 схеме.Сделал.Сабж ниже.НО!!!Если я покидаю ячейку не по Enter,а по клику мыши или по стрелке вниз\вверх,то никакого преобразования не будет.
Вот для этого я и хочу по WM_KillFocus сделать нужную мне обработку.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids,Mask, ExtCtrls;
type
TMGrid = class (TCustomGrid);
TInp = class ( TCustomMaskEdit);
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
XARow,XACol:Integer;
Old:String;
implementation
{$R *.DFM}
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
function IsValidChar(Key:Char):boolean;
var S:string;
SelStart,SelStop,DecPos:Integer;
RetValue:Extended;
begin
Result:=False;
S:=TMGrid(StringGrid1).InplaceEditor.Text;
TInp(TMGrid(StringGrid1).InplaceEditor).GetSel(SelStart, SelStop);
Delete(S, SelStart + 1, SelStop - SelStart);
Insert(Key, S, SelStart + 1);
DecPos := Pos(DecimalSeparator, S);
if (DecPos > 0) then
begin
DecPos := Length(S) - DecPos;
if DecPos > 2 then Exit;
end;
try
Result := TextToFloat(Pchar(S) , RetValue , fvExtended );
except
Exit;
end;
if (RetValue<0) then Result:=false;
end;
begin
if (XACol=1) or (XACol=2) then begin
if not(Key in ["0".."9",DecimalSeparator, ".", ",", #8, #13])
then Key:=#0;
if (Key=".") or (Key=",") then Key:=DecimalSeparator;
if (Key in [ #32..#255]) and not IsValidChar(Key) then Key:=#0;
if (Key=#13) and (Length(TMGrid(StringGrid1).InplaceEditor.Text)>0)
then
TMGrid(StringGrid1).InplaceEditor.Text:=
FloatToStrF(
Strtofloat(TMGrid(StringGrid1).InplaceEditor.Text),fffixed,6,2);
end;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (Acol<>0) and (Arow<>0) then
begin
StringGrid1.Canvas.Brush.Color := clwhite; //$00fedebc
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.Font.Color := clblack;
end ;
if gdselected in state then
begin
XACol:=ACol;
XARow:=ARow;
StringGrid1.Canvas.Brush.Color :=$cbe08b ;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.Font.Color := clblack;
end;
DrawText(StringGrid1.Canvas.Handle,
PChar(StringGrid1.Cells[Acol,Arow]),
length(StringGrid1.Cells[Acol,Arow]),Rect,
DT_CENTER or DT_WORDBREAK);
end;
end.
Кстати,может не стоит его ловить этот WM_KillFocus? Может есть варианты по-проще?
Я например,могу по таймеру проверять EditCanModify и что-то делать.Но,вариан с таймером это ИМХО от Лукавого.
← →
GuAV © (2005-02-11 16:24) [10]
> Я могу сделать все описанное,но а как потом обьявить
> что грид,который на форме вовсе не от TStringGrid, а
> от TMyLOLGrid?
Зарегистрировать как компонент, с добавлением в палитру компонентов. После этого кидать не TStringGrid, а TMyLOLGrid. Или создавать не через .dfm а вручную ("динамически"). Типаsg := TMyLOLGrid.Create; sg.Parent := Self; ...
Ловить WM_KILLFOCUS у TInplaceEdit в прочем можно и без написания наследников. У контролов есть свойство WindowProc, её можно заменить см. WindowProc + F1 + Example.
+ аналогичный механизм реализуем и через Winapi см. GetWindowLong/SetWindowLong с параметром GWL_WNDROC, CallWindowProc и "Subclassing a Window"/"Subclassing Controls" в справке или MSDN
← →
GanibalLector © (2005-02-11 19:31) [11]2 GuAV © (11.02.05 16:24) [10]
Ловить WM_KILLFOCUS у TInplaceEdit в прочем можно и без написания наследников. У контролов есть свойство WindowProc, её можно заменить см. WindowProc + F1 + Example.
+ аналогичный механизм реализуем и через Winapi см. GetWindowLong/SetWindowLong с параметром GWL_WNDROC, CallWindowProc и "Subclassing a Window"/"Subclassing Controls" в справке или MSDN
О!!!Наверно ЭТО спасет отца украинской демократии ;)
З.Ы.Сделаю отпишусь.
← →
GuAV © (2005-02-11 23:08) [12]GanibalLector © (11.02.05 19:31) [11]
Обрати внимание что TInplaceEditor создаётся не при создании StringGrid. Но удалятся похоже только в деструкторе. Нужно чётко поймать момент создания класса. Для способа winapi ещё хуже - нужо поймать момент создания его окна. IMHO проходит подмена в OnGetEditText с предварительной проверкой, не подмненено ли уже.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.045 c