Форум: "Начинающим";
Текущий архив: 2008.06.01;
Скачать: [xml.tar.bz2];
ВнизДобавление нового пункта в pop-up меню Найти похожие ветки
← →
DJ Kondakov (2008-04-25 12:12) [0]Подскажите, каким образом можно добавить пункт в меню? Функция ADD предполагает наличие уже готового пункта.
← →
ZENsan © (2008-04-25 12:14) [1]
var
N: TMenuItem;
begin
N := TMenuItem.Create(MenuItem1);
with N do
begin
Caption := "asdasdas";
OnClick := xxxxxx;
....
end;
MenuItem1.Add(N);
end;
← →
ANB (2008-04-25 12:15) [2]Сначала Create в переменную, потом Add.
← →
DJ Kondakov (2008-04-25 12:15) [3]Пасиба!
← →
ANB (2008-04-25 12:16) [4]
> MenuItem1
Это что ?
← →
{RASkov} © (2008-04-25 12:16) [5]> Функция ADD предполагает наличие уже готового пункта
Ну а не готовый-то какой смысл добавлять?
Создавай экземпляр TMenuItem и добавляй...
← →
ANB (2008-04-25 12:16) [6]В приниципе с With мона и без переменной
← →
ZENsan © (2008-04-25 12:17) [7]Ето если субменю
← →
ANB (2008-04-25 12:17) [8]Хотя не. Не получится совсем без переменной.
← →
ZENsan © (2008-04-25 12:18) [9]var
N: TMenuItem;
begin
N := TMenuItem.Create(ПопупМену1);
with N do
begin
Caption := "asdasdas";
OnClick := xxxxxx;
....
end;
ПопупМену1.Add(N);
end;
:)
← →
ZENsan © (2008-04-25 12:19) [10]Я тозхе сначала думал, что Адд возвращает указатель... но блин процедура... так бы with ...Add(TmenuItem.Create(...)) do...
← →
Ega23 © (2008-04-25 12:29) [11]
var
NewItem: TMenuItem;
I : integer;
begin
{ first create the separator }
NewItem := TMenuItem.Create(Self);
NewItem.Caption := "-";
{ add the new item to the Windows menu }
Windows.Add(NewItem);
{ now create and add a menu item for each form }
for I := 0 to Screen.FormCount-1 do
begin
NewItem := TMenuItem.Create(Self);
NewItem.Caption := Screen.Forms[I].Name;
Windows.Add(NewItem);
end;
end;
← →
{RASkov} © (2008-04-25 12:33) [12]> [8] ANB (25.04.08 12:17)
> Хотя не. Не получится совсем без переменной.
begin
PopupMenu1.Items.Add(TMenuItem.Create(PopupMenu1));
with PopupMenu1.Items[PopupMenu1.Items.Count-1] do begin
Caption:="asdasdas";
OnClick:=хххххх;
end;
end;
:)
← →
{RASkov} © (2008-04-25 12:35) [13]
procedure TForm1.Button1Click(Sender: TObject);
begin
PopupMenu1.Items.Add(TMenuItem.Create(PopupMenu1));
with PopupMenu1.Items[PopupMenu1.Items.Count-1] do begin
Caption:="Item "+IntToStr(PopupMenu1.Items.Count);
OnClick:=Button1Click;
end;
end;
← →
ZENsan © (2008-04-25 13:10) [14]Да.. на самом деле.. если захотеть можно в космос полететь.. :)
← →
ANB (2008-04-25 15:23) [15]
> {RASkov} © (25.04.08 12:33) [12]
Да и с первого раза понятно было :)
Хотя и переменная ничем не мешает.
← →
DJ Kondakov (2008-04-28 06:33) [16]А вот новая проблема: пишу
var
mainproc:procedure;
begin
...
onClick:=mainproc;
...
mainproc - это процедура, адрес которой получаю из DLL-ки. Возникает ошибка компиляции Incompatible types: method pointer and regular procedure.
Что делать?
← →
Ega23 © (2008-04-28 09:40) [17]Сделать процедуру - методом.
← →
Leonid Troyanovsky © (2008-04-28 10:57) [18]
> DJ Kondakov (28.04.08 06:33) [16]
> mainproc - это процедура, адрес которой получаю из DLL-ки.
> Возникает ошибка компиляции Incompatible types: method
> pointer and regular procedure.
> Что делать?
Не передавать адреса методов из библиотеки.
Хотя, есть более радикальный способ - разместить весь
код в экзешнике, т.е., отказаться от оной длл.
--
Regards, LVT.
← →
DJ Kondakov (2008-04-28 11:26) [19]
> Сделать процедуру - методом.
Поподробнее, пожалуйста...
← →
Palladin © (2008-04-28 11:38) [20]of object + F1
← →
{RASkov} © (2008-04-28 11:38) [21]> [19] DJ Kondakov (28.04.08 11:26)
> > Сделать процедуру - методом.
>
> Поподробнее, пожалуйста...
Такое не рассказывают... Это нужно знать...
Процедура "внутри" класса - метод. А просто процедура в программе - регулярная называется.
т.е.
RegProc = procedure;
MetodProc = procedure of Object;
← →
DJ Kondakov (2008-04-28 12:51) [22]То есть я сейчас должен описать эту самую MainProc так:
type
MainProc = procedure of object;
← →
Palladin © (2008-04-28 12:55) [23]свойство TMenuItem.OnClick, как ты видишь из справки (я надеюсь, что ты в нее заглядываешь), имеет тип TNotifyEvent, тип TNotifyEvent в свою очередь означает Procedure (Sender:TObject) of Object, где для тебя новое это of Object, про которое ты конечно так и не почитал, так вот, приставка of Object, означает, что эта процедура не просто так сама по себе процедура, она метод конкретного объекта
← →
DJ Kondakov (2008-04-28 13:01) [24]Е-мое, у меня Дельфи английский, я в инглише почти ничего (почти!) не смыслю. Объясните мне, дураку, как сделать, чтобы при нажатии на динамически созданный пункт меню выполнялась процедура из DLL-модуля!
← →
Palladin © (2008-04-28 13:03) [25]создать метод формы и в методе формы вызывать процедуру из dll
← →
DJ Kondakov (2008-04-28 13:04) [26]Как создать метод формы?
← →
Palladin © (2008-04-28 13:05) [27]ууу... молкаю...
← →
Kolan © (2008-04-28 13:10) [28]> у меня Дельфи английский
Да, сочувствую… :)
← →
DJ Kondakov (2008-04-28 13:12) [29]Проблема в том, что я начинал изучение Дельфи не с основ ООП, а сразу с компонентов и процедур. Поэтому мне сейчас сложновато понять, что такое "метод формы"
← →
Anatoly Podgoretsky © (2008-04-28 13:18) [30]> DJ Kondakov (28.04.2008 13:12:29) [29]
А если вернуться назад, в начало начал?
← →
DJ Kondakov (2008-04-28 13:31) [31]Не знаю, не знаю... Может, позже и вернусь, но сейчас время поджимает. Разрабатываю приложение с поддержкой плагинов. От него зависит оценка на экзамене по информатике. Идея такая: приложение при запуске опрашивает директорию \plugins\ на предмет DLL-модулей. В найденных DLL-ках оно находит две процедуры: GetPlugName и MainProc. Создается пункт в контекстном меню, его св-ву Caption присваивается значение, переданное процедурой GetPlugName, а св-ву onClick - MainProc. Уфф...
← →
Kolan © (2008-04-28 13:35) [32]> с компонентов
Интересно что для тебя тогда компонент, если ты незнаешь ооп?
метод формы — это метод формы как ни странно.
Если у тебя есть классTMyForm = class(TForm)
end;
То это класс формы, так вот елси теперь в этом классе объявить метод, то это и будет метод формы.
TMyForm = class(TForm)
public
procedure FormMethod;
end;
← →
Игорь Шевченко © (2008-04-28 13:39) [33]
> Идея такая: приложение при запуске опрашивает директорию
> \plugins\ на предмет DLL-модулей. В найденных DLL-ках оно
> находит две процедуры: GetPlugName и MainProc. Создается
> пункт в контекстном меню, его св-ву Caption присваивается
> значение, переданное процедурой GetPlugName, а св-ву onClick
> - MainProc. Уфф...
Эта...а зачем в DLL, почему не в BPL ?
← →
DJ Kondakov (2008-04-28 13:45) [34]Пишу:
public
procedure MyMethod;
...
var
mainproc:procedure;
...
procedure MyMethod;
begin
mainproc;
end;
...
...
onClick:=MyMethod;
...
Получаю incompatible types: parameter lists differ.
← →
DJ Kondakov (2008-04-28 13:49) [35]Да, а что такое BPL?
← →
Игорь Шевченко © (2008-04-28 14:15) [36]
> Получаю incompatible types: parameter lists differ.
Больно слышать
← →
Anatoly Podgoretsky © (2008-04-28 14:26) [37]> DJ Kondakov (28.04.2008 13:49:35) [35]
Ну что Игорь получил :-)
← →
{RASkov} © (2008-04-28 16:58) [38]> [35] DJ Kondakov (28.04.08 13:49)
Borland Package Library
← →
DJ Kondakov (2008-04-30 13:08) [39]Ладно, с этим, кажется, разобрался. Во всяком случае, ошибок компиляции больше нет. Следующий вопрос: как обратиться к свойству Name объекта, передаваемого в параметре Sender?
← →
{RASkov} © (2008-04-30 13:28) [40]> [39] DJ Kondakov (30.04.08 13:08)
> как обратиться к свойству Name объекта, передаваемого в
> параметре Sender?
TComponent(Sender).Name
Но зачем? Имя у компонентов - это только для дизайна.... в рантайм их как правило не используют...
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.06.01;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.049 c