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

Вниз

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 вся ветка

Текущий архив: 2005.03.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.11 c
8-1102076318
Алексей
2004-12-03 15:18
2005.03.27
И снова WinampAPI.


14-1109932975
Danilka
2005-03-04 13:42
2005.03.27
Еще чуть-чуть про демократию.


3-1109156267
ilias1979
2005-02-23 13:57
2005.03.27
Как считать содержимое файла чтобы загнать его в blob базы


14-1110139250
Серега
2005-03-06 23:00
2005.03.27
Подскажите компонент...


14-1110458494
Layner
2005-03-10 15:41
2005.03.27
Subscribe, кто с ним дружит?