![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Доступ к методу родителя [WinXP]
gog © (2014-08-22 13:36:00)Добрый день.
Компонета TPanel не имеет метода onKeyDown, однако её прородитель (TWinControl) имеет. Как открыть его для TPanel?
DimaBr (2014-08-26 08:14:00) [1]
TPanel = class(Vcl.ExtCtrls.TPanel);
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Panel1.OnKeyDown := FormKeyDown;
Panel2.OnKeyDown := FormKeyDown;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Caption := TComponent(Sender).Name + ' '+ chr(Key);
end;
DimaBr (2014-08-26 08:07:00) [2]>OnKeyDown не получает фокуса
Как вы определили что ПАНЕЛЬ не получили фокуса ?
gog (2014-08-25 11:06:00) [3]Всем спасибо за отклик.
У меня ситуация чуть посложнее. Мне нужно в ходе работы программы создавать динамические массивы нанелей разной длины.
Я сделал так: (фрагменты из программы )
unit uChips;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Menus, AdvMenus;
type
TChipPanel = class(TPanel)
published
property onKeyDown;
end;
TfrmChips = class(TForm)
.......
.......
public
{ Public declarations }
procedure ChipKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure ChipMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure ChipMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure ChipMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
.......
end;
implementation
ChipPanels: array of TChipPanel;
procedure TfrmChips.ChipKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
{обработчик нажатия на клавишы }
end;
какая то процедура где надо создать массив панелей
procedure TfrmChips.someProcedure(Sender: TObject);
var
I: Integer;
begin
if Assigned(ChipPanels) then begin
for I:= 0 to High(ChipPanels) do
ChipPanels[I].Free;
Finalize(ChipPanels);
end;
for I:= 0 to Some_Value do begin
SetLength(ChipPanels, Length(ChipPanels) + 1);
ChipPanels[I]:= TChipPanel.Create(TfrmChips);
ChipPanels[I].Parent:= TfrmChips;
ChipPanels[I].TabStop:= True;
ChipPanels[I].onKeyDown:= ChipKeyDown;
ChipPanels[I].OnMouseDown:= ChipMouseDown;
.............
определяя все нужные параметры.
end;
end;
OnMouseDown, OnMouseUp, OnMouseMove работают правильно, а OnKeyDown не получает фокуса. Как заставит его работать?
DimaBr (2014-08-25 09:57:00) [4]
type THask = class(TPanel);
procedure TForm1.FormCreate(Sender: TObject);
begin
THask(Panel1).OnKeyDown := DoKeyDown;
end;
DimaBr (2014-08-25 09:57:00) [5]Внимание!Здесьобсуждаются вопросы, связанные с разработкойкомпонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
Вопросы по поискуи использованиюготовых компонентов, редакторов или экспертов являются нарушениемтематики и могут быть удалены.
DVM (2014-08-22 14:48:00) [6]
> Надо еще фокусом заниматься будет.
Или TabStop выставить в true. Правда фокуса этого видно не будет.
вот с шаманским методом Geo:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;
type
TPanel = class(Vcl.ExtCtrls.TPanel)
published
property OnKeyDown;
end;
TForm1 = class(TForm)
pnl1: TPanel;
procedure FormCreate(Sender: TObject);
private
procedure OnPanelKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
pnl1.OnKeyDown := OnPanelKeyDown;
pnl1.TabStop := true;
end;
procedure TForm1.OnPanelKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Caption := '!!!!';
end;
end.
DVM (2014-08-22 14:46:00) [7]Это не метод а свойство. Открыть можно, сделав своего потомка и вынеся это свойство в published. Или воспользоваться шаманским методом Geo. Но только это мало что даст, фокуса ввода панель не получит все равно, соответственно OnKeyDown не сработает. Надо еще фокусом заниматься будет.