Конференция "Компоненты" » написание компонента на дельфи [D7, WinXP]
 
  • flash (15.12.09 14:49) [0]
    Доброго времени суток, господа однофорумчане.
    Есть задача: написать компонент, который реализует выпадающее меню. В зависимости от того какой пункт выбран, играет загруженная мелодия.
    Это дело реализовано так:
    [code]
    unit MyPopupMenu;

    interface

    uses WinTypes, WinProcs, Messages, SysUtils, Windows, Variants, Dialogs, Classes, Controls, Forms, Graphics, Stdctrls, Menus, mmsystem;

    type
     {Мы создаем класс TMyPopupMenu, он является предком TPopupMenu, следовательно
     наследует все методы и события}
     TMyPopupMenu = class(TPopupMenu)
     private
     {переопределяем метод Popup, теперь у пользователя будет вызываться наш метод :-)}
         procedure Popup(X, Y: Integer); override;
     protected

     public

     published

     end;
     {Cлужебная процедура для Delphi. Она регистрирует компонент в палитре компонентов.}
      procedure Register;

    implementation
     {Регистрируем наш новый компонент на вкладке Standard}
    procedure Register;
    begin
     RegisterComponents('Standard', [TMyPopupMenu]);
    end;

    procedure TMyPopupMenu.Popup(X, Y: Integer);
    var PCh: PChar;
    begin
    {Выполним метод Popup класса предка}
    inherited Popup(X, Y);
    {а теперь дописываем то, что нам нужно}
    {PlaySound - воспроизводит любые волновые звуки}
    {Pch - определяет воспроизводимый звук}
    {второй аргумент отвечает за источник звука, он используется если звук берется из
    какого-либо ресурса. Здесь 0, т.к. мы этим не пользуемся}
    {Последний параметр является множеством, которое определяет как будет воспроизводиться
    звук (режим воспроизведения). SND_ASYNC - звук воспроизводится асинхронно и
    функция возвращается сразу же после начала воспроизведения}
    PlaySound(Pch,0,SND_ASYNC)
    end;
    end.
    [/code]

    Народ, подскажите как реализовать "В зависимости от того какой пункт выбран, играет загруженная мелодия". Пока играет одна и та же на все события.
  • Медвежонок Пятачок © (15.12.09 15:08) [1]
    как реализовать "В зависимости от того

    в Popup пока еще нет этого самого "того", в зависимости от которого надо чем-то там дудеть. Рановато там использовать плэйсаунд.
  • flash (15.12.09 16:03) [2]
    хорошо, какой будет Ваш вариант?
  • Медвежонок Пятачок © (15.12.09 16:22) [3]
    по моему ясно, что вариант будет не в методе попап.
  • flash (15.12.09 16:46) [4]
    а на какой метод тогда повесить? я вчера горы форумов и документации перерыл, ничего не нашел... к сожалению тут нету метода как у того же класса TButton Click(((
  • Медвежонок Пятачок © (15.12.09 16:51) [5]
    тут нету. зато есть не тут.
    TMenuItem
  • flash (15.12.09 17:16) [6]
    т.е. мне переопределить класс TItem, сделав класс TMyItem? А как его тогда к TPopupMenu прикрутить? Или тоже заново переопределить все свойства которые были определены как TItem на TMyItem?
  • Медвежонок Пятачок © (15.12.09 17:37) [7]
    вообще перед тем как проектировать новый пользовательский класс логично было бы изучить иерархию предков на предмет от кого наследоваться и как там в них менюитемы прикручены к меню
  • DimaBr © (16.12.09 08:51) [8]

    type
    TNewMenuItem = class(TMenuItem)
     procedure Click;override;
    end;

    implementation

    { TMenuItem1 }

    procedure TNewMenuItem.Click;
    begin
     inherited;
     PlaySound
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    var Item: TNewMenuItem;
    begin
     Item := TNewMenuItem.Create(nil);
     Item.Caption := 'Test';
     PopupMenu1.Items.Add(Item);
    end;

    end.

  • flash (16.12.09 09:41) [9]
    можно какой нибудь грубый пример кода привести, как это в целом выглядеть должно?
  • Медвежонок Пятачок © (16.12.09 09:59) [10]
    c таким способом окончательно пропадает смысл в этом и так уже достаточно бессмысленном компоненте.
    тогда уж проще написать универсальный обработчик
    OnAnyThisPopupMenuItemsClick

    так хоть останется возможность дизайнить меню в редакторе
  • flash (16.12.09 10:05) [11]

    > DimaBr


    это дописывается в существующий компонент или это новый компонент? если новый, то как связать TPopepItem с TNewMenuItem?
  • Медвежонок Пятачок © (16.12.09 10:09) [12]
    TMenu = class(TComponent)
    ....
     published
       property Items: TMenuItem read FItems;
    ....

    ps
    у тебя исходники что ли украли?
  • DimaBr © (16.12.09 12:12) [13]
    Давайте сначала.
    Вам нужен компонент, который вы будете использовать всюду или же использование ограничено одним приложением ?
  • flash (16.12.09 13:10) [14]
    Мне нужен компонент который будет использоваться только в одном приложении, это как бы часть лабораторной работы в институте
  • DimaBr © (16.12.09 13:24) [15]
    Разместите описание перед описание формы

    TMenuItem = class(Menus.TMenuItem)
    procedure Click;override;
    end;

    TMainForm = class(TForm)
    // и так далее

  • flash (16.12.09 14:32) [16]
    Сделал как Вы писали, выдается ошибка "Unsatisfied forward or external declaration: 'TMenuItem.Click'"
  • Медвежонок Пятачок © (16.12.09 14:34) [17]
    ну так реализацию-то TMenuItem.Click тоже надо как бы в исходник внести
  • DimaBr © (16.12.09 14:43) [18]

    procedure TMenuItem.Click;
    begin
    inherited;
    PlaySound
    end;

 
Конференция "Компоненты" » написание компонента на дельфи [D7, WinXP]
Есть новые Нет новых   [134466   +3][b:0][p:0.002]