Главная страница
    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
Но зачем? Имя у компонентов - это только для дизайна.... в рантайм их как правило не используют...


 
DJ Kondakov   (2008-05-05 06:51) [41]

Короче, новая проблема.
Пишу:

...
procedure menuitemclick(sender:tobject);
...
procedure tform1.Menuitemclick(sender:tobject);
var
libhandle:thandle;
mainproc:procedure;
begin
@mainproc:=nil;
libhandle:=loadlibrary(pchar(paramstr(0)+"\plugins\"+Tcomponent(sender).name+".dll"));
if libhandle>=32 then begin
 @mainproc:=getprocaddress(libhandle,"mainproc");
 if @mainproc<>nil then mainproc;
end;
freelibrary(libhandle);
end;
...
...
procedure tform1.LoadPlugins;
var
sr:tsearchrec;
GetPlugName:function:pchar;
libhandle:thandle;
mi:tmenuitem;
nm:string;
begin
if fileexists(paramstr(0)+"\plugins\*.dll") then begin
 findfirst(paramstr(0)+"\plugins\*.dll",faanyfile,sr);
 @getplugname:=nil;
 libhandle:=loadlibrary(pchar(sr.name));
 if libhandle>=32 then begin
  @getplugname:=getprocaddress(libhandle,"GetPlugName");
  if @getplugname<>nil then begin
   mi := TMenuItem.Create(form1.PopupMenu2);
   nm:=extractfilename(sr.name);
   delete(nm,pos(".",nm),4);
    with mi do begin
     Caption := strpas(GetPlugName);
     name:=nm;
     onClick:=MenuItemClick(mi);
    end;
   form1.PopupMenu2.items.Add(mi);
  end;
 end;
 freelibrary(libhandle);
 while findnext(sr)=0 do begin
  @getplugname:=nil;
 libhandle:=loadlibrary(pchar(sr.name));
 if libhandle>=32 then begin
  @getplugname:=getprocaddress(libhandle,"GetPlugName");
  if @getplugname<>nil then begin
   mi := TMenuItem.Create(form1.PopupMenu2);
   nm:=extractfilename(sr.name);
   delete(nm,pos(".",nm),4);
    with mi do begin
     Caption := strpas(GetPlugName);
     name:=nm;
     onClick:=MenuItemClick(mi);
    end;
   form1.PopupMenu2.items.Add(mi);
  end;
 end;
 end; freelibrary(libhandle);
end;
end;
...
На выделенных курсивом фрагментах получаю Incompatible types: "TNotifyEvent" and "procedure, untyped pointer or untyped parameter"


 
Palladin ©   (2008-05-05 07:40) [42]

может лучше жирным было выделить, а то глаза то не казенные...


 
Loginov Dmitry ©   (2008-05-05 07:49) [43]

> if libhandle>=32 then begin


Миллионный раз уже вижу этот код. Где же источник этой ереси? (


 
sniknik ©   (2008-05-05 08:46) [44]

это не ересь. просто раньше, очень давно, функция возвращала код ошибки если значение < 32. теперь это просто привычка... или подражание/копирование чужого кода.
сам пишу также... (писал вернее пока не задумался о смысле после однотипного вопроса, не полез в хелп и не увидел, что мои знания устарели.)  
а сейчас уже и не уверен эта функция так себя вела или другая.


 
Palladin ©   (2008-05-05 08:49) [45]

в интернете встречаются статьи, старые конечно, именно с таким условием, а новых мало кто пишет, бо чего нового можно написать про dll  :)


 
Anatoly Podgoretsky ©   (2008-05-05 09:20) [46]

Этот код из Д1


 
Anatoly Podgoretsky ©   (2008-05-05 09:24) [47]


> Миллионный раз уже вижу этот код. Где же источник этой ереси?
>  (

Из кодопомойки, их хоть и много, но они копируют друг у друга, размножаю глупость во вселенском маштабе. Ну а копипастеров всегда хватало.


 
DJ Kondakov   (2008-05-05 13:09) [48]

Ошибка в фрагментах типа

>  if @getplugname<>nil then begin    mi := TMenuItem.Create(form1.
> PopupMenu2);    nm:=extractfilename(sr.name);    delete(nm,
> pos(".",nm),4);     with mi do begin      Caption := strpas(GetPlugName);
>       name:=nm;      onClick:=MenuItemClick(mi);     end;
>     form1.PopupMenu2.items.Add(mi);   end;


 
Palladin ©   (2008-05-05 13:12) [49]

если бы ты почитал в справке чего пишут на тему "of object" ты бы давно все понял... а так ерундой страдаешь...


 
DJ Kondakov   (2008-05-07 14:11) [50]

Усе понял... Пасиба... Все работает. Показать?



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.06.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.047 c
15-1208641026
Германн
2008-04-20 01:37
2008.06.01
А что твориться на Королевстве?


3-1198497594
Максим
2007-12-24 14:59
2008.06.01
Многотабличные запросы (модификация данных)


15-1208330576
Slider007
2008-04-16 11:22
2008.06.01
С днем рождения ! 16 апреля 2008 среда


2-1209883222
leonidus
2008-05-04 10:40
2008.06.01
Показ и скрытие нескольких форм


2-1210064880
дюха
2008-05-06 13:08
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский