Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.5 MB
Время: 0.038 c
1-1110451078
Оля
2005-03-10 13:37
2005.03.27
Защита от отладчика


4-1108455290
djon007
2005-02-15 11:14
2005.03.27
Видем процессы а как ЗАКРЫТЬ?


1-1110964851
PVOzerski
2005-03-16 12:20
2005.03.27
Как бы управлять порядком уничтожения компонентов?


14-1109840007
Marser
2005-03-03 11:53
2005.03.27
Хочу извиниться


4-1108453823
BiN
2005-02-15 10:50
2005.03.27
Ошибка в MS Platform SDK (?)





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