Конференция "Начинающим" » Доступ к методу родителя [WinXP]
 
  • gog © (22.08.14 13:36) [0]
    Добрый день.

    Компонета TPanel не имеет метода onKeyDown, однако её прородитель (TWinControl) имеет. Как открыть его для TPanel?
  • DVM © (22.08.14 14:46) [1]
    Это не метод а свойство. Открыть можно, сделав своего потомка и вынеся это свойство в published. Или воспользоваться шаманским методом Geo. Но только это мало что даст, фокуса ввода панель не получит все равно, соответственно OnKeyDown не сработает. Надо еще фокусом заниматься будет.
  • DVM © (22.08.14 14:48) [2]

    > Надо еще фокусом заниматься будет.

    Или 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.

  • DimaBr © (25.08.14 09:57) [3]

    type THask = class(TPanel);
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     THask(Panel1).OnKeyDown := DoKeyDown;
    end;

  • DimaBr © (25.08.14 09:57) [4]
    Внимание! Здесь обсуждаются вопросы, связанные с разработкой компонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
    Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.
  • gog © (25.08.14 11:06) [5]
    Всем спасибо за отклик.
    У меня ситуация чуть посложнее. Мне нужно в ходе работы программы создавать динамические массивы нанелей разной длины.
    Я сделал так: (фрагменты из программы )

    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 © (26.08.14 08:07) [6]
    >OnKeyDown не получает фокуса
    Как вы определили что ПАНЕЛЬ не получили фокуса ?
  • DimaBr © (26.08.14 08:14) [7]
    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;

 
Конференция "Начинающим" » Доступ к методу родителя [WinXP]
Есть новые Нет новых   [119233   +56][b:0][p:0.002]