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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2009, 14:54   #1
flashorl
Новичок
Джуниор
 
Регистрация: 15.12.2009
Сообщений: 5
По умолчанию написание компоненты в дельфи

Доброго времени суток, господа однофорумчане.
Есть задача: написать компонент, который реализует выпадающее меню. В зависимости от того какой пункт выбран, играет загруженная мелодия.
Это дело реализовано так:
Код:
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.
Народ, подскажите как реализовать "В зависимости от того какой пункт выбран, играет загруженная мелодия". Пока играет одна и та же на все события.
flashorl вне форума Ответить с цитированием
Старый 15.12.2009, 15:08   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... А мелодия должна меняться если я кликнул по некому пункту или если я просто мышку навел на пункт?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.12.2009, 16:03   #3
flashorl
Новичок
Джуниор
 
Регистрация: 15.12.2009
Сообщений: 5
По умолчанию

в ТЗ описание несколько расплывчатое... но я думаю все таки ежели пункт выбран, у меня в компоненте процедура PlaySound() играет при клике на любом пункте меню... надо как то сюда передать индекс текущего элемента что ли, мучал долго, не додумался
flashorl вне форума Ответить с цитированием
Старый 15.12.2009, 16:26   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Надо назначить каждому элементу событие OnClick, обработчик которой ты в ключишь в Private класса. В нем TMeniItem(Sender) дает кликнутый элемент.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.12.2009, 16:34   #5
flashorl
Новичок
Джуниор
 
Регистрация: 15.12.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Надо назначить каждому элементу событие OnClick, обработчик которой ты в ключишь в Private класса. В нем TMeniItem(Sender) дает кликнутый элемент.
пробовал вчера с OnClick экспериментировать - переписать событие родительского класса, переопределив его в потомке. В итоге мне программа выдавала "Field definition not allowed after methods or properties" и исходник не компилился
flashorl вне форума Ответить с цитированием
Старый 15.12.2009, 16:51   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
переписать событие родительского класса
гм... так переопределите для начала процедуру добавления items-ов и уже в ней будет назначение на 1 - клик...
Код:
procedure TMyPopupMenu.Add(Menu: TMenu; Item: TMenuItem);

procedure InitItem(Item: TMenuItem);
 begin
  if not (Item.GetParentComponent is TPopupMenu) then
   Item.OnClick    := Self.myClick; // тож назначить + 
фильтровать в ней playsound можно либо по tag, либо по номеру items
 end;

 procedure InitItems(Item: TMenuItem);
 //бежит по пунктам + подпункты
 var I: Word;
 begin
  I:= 0;
  while I < Item.Count do
   begin
    InitItem(Item[I]);
    if Item[I].Count > 0 then
     InitItems(Item[I]);
    Inc(I);
   end;
 end;

begin
 if Assigned(Menu) then // проверка существования
  InitItems(Menu.Items);

 if Assigned(Item) then begin // аналогично
  InitItem(Item);
  InitItems(Item);
 end;
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 15.12.2009, 17:14   #7
flashorl
Новичок
Джуниор
 
Регистрация: 15.12.2009
Сообщений: 5
По умолчанию

"Так переопределите для начала процедуру добавления items-ов " - а где такая процедура есть? в классе TPopupmenu она отсутствует
flashorl вне форума Ответить с цитированием
Старый 15.12.2009, 17:25   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

непосредственно нет, но если вы просмотрите внимательней создание класса tpopup, то увидите...
Код:
constructor TPopupMenu.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FPopupPoint.X := -1;
  FPopupPoint.Y := -1;
  FItems.OnClick := DoPopup;
  FWindowHandle := Application.Handle;
  FAutoPopup := True;
  PopupList.Add(Self);
end;
а теперь гляньте, що таке PopupList
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 16.12.2009, 09:39   #9
flashorl
Новичок
Джуниор
 
Регистрация: 15.12.2009
Сообщений: 5
По умолчанию

сделал в таком виде:
Код:
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;
      procedure Add(Menu: TMenu; Item: TMenuItem); 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)
//if Items.GetNamePath = 'N11' then showmessage ('1')
//else if Items.GetNamePath = 'N12' then showmessage ('2') else showmessage ('3');
showmessage (Items.Caption)
end;

procedure TMyPopupMenu.Add(Menu: TMenu; Item: TMenuItem);

procedure InitItem(Item: TMenuItem);
 begin
  if not (Item.GetParentComponent is TPopupMenu) then
   Item.OnClick    := Self.myClick; // тож назначить +
//фильтровать в ней playsound можно либо по tag, либо по номеру items
 end;

 procedure InitItems(Item: TMenuItem);
 //бежит по пунктам + подпункты
 var I: Word;
 begin
  I:= 0;
  while I < Item.Count do
   begin
    InitItem(Item[i]);
    if Item[i].Count > 0 then
     InitItems(Item[i]);
    Inc(I);
   end;
 end;

begin
 if Assigned(Menu) then // проверка существования
  InitItems(Menu.Items);

 if Assigned(Item) then begin // аналогично
  InitItem(Item);
  InitItems(Item);
 end;
end;

end.
сообщение компилятора "[Ошибка] MyPopupMenu.pas(14): Method 'Add' not found in base class"... признаю что туплю и запутался, ткните носом что и где тут не так... я понимаю что такого метода в родительском классе нету, а PopupList это класс TPopupList, образованный от класса TList
flashorl вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматическое написание Syltan Софт 12 20.11.2009 21:52
Написание инсталлятора A114U Помощь студентам 8 04.08.2008 13:29
Написание чата Viteef PHP 10 25.12.2007 10:37