Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2013, 16:59   #1
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию Не обрабатывается нажатие на компонент

Написал компанент на основе TCollection и TCollectionItem, установил, поставил на форуму, в обработчике написал показать месагу, но компонент не отреагировал.

Код:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, ButtonGroup;

type
  TNbutonsGroup = class;
  TSetNbutonsGroup1 = class;

  TbutonsItem = class(TCollectionItem)
  private
    FNbutonsGroup: TNbutonsGroup;
    Fbutons: TCustomControl;
    FOnClick: TNotifyEvent;
    protected
    procedure Click; dynamic;
  public
    constructor Create(Collection: TCollection); override;
    destructor Destroy; override;
  published
    //property //butons: TCustomControl read  Fbutons write Fbutons;
        property OnClick: TNotifyEvent read FOnClick write FOnClick;
  end;

  TNbutonsGroup = class(TCollection)
  private
    FSetNbutonsGroup: TSetNbutonsGroup1;
    function GetItem(Index: Integer): TbutonsItem;
    procedure SetItem(Index: Integer; const Value: TbutonsItem);
  protected
    function GetOwner: TPersistent; override;
  public
    constructor Create(SetNbutonsGroup: TSetNbutonsGroup1);
    function Add: TbutonsItem;
    property Items[Index: Integer]: TbutonsItem read GetItem write SetItem; default;
  end;

  TSetNbutonsGroup1 = class(TCustomControl)
  private
    Fbutons: TNbutonsGroup;
    procedure Setbutons(const Value: TNbutonsGroup);
    protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Canvas;
    property butons: TNbutonsGroup read Fbutons write Setbutons;
  end;



procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('nes', [TSetNbutonsGroup1]);
end;


constructor TbutonsItem.Create(Collection: TCollection);
begin
  inherited Create(Collection);
  FNbutonsGroup:=GetOwner as TNbutonsGroup;
  Fbutons:=TCategoryPanel.Create(FNbutonsGroup.FSetNbutonsGroup);
//  Fbutons.Caption:='Nbutons';
 // Fbutons.ButtonGroup:=FNbutonsGroup.FSetNbutonsGroup;
end;

procedure TbutonsItem.Click;
begin
  if Assigned(FOnClick) then FOnClick(Self);
end;

destructor TbutonsItem.Destroy;
begin
  FreeAndNil(Fbutons);
  inherited;
end;

{ TNbutonsGroup }

function TNbutonsGroup.Add: TbutonsItem;
begin
  Result := TbutonsItem(inherited Add)
end;

constructor TNbutonsGroup.Create(SetNbutonsGroup: TSetNbutonsGroup1);
begin
  inherited Create(TbutonsItem);
  FSetNbutonsGroup := SetNbutonsGroup;
end;

function TNbutonsGroup.GetItem(Index: Integer): TbutonsItem;
begin
  Result := TbutonsItem(inherited GetItem(Index));
end;

function TNbutonsGroup.GetOwner: TPersistent;
begin
  Result := FSetNbutonsGroup;
end;

procedure TNbutonsGroup.SetItem(Index: Integer; const Value: TbutonsItem);
begin
  inherited SetItem(Index, Value);
end;

{ TCatPanelsGroup }

constructor TSetNbutonsGroup1.Create(AOwner: TComponent);
begin
  inherited;
  Fbutons:=TNbutonsGroup.Create(self);
end;

destructor TSetNbutonsGroup1.Destroy;
begin
  FreeAndNil(Fbutons);
  inherited;
end;

procedure TSetNbutonsGroup1.Setbutons(const Value: TNbutonsGroup);
begin
  Fbutons.Assign(Value);
end;

procedure TSetNbutonsGroup1.Paint;
var
  SaveColor: TColor;
  SaveStyle: TBrushStyle;
  i: integer;
begin
  inherited Paint;
  SaveColor := Canvas.Brush.Color;
  SaveStyle := Canvas.Brush.Style;
  Canvas.Brush.Style := bsSolid;
  for i := 0 to Fbutons.Count - 1 do
    with Fbutons.Items[i] do
      begin
        Canvas.Brush.Color := Color;//Height mod 2,left mod 2,
        Canvas.Pie(
Width div 2 - 50, Height div 2 - 50,
Width div 2 + 50, Height div 2 + 50,
Width div 2, Height div 2,
Width div 2, Height div 2 - 50);
        Canvas.Pen.color:=ClWhite;
        {Canvas.Pie(0,0,200,200,100,200,100,100);
        Canvas.Pen.color:=ClWhite;
        Canvas.Pie(0,0,200,200,100,0,50,100);
        Canvas.Pen.color:=ClWhite;
        Canvas.Pie(0,0,200,200,-10000,-100,-100,-99900);
        Canvas.Pen.color:=ClWhite;
      end;
  Canvas.Brush.Style := SaveStyle;
  Canvas.Brush.Color := SaveColor
end;

end.
Я сделал что то не так? Просто первый раз пишу компонент
bulldog5293 вне форума Ответить с цитированием
Старый 27.09.2013, 17:37   #2
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,799
По умолчанию

Где из внешней среды вызывается TButtonsItem.Click?
Vapaamies вне форума Ответить с цитированием
Старый 27.09.2013, 19:51   #3
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

вообще то у меня в обработчики получается procedure TForm2.SetNbutonsGroup11butons0Clic k(Sender: TObject);
Проект прикрепил
Вложения
Тип файла: rar Новая папка.rar (84.3 Кб, 9 просмотров)
bulldog5293 вне форума Ответить с цитированием
Старый 27.09.2013, 20:04   #4
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,799
По умолчанию

Могу повторить вопрос: где из внешней среды вызывается TButtonsItem.Click? Чьим волшебством?
Vapaamies вне форума Ответить с цитированием
Старый 27.09.2013, 20:24   #5
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Код:
TbutonsItem = class(TCollectionItem)
  private
    Fbutons: TCustomControl;
    FOnClick: TNotifyEvent;
    protected
    procedure Click; dynamic;
  published
        property OnClick: TNotifyEvent read FOnClick write FOnClick;
////
procedure TbutonsItem.Click;
begin
  if Assigned(FOnClick) then FOnClick(Self);
end;
bulldog5293 вне форума Ответить с цитированием
Старый 27.09.2013, 20:30   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
if Assigned(FOnClick) then FOnClick(Self);
Так а извне компонента этот метод как вызывается?
То что ты событие генерируешь это понятно, но для его генерации твоя прога, которая юзает этот компонент должна вызвать метод Click, о чем и твердит Vapaamies

Снимаю предидущий вопрос в связи с багом в коде:
Цитата:
Unit3 in 'E:\компаненты\TbutonsItem\Unit3.pa s';
Это по твоему нормально? Мало того что путь абсолютный, так еще и проект неполный.
I'm learning to live...

Последний раз редактировалось Stilet; 27.09.2013 в 20:32.
Stilet вне форума Ответить с цитированием
Старый 27.09.2013, 20:35   #7
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

дальше OnClick не куда не идёт, т.к. не знаю что ещё можно прописать. На ум только приходит переделать TNotifyEvent, что бы он поддерживал index:integer, но опять не знаю как его описать и куда засунуть. Пробывал TNotifyEvent заменить на
Код:
 TButtonEvent = procedure(Sender: TObject; Index: Integer) of object;
Но тогда
Код:
  if Assigned(FOnClick) then FOnClick(Self);
Пишет что неверные данные передаю
bulldog5293 вне форума Ответить с цитированием
Старый 27.09.2013, 20:43   #8
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,888
По умолчанию

Цитата:
дальше OnClick не куда не идёт
Куда ему дальше если он до OnClick в принципе не может дойти.
northener вне форума Ответить с цитированием
Старый 27.09.2013, 20:49   #9
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Код:
Куда ему дальше если он до OnClick в принципе не может дойти.
Намекните хоть, как сделать что бы дошёл
bulldog5293 вне форума Ответить с цитированием
Старый 27.09.2013, 20:55   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если память не подводит:
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses     windows,
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Panel1: TPanel;
  private
    //Переменка обработчика
    FOnClick: TNotifyEvent;
    procedure SetOnClick(AValue: TNotifyEvent);
    //Внутренний механизм события компонента
    procedure wmp(var m:TWMLButtonDown); message WM_LButtonDown;
    { private declarations }
  public
    { public declarations }
  published
    Property OnClick:TNotifyEvent read FOnClick write SetOnClick;
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.SetOnClick(AValue: TNotifyEvent);
begin
  if FOnClick=AValue then Exit;
  FOnClick:=AValue;
end;

procedure TForm1.wmp(var m: TWMLButtonDown);
begin
  //Механизм события вызывает назначенную клику процедуру при приеме сообщения WM_LButtonDown;
  // От винды - этого тебе и не хватает
 if Assigned(OnClick) then FOnClick(self);
end;

end.
Это типа примера, на самом деле там чуть по другому должно быть. Кажись в книге Тексейры и Пачеко это описано весьма полно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какое событие обрабатывается при передаче управления форме Fi11eR Общие вопросы Delphi 6 02.08.2011 21:58
не обрабатывается <?php=$i?> CepbIu PHP 10 25.02.2011 01:11
keybd_event обрабатывается не правильно, в чем дело? zotox Помощь студентам 3 01.12.2009 23:36
Как выяснить каким образом обрабатывается бинарник yarilo Помощь студентам 1 22.04.2009 09:57
Неверно обрабатывается GET-запрос Cold_Night Работа с сетью в Delphi 3 31.03.2009 12:17