Программное добавление TMenuItem

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Программное добавление TMenuItem

Сообщение devICE » 13.04.2010 10:59:03

Lazarus: 0.9.29.24591
FPC: 2.4.1

Появилась необходимость добавить пункт в меню. Пишу следующий код:
Код: Выделить всё
function GetReportsList(sqltrans:TSQLTransaction;sqlquery:TSQLQuery):fields;
var
   sl:TStringList;
  ItemName:string;
begin
   if not sqltrans.Active then
       sqltrans.StartTransaction;
   sqlquery.SQL.Text:='select p.* from "GetReportsList" p';
   sqlquery.Open;
   sl:=TStringList.Create;
   while not sqlquery.EOF do
   begin
      ItemName:=sqlquery.FieldByName('ReportName').Text;
      sl.Add(ItemName);
    sqlquery.Next;
   end;
   sqlquery.Close;
   sqltrans.Commit;
   GetReportsList:=sl;
   sl.Free;
end;
Эта функция формирует StringList с наименованиями отчетов.

Код: Выделить всё
procedure TfmMain.SelectReport(Sender: TObject);
var
   mi: TMenuItem;
  ReportName: string;
begin
   mi:=Sender as TMenuItem;
  ReportName:=mi.Caption;
  ureports.CreateReport(fbtrans,fbquery,ReportName);
  ureports.ShowReport(fmPreview.htmlPreview);
  fmPreview.ShowModal;
end;
Эта процедура будущая отработка события OnClick нового пункта меню.

Код: Выделить всё
procedure TfmMain.ReportList(MenuItem:TMenuItem);
var
   mi: TMenuItem;
  sl: TStringList;
  i: integer;
begin
   sl:=TStringList.Create;
  sl:=ureports.GetReportsList(fbtrans,fbquery);
  for i:=0 to sl.Count-1 do
  begin
     mi:=TMenuItem.Create(MenuItem);
    try
       mi.Caption:=sl.Strings[i];
      //mi.OnClick:=SelectReport;
      MenuItem.Add(mi);
    finally
       mi.Free;
    end;
  end;
  sl.Free;
end;
А эта процедура уже формирует нужный мне список новых пунктов меню.

Возникли следующие вопросы:
1. Закомментированная строка //mi.OnClick:=SelectReport; выдает ошибку Hint: Found declaration: TfmMain.SelectReport(TObject);.
2. При подключении к базе программа валится с ошибкой на External: SIGSEGV.

Искал в гугле по запросу "Добавление MenuItem в Lazarus", дельного ничего не нашел.
Аватара пользователя
devICE
новенький
 
Сообщения: 14
Зарегистрирован: 20.02.2010 20:24:05

Re: Программное добавление TMenuItem

Сообщение скалогрыз » 13.04.2010 11:23:32

попробуй так:
Код: Выделить всё
procedure TfmMain.ReportList(MenuItem:TMenuItem);
var
   mi: TMenuItem;
  sl: TStringList;
  i: integer;
begin
  sl:=TStringList.Create;
  sl.Add('test1');
  sl.Add('test2');
  sl.Add('test3');
  for i:=0 to sl.Count-1 do
  begin
    mi:=TMenuItem.Create(MenuItem);
    mi.Caption:=sl.Strings[i];
    mi.OnClick:=@SelectReport;
    MenuItem.Add(mi);
  end;
  sl.Free;
end;


как у тебя с ООП?

код вроде:
Код: Выделить всё
function GetReportsList(sqltrans:TSQLTransaction;sqlquery:TSQLQuery):fields;
var
   sl:TStringList;
begin
   sl:=TStringList.Create;
   ...
   GetReportsList:=sl;
   sl.Free;
end;

доставляет :)

Добавлено спустя 4 минуты 58 секунд:
а... чёрт с ним... воть!
Код: Выделить всё
function GetReportsList(sqltrans:TSQLTransaction;sqlquery:TSQLQuery):TStringList;
var
  sl       : TStringList;
  ItemName : string;
begin
  if not sqltrans.Active then
    sqltrans.StartTransaction;
  sqlquery.SQL.Text:='select p.* from "GetReportsList" p';
  sqlquery.Open;
  sl:=TStringList.Create;
  while not sqlquery.EOF do
  begin
    ItemName:=sqlquery.FieldByName('ReportName').Text;
    sl.Add(ItemName);
    sqlquery.Next;
  end;
  sqlquery.Close;
  sqltrans.Commit;
  GetReportsList:=sl;
end;


procedure TfmMain.SelectReport(Sender: TObject);
var
   mi: TMenuItem;
  ReportName: string;
begin
   mi:=Sender as TMenuItem;
  ReportName:=mi.Caption;
  ureports.CreateReport(fbtrans,fbquery,ReportName);
  ureports.ShowReport(fmPreview.htmlPreview);
  fmPreview.ShowModal;
end;

procedure TfmMain.ReportList(MenuItem:TMenuItem);
var
  mi : TMenuItem;
  sl : TStringList;
  i  : integer;
begin
  sl:=ureports.GetReportsList(fbtrans,fbquery);
  try
    for i:=0 to sl.Count-1 do begin
      mi:=TMenuItem.Create(MenuItem);
      mi.Caption:=sl.Strings[i];
      mi.OnClick:=@SelectReport;
      MenuItem.Add(mi);
    end;
  finally
    sl.Free;
  end;
end;
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Программное добавление TMenuItem

Сообщение devICE » 13.04.2010 15:10:12

Благодарю ))) Обновил параллельно лазаря, так что в целом все заработало.
Аватара пользователя
devICE
новенький
 
Сообщения: 14
Зарегистрирован: 20.02.2010 20:24:05

Re: Программное добавление TMenuItem

Сообщение blacksirius » 23.04.2010 03:55:58

решил не создавать новую тему а задать вопрос тут.
как возможно определить индекс выбранного пункта меню, если все меню создано через код? есть же параметры манипулирование меню через индексы
Аватара пользователя
blacksirius
новенький
 
Сообщения: 16
Зарегистрирован: 18.04.2010 18:43:49
Откуда: UA, Николаев

Re: Программное добавление TMenuItem

Сообщение grigoreo » 23.04.2010 10:58:06

blacksirius писал(а):решил не создавать новую тему а задать вопрос тут.
как возможно определить индекс выбранного пункта меню, если все меню создано через код? есть же параметры манипулирование меню через индексы


ну так в событии OnClick есть параметр Sender, указатель на экземпляр который ты нажал а у него есть порядковый номер в меню есть капция есть наконец имя если ты конечно когда создавал все это конструктору подсовывал))
Аватара пользователя
grigoreo
постоялец
 
Сообщения: 195
Зарегистрирован: 10.03.2009 15:43:43
Откуда: С нашей Раши

Re: Программное добавление TMenuItem

Сообщение blacksirius » 23.04.2010 12:19:05

можете показать экземпляр кода как извлечь его индекс

Добавлено спустя 1 час 45 минут 55 секунд:
уже разобрался
Аватара пользователя
blacksirius
новенький
 
Сообщения: 16
Зарегистрирован: 18.04.2010 18:43:49
Откуда: UA, Николаев


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 39

Рейтинг@Mail.ru