компонент на дельфи
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
компонент на дельфи - 2009-12-15 14:46:21.040000
|
|
|
ximera
Сообщений: 39
Оценки: 0
Присоединился: 2005-01-10 23:16:36
|
Доброго времени суток, господа однофорумчане. Есть задача: написать компонент, который реализует выпадающее меню. В зависимости от того какой пункт выбран, играет загруженная мелодия. Это дело реализовано так:
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.
Народ, подскажите как реализовать "В зависимости от того какой пункт выбран, играет загруженная мелодия". Пока играет одна и та же на все события.
|
|
|
RE: компонент на дельфи - 2009-12-15 15:26:59.920000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
В Pch поместить путь к нужному файлу? ) Вообще нужно писать свой обработчик эвента выбора пункта меню и в этот обработчик уже и будет приходить номер выбранного пункта. Есть мнение, что ты что-то не то переопределяешь :). Где у тебя идёт добавление своих пунктов меню?
|
|
|
RE: компонент на дельфи - 2009-12-15 16:07:24.316666
|
|
|
ximera
Сообщений: 39
Оценки: 0
Присоединился: 2005-01-10 23:16:36
|
пока для тестового воспроизведения пользуюсь PlaySound()…. А на какое событие вешать свой обработчик, какое событие предка переопределять? Я не нашел такого же события как например у TButton событие Click. Свои пункты меню не добавляются, вообще думал проверять индекс элемента: если четный - играем мелодию 1, если не четный - мелодию номер два. Т.к. в ТЗ этот момент смутно описан
|
|
|
RE: компонент на дельфи - 2009-12-15 16:37:53.756666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Ну вот и уточняй тз. Вообще-то индекс и надо проверять =). А событие - что-то типа ItemSelected.
|
|
|
RE: компонент на дельфи - 2009-12-15 17:20:36.553333
|
|
|
ximera
Сообщений: 39
Оценки: 0
Присоединился: 2005-01-10 23:16:36
|
уточнил, сказали как хочешь-так и делай) события ItemSelected - чего то такого не откопал(
|
|
|
RE: компонент на дельфи - 2009-12-15 19:38:30.793333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
А какие ты вообще знаешь события? RTFM пробовал?
|
|
|
RE: компонент на дельфи - 2009-12-16 14:34:05.530000
|
|
|
ximera
Сообщений: 39
Оценки: 0
Присоединился: 2005-01-10 23:16:36
|
пробовал, иначе суда бы не писал. Господа, давайте не будем оценивать мой уровень знаний, чего я делал или не делал. Если у кого то есть идея как это реализовать или кусок кода, буду очень благодарен
|
|
|
RE: компонент на дельфи - 2009-12-16 15:25:04.140000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Я тз тоже не понял. Тебе нужно свой компонент написать с нуля? Или стандартного хватит? Зачем метод popup переопределять? Ведь он отвечает за отображение меню, а не за обработку действия пользователя. Какая должна быть зависимость между номером выбранного элемента и играемым звуком? Ведь юзер может добавить 100500 пунктов - и твоему компоненту как-то придётся на это реагировать. Знания твои придётся оценить на примере хэллоу-ворда, поскольку сложность вопроса не очень высока (на уровне 1-го курса универа) и ты никаким образом не намекнул на то, что ты знаешь. Просто сложно что-то советовать… Давай так, ты сможешь по нажатию левой кнопки мыши на формочке вывести попап-менюшку с 4-мя пунктами и при выборе пункта вызвать мессаджбокс, в котором будет сказано, какой ты пункт меню выбрал? А вообще, как я понял задание, тебе нужно: Написать свой компонент наподобие выпадающего меню, элементами которого будут являться тоже некоторые, разработанные тобой компоненты (назовём их TMusicMenuItem). Так вот, твоя задача - задача: расширить стандартный компонент с меню таким образом, чтобы в него в качестве пунктов можно было кидать эти самые TMusicMenuItem. А уже у самого TMusicMenuItem должно быть 3 свойства (или как там в дэлфи): TextValue (к примеру - отображаемый текст), Action (действие по клику), BGSound (путь к звуковому файлу, который нужно играть). Советую www.rsdn.ru
|
|
|
RE: компонент на дельфи - 2009-12-16 16:39:14.940000
|
|
|
ximera
Сообщений: 39
Оценки: 0
Присоединился: 2005-01-10 23:16:36
|
quote:
ORIGINAL: _SaZ_ Я тз тоже не понял. Тебе нужно свой компонент написать с нуля? Или стандартного хватит? Зачем метод popup переопределять? Ведь он отвечает за отображение меню, а не за обработку действия пользователя. Какая должна быть зависимость между номером выбранного элемента и играемым звуком? Ведь юзер может добавить 100500 пунктов - и твоему компоненту как-то придётся на это реагировать. ТЗ не мне дали, помогаю подруге, ТЗ ей это дали в институте. В моем понимании это можно реализовать так: если пункт меню четный-играет мелодия раз, если пункт меню нечетный-играет мелодия два. quote:
Знания твои придётся оценить на примере хэллоу-ворда, поскольку сложность вопроса не очень высока (на уровне 1-го курса универа) и ты никаким образом не намекнул на то, что ты знаешь. Просто сложно что-то советовать… Давай так, ты сможешь по нажатию левой кнопки мыши на формочке вывести попап-менюшку с 4-мя пунктами и при выборе пункта вызвать мессаджбокс, в котором будет сказано, какой ты пункт меню выбрал? насчет моих знаний - я закончил институт несколько лет назад с дипломом программиста, но в связи с тем что писал когда то на Си, а не на дельфи и сейчас все время пишу только на 1С, ООП я порядком забыл, точнее старался забыть чтобы на мировоздание языка 1С пересесть… Да, можно покритиковать сейчас 1С, сказать что это полная фигня и пр. - но какая есть работа в нашем городе, на той и работаю quote:
А вообще, как я понял задание, тебе нужно: Написать свой компонент наподобие выпадающего меню, элементами которого будут являться тоже некоторые, разработанные тобой компоненты (назовём их TMusicMenuItem). Так вот, твоя задача - задача: расширить стандартный компонент с меню таким образом, чтобы в него в качестве пунктов можно было кидать эти самые TMusicMenuItem. А уже у самого TMusicMenuItem должно быть 3 свойства (или как там в дэлфи): TextValue (к примеру - отображаемый текст), Action (действие по клику), BGSound (путь к звуковому файлу, который нужно играть). ТЗ такое. Выпадающее меню - при выборе нечетного пункта играет мелодия раз, при выборе четного - мелодия два. То, что Вы привели, избыточно, хотя тоже верно. Моя ошибка в том, что я отталкивался от класса TPopupMenu, пытаясь в нем как то на метод click выйти, которого нету. А надо было идти через TMenTMenu… чую истина где то рядом quote:
Советую www.rsdn.ru а за рдсн спасибо, толковый сайт, почитаю
|
|
|
RE: компонент на дельфи - 2009-12-16 17:51:05.843333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Всё намного проще: достаточно найти доки по TPopupMenu в дэлфи. И переопределить метод OnClick (или какой там вызывается при выборе пункта меню): вызвать PlaySound с нужными аргументами и вызвать метод родителя. Собственно всё. Именно поэтому я придумал такое задание для хэлоуворда, чтобы можно было "через точечку" или в визуальном редакторе просмотреть список доступных событий. P.S. если задание девушке не IT-шной специальности - то может там совсем не стоит создавать новый компонент? Т.е. твой изначальный путь был верен :), просто ты не разобрался с событиями в дэлфи. В общем я вижу так (на пальцах): формочка, попап-менюшка с некоторым количеством контента, и свой обработчик OnClick ;), или WM_LBUTTONDOWN (ну или по синонимам). P.P.S. совершенно ничего против 1С не имею (и против твоих знаний). Особенно против 8-й :), глядишь, к 9-й версии вообще станет достаточно мощным, профессиональным инструментом (для программистов). А с рсдн-а я бы советовал это (чтобы долго не искать): 1. http://rsdn.ru/summary/3165.xml 2. http://rsdn.ru/article/Delphi/makecomponents.xml Я сам на дэлфи только пару раз писал, да и то юниты, напичканные API вызовами. С GUI работать не приходилось.
|
|
|
RE: компонент на дельфи - 2009-12-18 18:07:00.446666
|
|
|
alexbozhko
Сообщений: 1024
Оценки: 0
Присоединился: 2005-11-24 13:35:34
|
quote:
ORIGINAL: _SaZ_ Я тз тоже не понял. Тебе нужно свой компонент написать с нуля? Или стандартного хватит? Зачем метод popup переопределять? Ведь он отвечает за отображение меню, а не за обработку действия пользователя. Какая должна быть зависимость между номером выбранного элемента и играемым звуком? Ведь юзер может добавить 100500 пунктов - и твоему компоненту как-то придётся на это реагировать. Знания твои придётся оценить на примере хэллоу-ворда, поскольку сложность вопроса не очень высока (на уровне 1-го курса универа) и ты никаким образом не намекнул на то, что ты знаешь. Просто сложно что-то советовать… Давай так, ты сможешь по нажатию левой кнопки мыши на формочке вывести попап-менюшку с 4-мя пунктами и при выборе пункта вызвать мессаджбокс, в котором будет сказано, какой ты пункт меню выбрал? А вообще, как я понял задание, тебе нужно: Написать свой компонент наподобие выпадающего меню, элементами которого будут являться тоже некоторые, разработанные тобой компоненты (назовём их TMusicMenuItem). Так вот, твоя задача - задача: расширить стандартный компонент с меню таким образом, чтобы в него в качестве пунктов можно было кидать эти самые TMusicMenuItem. А уже у самого TMusicMenuItem должно быть 3 свойства (или как там в дэлфи): TextValue (к примеру - отображаемый текст), Action (действие по клику), BGSound (путь к звуковому файлу, который нужно играть). Советую www.rsdn.ru Вот совершенно правильно. Нужно унаследовать TMenuItem и немного переписать конструктор для TPopupMenu. Хотя писать компонент - нерационально. Можно хелперами воспользоваться… И то, при условии, что нужно переопределять функционал компонента, а не просто написать банальный обработчик событий
|
|
|
|
|