![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Ребят, меню создаётся, только никак не могу 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. |