Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.01;
Скачать: CL | DM;

Вниз

Добавление нового пункта в 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]

> у меня Дельфи английский

Да, сочувствую&#133 :)


 
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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.017 c
2-1210254880
WebSQLNeederr
2008-05-08 17:54
2008.06.01
Напомните как в Стринглист удалить повторяющиеся строки?


2-1210064880
дюха
2008-05-06 13:08
2008.06.01
Графика


3-1198674812
Циркуль
2007-12-26 16:13
2008.06.01
выгрузка из датасета через ODBC и ADO в разные форматы


15-1208497739
Дмитрий С
2008-04-18 09:48
2008.06.01
Большой ресурс. Правильно ли?


4-1188290808
DimonNew
2007-08-28 12:46
2008.06.01
События от мыши и графического планшета, разделить