|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Присвоение Onclick динамическому меню
Ребят, меню создаётся, только никак не могу OnClick задать... Ошибка при попытке ккомпиляции...
Вот мои процедуры: Код:
type TFMain = class(TForm) MainMenu: TMainMenu; ... procedure MenuItemClick(Sender:TObject); private ... procedure CreateMenu(); end; procedure TFMain.CreateMenu(); var MenuPosition:string; MenuItemNames:TStringList; MenuItemsCount,i:cardinal; MenuItems:array of TMenuItem; begin MenuPosition:=LoadPlugin('OilGasSprt', FMain.Handle, 'MenuPosition'); //создаём массив MenuItemNames MenuItemNames:=TStringList.Create(); StrBreakApart(MenuPosition, '<BR>', MenuItemNames); MenuItemsCount:=MenuItemNames.Count; SetLength(MenuItems,MenuItemsCount); //Заполняем массив элементов меню данными из массива MenuItemNames MenuItems[0]:=TMenuItem.Create(FMain); MenuItems[0].Caption:=MenuItemNames[0]; FMain.MainMenu.Items.Add(MenuItems[0]); for i:=1 to MenuItemsCount-1 do begin MenuItems[i]:=TMenuItem.Create(FMain); MenuItems[i].Caption:=MenuItemNames[i]; MenuItems[i-1].Add(MenuItems[i]); end; MenuItems[i].OnClick:=FMain.MenuItemClick(FMain); MenuItemNames.Free(); end; procedure TFMain.MenuItemClick(Sender:TObject); begin ShowMessage('MenuItemClick'); end; |
#2
|
|||
|
|||
Ошибка на строчке:
Код:
MenuItems[i].OnClick:=FMain.MenuItemClick(FMain); По-всякому пробовал... Хотел бы MenuItemClick тоже в приват загнать, но тогда тоже проблемы какие-то... В этом случае её не видно в списке при ручном дообавлении OnClick через ObjectInspector Последний раз редактировалось sorockinalex, 05.11.2012 в 19:57. |
#3
|
||||
|
||||
Цитата:
|
Этот пользователь сказал Спасибо sariman за это полезное сообщение: | ||
sorockinalex (06.11.2012)
|
#4
|
||||
|
||||
глянь мой старый пример: http://www.delphisources.ru/pages/so...ast-start.html там как раз используется то, что те нужно!!
уволен в запас!!! |
Этот пользователь сказал Спасибо RusMaXXX за это полезное сообщение: | ||
sorockinalex (06.11.2012)
|
#5
|
||||
|
||||
Может лучше так:
Код:
MenuItems[i].OnClick:=FMain.MenuItemClick;//без_скобок_и_параметров_в_скобках Последний раз редактировалось YVitaliy, 05.11.2012 в 20:55. |
Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение: | ||
sorockinalex (06.11.2012)
|
#6
|
|||
|
|||
Код:
MenuItems[i].OnClick:=FMain.MenuItemClick; Access violation at address ... Write of address... А в тело цикла как раз не надо, так как последний открытый пункт и является активным.. |
#7
|
|||
|
|||
опа, блин... понял... я думал после цикла последнее значение в переменной i остаётся... Почему оно не остаётся в переменной i???
|
#8
|
||||
|
||||
Цитата:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
sorockinalex (06.11.2012)
|
#9
|
||||
|
||||
Цитата:
Цитата:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
sorockinalex (06.11.2012)
|
#10
|
|||
|
|||
блин, так оно и есть, цикл от 1 до 2, например, а после цикла i=3, отсюда и ошибка всплывала... так и сделал (MenuItemsCount-1) вместо i
|
#11
|
|||
|
|||
Забыл сказать спасибо всем! Огромное!
|
#12
|
|||
|
|||
Ребят, опять аналогичная ошибка. не пойму опять...
Вторая форма в bpl пакете, вызывается динамически из главной формы пакета. OnClick никак не выполняется - AccessViolation при нажатии на '+' Вот код вызываемой формы: Код:
unit UAddEquipmentNumbers; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TFAddEquipmentNumbers = class(TForm) Label1:TLabel; procedure FormCreate(Sender: TObject); procedure AddButtonClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var FAddEquipmentNumbers: TFAddEquipmentNumbers; implementation {$R *.dfm} var numberEdit, birthyearEdit :array of TEdit; addButton:TButton; procedure TFAddEquipmentNumbers.FormCreate(Sender: TObject); begin SetLength(numberEdit,1); SetLength(birthyearEdit,1); NumberEdit[0]:=TEdit.Create(Self); NumberEdit[0].Parent:=Self; NumberEdit[0].Left:=8; NumberEdit[0].Top:=64; NumberEdit[0].Width:=65; NumberEdit[0].Height:=21; NumberEdit[0].Visible:=true; NumberEdit[0].Enabled:=true; birthyearEdit[0]:=TEdit.Create(Self); birthyearEdit[0].Parent:=Self; birthyearEdit[0].Left:=81; birthyearEdit[0].Top:=64; birthyearEdit[0].Width:=65; birthyearEdit[0].Height:=21; birthyearEdit[0].Visible:=true; birthyearEdit[0].Enabled:=true; addButton:=TButton.Create(Self); addButton.Parent:=Self; addButton.Left:=154; addButton.Top:=64; addButton.Width:=21; addButton.Height:=21; addButton.Visible:=true; addButton.Enabled:=true; addButton.Caption:='+'; addButton.OnClick:=FAddEquipmentNumbers.AddButtonClick; end; procedure TFAddEquipmentNumbers.AddButtonClick(Sender: TObject); begin // SetLength(numberEdit,Length(numberEdit)+1); SetLength(birthyearEdit,Length(birthyearEdit)+1); NumberEdit[Length(numberEdit)-1].Left:=8; NumberEdit[Length(numberEdit)-1].Top:=NumberEdit[Length(numberEdit)-2].Top+NumberEdit[Length(numberEdit)-2].Height+8; NumberEdit[Length(numberEdit)-1].Width:=65; NumberEdit[Length(numberEdit)-1].Height:=21; NumberEdit[Length(numberEdit)-1].Visible:=true; NumberEdit[Length(numberEdit)-1].Enabled:=true; birthyearEdit[Length(birthyearEdit)-1].Left:=81; birthyearEdit[Length(birthyearEdit)-1].Top:=birthyearEdit[Length(birthyearEdit)-2].Top+birthyearEdit[Length(birthyearEdit)-2].Height+8; birthyearEdit[Length(birthyearEdit)-1].Width:=65; birthyearEdit[Length(birthyearEdit)-1].Height:=21; birthyearEdit[Length(birthyearEdit)-1].Visible:=true; birthyearEdit[Length(birthyearEdit)-1].Enabled:=true; addButton.Top:=NumberEdit[Length(numberEdit)-1].Top; end; end. |
#13
|
|||
|
|||
Self.AddButtonClick; тоже пробовал - компилится, но при нажатии выдаёт Access Violation...
|
#14
|
|||
|
|||
блин, во я невнимательный... увеличиваю размер массива, а новый элемент TEdit не создаю... спать пора )) извиняюсь, кто потратил своё время )
|
#15
|
|||
|
|||
Ребят, опять не догоняю... Есть процедура, Edit не присутствует на форме. То есть процедура не привязана к объекту, так как объекты динамически создаются. Плюсиком добавляются новые поля и для каждого нужна эта процедура.
Код:
procedure TFAddEquipmentNumbers.EditKeyPress(Sender: TObject); const allowedsymbols: set of Char=['0'..'9']; var Key: Char; begin if (Key in allowedsymbols) then begin end else key :=#0; end; При создании формы создаются первые экземпляры Код:
procedure TFAddEquipmentNumbers.FormCreate(Sender: TObject); begin SetLength(numberEdit,1); SetLength(birthyearEdit,1); NumberEdit[0]:=TEdit.Create(Self); NumberEdit[0].Parent:=Self; NumberEdit[0].Left:=8; NumberEdit[0].Top:=69; NumberEdit[0].Width:=60; NumberEdit[0].Height:=21; NumberEdit[0].Visible:=true; NumberEdit[0].Enabled:=true; NumberEdit[0].OnChange:=EditKeyPress; birthyearEdit[0]:=TEdit.Create(Self); birthyearEdit[0].Parent:=Self; birthyearEdit[0].Left:=76; birthyearEdit[0].Top:=69; birthyearEdit[0].Width:=30; birthyearEdit[0].Height:=21; birthyearEdit[0].MaxLength:=2; birthyearEdit[0].Visible:=true; birthyearEdit[0].Enabled:=true; end; Что сделать с Key??? Как его получить????? Последний раз редактировалось sorockinalex, 28.11.2012 в 22:33. |