Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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]

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

Да, сочувствую&#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.049 c
4-1190007462
Nikfel
2007-09-17 09:37
2008.06.01
Как получить handle под курсором.


2-1210058291
Alex
2008-05-06 11:18
2008.06.01
Как сделать отчет в Word


15-1208543269
partizan
2008-04-18 22:27
2008.06.01
TWebBrowser и сообщение об ошибке в скрипте


15-1208518662
man
2008-04-18 15:37
2008.06.01
Motorola C350


15-1208512350
Чёрный
2008-04-18 13:52
2008.06.01
В какой области программирования больше платят денег?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский