Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.11.2012, 19:53
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию Присвоение 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  
Старый 05.11.2012, 19:55
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Ошибка на строчке:
Код:
MenuItems[i].OnClick:=FMain.MenuItemClick(FMain);
Incompatible types TNotifyEvent and Procedure
По-всякому пробовал...

Хотел бы MenuItemClick тоже в приват загнать, но тогда тоже проблемы какие-то... В этом случае её не видно в списке при ручном дообавлении OnClick через ObjectInspector

Последний раз редактировалось sorockinalex, 05.11.2012 в 19:57.
Ответить с цитированием
  #3  
Старый 05.11.2012, 20:22
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Цитата:
Сообщение от sorockinalex
Ошибка на строчке:
Код:
MenuItems[i].OnClick:=FMain.MenuItemClick(FMain);
Почему у вас это вне цикла?
Ответить с цитированием
Этот пользователь сказал Спасибо sariman за это полезное сообщение:
sorockinalex (06.11.2012)
  #4  
Старый 05.11.2012, 20:36
Аватар для RusMaXXX
RusMaXXX RusMaXXX вне форума
Начинающий
 
Регистрация: 01.10.2008
Сообщения: 138
Версия Delphi: 7
Репутация: 21
По умолчанию

глянь мой старый пример: http://www.delphisources.ru/pages/so...ast-start.html там как раз используется то, что те нужно!!
__________________
уволен в запас!!!
Ответить с цитированием
Этот пользователь сказал Спасибо RusMaXXX за это полезное сообщение:
sorockinalex (06.11.2012)
  #5  
Старый 05.11.2012, 20:39
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Может лучше так:
Код:
MenuItems[i].OnClick:=FMain.MenuItemClick;//без_скобок_и_параметров_в_скобках
ну и обязательно в тело цикла все это засунуть.

Последний раз редактировалось YVitaliy, 05.11.2012 в 20:55.
Ответить с цитированием
Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение:
sorockinalex (06.11.2012)
  #6  
Старый 06.11.2012, 07:51
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Код:
MenuItems[i].OnClick:=FMain.MenuItemClick;
так тоже ошибку выдаёт, но только уже при выполнении операции...
Access violation at address ... Write of address...

А в тело цикла как раз не надо, так как последний открытый пункт и является активным..
Ответить с цитированием
  #7  
Старый 06.11.2012, 07:57
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

опа, блин... понял... я думал после цикла последнее значение в переменной i остаётся... Почему оно не остаётся в переменной i???
Ответить с цитированием
  #8  
Старый 06.11.2012, 08:04
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от sorockinalex
А в тело цикла как раз не надо, так как последний открытый пункт и является активным..
После выполнения цикла for значение переменной-счётчика (здесь это "i") неопределено. Поэтому раз эту строчку не надо в цикл, то и нельзя в ней использовать непроинициализированную переменную "i". Используй вместо "i" например "MenuItemsCount-1".
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
sorockinalex (06.11.2012)
  #9  
Старый 06.11.2012, 08:09
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от sorockinalex
опа, блин... понял... я думал после цикла последнее значение в переменной i остаётся... Почему оно не остаётся в переменной i???
Вот из справки Delphi по поводу for:
Цитата:
After the for statement terminates, the value of counter is undefined.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
sorockinalex (06.11.2012)
  #10  
Старый 06.11.2012, 10:18
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

блин, так оно и есть, цикл от 1 до 2, например, а после цикла i=3, отсюда и ошибка всплывала... так и сделал (MenuItemsCount-1) вместо i
Ответить с цитированием
  #11  
Старый 06.11.2012, 18:04
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Забыл сказать спасибо всем! Огромное!
Ответить с цитированием
  #12  
Старый 15.11.2012, 20:33
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Ребят, опять аналогичная ошибка. не пойму опять...
Вторая форма в 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  
Старый 15.11.2012, 20:38
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Self.AddButtonClick; тоже пробовал - компилится, но при нажатии выдаёт Access Violation...
Ответить с цитированием
  #14  
Старый 15.11.2012, 20:48
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

блин, во я невнимательный... увеличиваю размер массива, а новый элемент TEdit не создаю... спать пора )) извиняюсь, кто потратил своё время )
Ответить с цитированием
  #15  
Старый 28.11.2012, 22:25
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Ребят, опять не догоняю... Есть процедура, 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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:46.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter