-
Добрый день.
Компонета TPanel не имеет метода onKeyDown, однако её прородитель (TWinControl) имеет. Как открыть его для TPanel?
-
Это не метод а свойство. Открыть можно, сделав своего потомка и вынеся это свойство в published. Или воспользоваться шаманским методом Geo. Но только это мало что даст, фокуса ввода панель не получит все равно, соответственно OnKeyDown не сработает. Надо еще фокусом заниматься будет.
-
> Надо еще фокусом заниматься будет.
Или 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
end;
var
Form1: TForm1;
implementation
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.
-
type THask = class(TPanel);
procedure TForm1.FormCreate(Sender: TObject);
begin
THask(Panel1).OnKeyDown := DoKeyDown;
end;
-
Внимание! Здесь обсуждаются вопросы, связанные с разработкой компонентов, редакторов свойств, редакторов компонентов и экспертов IDE. Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.
-
Всем спасибо за отклик. У меня ситуация чуть посложнее. Мне нужно в ходе работы программы создавать динамические массивы нанелей разной длины. Я сделал так: (фрагменты из программы )
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 не получает фокуса. Как заставит его работать?
-
>OnKeyDown не получает фокуса Как вы определили что ПАНЕЛЬ не получили фокуса ?
-
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
public
end;
var
Form1: TForm1;
implementation
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;
|