Помощь - Поиск - Пользователи - Календарь
Полная версия: динамическое создание меню
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
тишина
помогите описать динамическое создание меню, кнопки, панели получаются, меню так же прописываю, а оно не отображается, вот кусок из процедуры FormCreat:

Код
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
kol:=15;
Caption:='Игра';
Color:=$00FC1B01;
BorderStyle:=bsSingle;
ClientWidth := CW*((kol div 4)+1);
ClientHeight := CH*8;
Menu:=MainMenu1;
MainMenu1:=TMainMenu.Create(Form1);
with MainMenu1 do begin
   Left:= 10; \\вот это вроде в свойствах меню нет, но надо же как-то
   Top:= 10; \\ задавать, где оно должно находиться  :huh:
   Parent:=Form1;
   ParentBiDiMode:=True;
   Exit:=TMenuItem.Create(Form1.MainMenu1);
    with Exit do begin
       OnClick:=FormExit;
       Caption:='Выход';
   end;
     Spravka:=TMenuItem.Create(Form1.MainMenu1.Items);
     with Spravka do begin
       Caption:='Справка';
     About:=TMenuItem.Create(Spravka);
     with About do begin
       OnClick:=PrgAbout;
       Caption:='О программе';
     end;
     Rules:=TMenuItem.Create(Spravka);
     with Rules do begin
       OnClick:=GameRules;
       Caption:='Правила';
       end; end; end;


Тегами для подсветки кода пользуйтесь
Digitalator
Смею пердположить что шаманить над формой в FormCreate слишком рано. может попробовать onActivate ?
тишина
предположение неверно, моя программа отлично работает, несмотря, что все нужные элементы создаются динамически, единственная проблема-это меню, мой препод сам ничё толком объяснить не может и если с другими элементами я легко разобралась, то с меню какая-то заморочка, это последний шаг к моей пятерке по экзамену! ОБЪЯСНИТЕ, ЧТО ДЕЛАТЬ С МЕНЮ!!!
Digitalator
Цитата
вот это вроде в свойствах меню нет, но надо же как-то
   Top:= 10; \\ задавать, где оно должно находиться  huh.gif


а вот чего там нет - того нет. Насколько помню меню автоматически ставиться в верх формы, и не надо ничего там устанавливать. и потом
Цитата
MainMenu1:=TMainMenu.Create(Form1);

Если объект меню уже выставлен на форму (с помощью визуального редактора), то он уже создан, зачем это делать повторно?

может быть это поможет разобраться
Код

procedure additem(owner:TMenuItem; caption:string);
 var item:TMenuItem;
 begin
 item := TMenuItem.Create(owner);
 item.Caption:=caption;
 owner.Add(item);
 end;

........

additem(MainMenu1.Items,'Menu item');
additem(MainMenu1.Items[0],'Sub item');
additem(MainMenu1.Items[0].Items[0],'Sub Sub item');


PS: А предположение действительно неверно )
тишина
в том-то и дело! надо обходится без визуального редактора, на этапе конструирования на форме ничего не должно находится, всё создаётся при запуске программы, с визуальным я бы уже давно всё сделала, чё там делать-то, но вот про динамическое создание нигде особо информации не найдёшь, а ваш текст, пожалуйста, с комментариями
Digitalator
Цитата
в том-то и дело! надо обходится без визуального редактора

Это препод так сказал?? что за бред, делфи для того и делали чтоб быстро и удобно было.......

Вот код рабочего модуля с динамически созданным меню, все должно быть понятно
Код

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Menus;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}
procedure additem(owner:TMenuItem; caption:string);
var item:TMenuItem;
begin
item := TMenuItem.Create(owner);
item.Caption:=caption;
owner.Add(item);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Menu := TMainMenu.Create(Form1);
additem(Menu.Items,'Menu item 1');
additem(Menu.Items,'Menu item 2');
additem(Menu.Items,'Menu item 3');
additem(Menu.Items[0],'Sub item 1-1');
additem(Menu.Items[0],'Sub item 1-2');
additem(Menu.Items[1],'Sub item 2-1');
additem(Menu.Items[2],'Sub item 3-1');
additem(Menu.Items[0].Items[0],'Sub Sub item 1');
additem(Menu.Items[0].Items[0],'Sub Sub item 2');
end;

end.
тишина
а вот и не бред, в некоторых случаях никак нельзя обойтись без динамического создания, либо такой способ облегчает программирование, как ни странно, вот кстати в моём случае - это так, и предмет - Технология программирования, значит мы должны научиться пользоваться различными способами задания компонентов, а не только уметь картинки переставлять, вот
а ваш код работает?
к сожалению сейчас проверить не могу, пора спать, но он, как мне кажется, практически дублирует, то что у меня прописано, только несколько строчек выведено в отдельную процедуру, для сравнения создания мной других элементов с созданием меню приведу полностью процедуру FormCreat:

Код

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
kol:=15;
Caption:='Èãðà';
Color:=$00FC1B01;
BorderStyle:=bsSingle;
ClientWidth := CW*((kol div 4)+1);
ClientHeight := CH*8;
Menu:=MainMenu1;
MainMenu1:=TMainMenu.Create(Form1);
with MainMenu1 do begin
   Left:= 10;
   Top:= 10;
   Parent:=Form1;
   ParentBiDiMode:=True;
   Exit:=TMenuItem.Create(Menu.Items);
    with Exit do begin
       OnClick:=FormExit;
       Caption:='Âûõîä';
   end;
     Spravka:=TMenuItem.Create(Form1.MainMenu1.Items);
     with Spravka do begin
       Caption:='Ñïðàâêà';
     About:=TMenuItem.Create(Spravka);
     with About do begin
       OnClick:=PrgAbout;
       Caption:='Î ïðîãðàììå';
     end;
     Rules:=TMenuItem.Create(Spravka);
     with Rules do begin
       OnClick:=GameRules;
       Caption:='Ïðàâèëà';
       end; end; end;
v1:=TButton.Create(Form1);
with v1 do begin
    Font.Name:='Century Gothic';
    Font.Size:=9;
    Height:=30;
    Width:=75;
    Left:=5;
    Top:=CH*4+200;
    Caption:='15-øêè';
    Parent:=Form1;
    OnClick:=Button2Click; end;
v2:=TButton.Create(Form1);
with v2 do begin
    Font.Name:='Century Gothic';
    Font.Size:=9;
    Height:=30;
    Width:=75;
    Left:=85;
    Top:=CH*4+200;
    Caption:='19-øêè';
    Parent:=Form1;
    OnClick:=Button3Click; end;
v3:=TButton.Create(Form1);
with v3 do begin
    Font.Name:='Century Gothic';
    Font.Size:=9;
    Height:=30;
    Width:=75;
    Left:=165;
    Top:=CH*4+200;
    Caption:='24-øêè';
    Parent:=Form1;
    OnClick:=Button4Click; end;
ng:=TButton.Create(Form1);
with ng do begin
    Font.Name:='Century Gothic';
    Font.Size:=12;
    Height:=30;
    Width:=235;
    Caption:='Íîâàÿ èãðà';
    Left:=5;
    Top:=CH*4+160;
    Parent:=Form1;
    OnClick:=Button1Click; end;
    kol:=15;
    For i:=1 to kol do begin
   pole[i]:=TButton.Create(Form1);
with pole[i] do  begin
   if i<=(kol div (4+n))+1 then begin
   Left:=(i-1)*CW;
   Top:=CH*0+CH; end
    else begin
   if i<=(kol div (4+n))*2+2 then begin
   Left:=(i-((kol div (4+n))+2))*CW;
   Top:=CH+CH; end
    else begin
   if i<=(kol div (4+n))*3+3 then begin
   Left:=(i-((kol div (4+n))*2+3))*CW;
   Top:=CH*2+CH; end
    else begin
   if i<=(kol div (4+n))*4+3+n then begin
   Left:=(i-((kol div (4+n))*3+4))*CW;
   Top:=CH*3+CH; end
    else begin
   if i<=(kol div (4+n))*5+4 then begin
   Left:=(i-((kol div (4+n))*4+3+n+n))*CW;
   Top:=CH*4+CH; end; end; end; end; end;
     Font.Name:='Century Gothic';
     Font.Size:=9;
     Cursor:=crDrag;
     Caption:=IntToStr(i);
     Width:=CW;
     Height:=CH;
     Parent:=Form1;
     OnDragDrop:=FormDragDrop;
     DragMode:=dmAutomatic;

 end; end;
  end;


напомню, что все кнопки работают, и располагаются на своих местах, потому я и теряюсь в догадках, что же происходит с меню, я предполагаю, что я неправильно прописываю именно элементы Items может там программные скобки где-то должны быть или наоборот - их не должно быть, или обычные (), или что-то ещё, о чём я не догадываюсь sad.gif

спасибо, за то что стараетесь, но пока по-моему продвижений нет sad.gif
тишина
на переменную Kol:=15 не обращайте внимания, это не константа, она на своём месте, и служит исправно, только я её зачем-то повторила перед созданием массива кнопок, забылась smile.gif
Digitalator
Цитата
спасибо, за то что стараетесь, но пока по-моему продвижений нет

я вам дал полностью работающий в Delphi 7 код. Разбираться в вашем не хочу да и не вижу смысла - там так напутано с With что черт ногу сломит. и еще ра говорю - если полей Left и Top в классе TMainMenu нет, то и нечего их прописывать.

Цитата
а вот и не бред, в некоторых случаях никак нельзя обойтись без динамического создания

В данном случае можно, и нужно - поэтому бред. Нельзя учиться програмировать на надуманных ситуациях. Все нужно использовать тогда когда это нужно, а не когда препод задал. ИМХО.

[ CLOSE TOPIC ]
:nnn:
тишина
во-первых делать не то,что задаёт препод, это умысленно терять шанс нам получение диплома, во-вторых ситуация в данном случае не надуманная, вы видели только одна процедуру, представления не имеете, что за программа и берётесь утверждать, что динамическое создание здесь лишнее, излишнее самомнение иногда вредит в жизни
volvo
Так, давайте-ка разборки в тематических разделах прекращать...
тишина, к Вам это относится в первую очередь !
тишина
Цитата(volvo @ 3.05.05 17:11)
Так, давайте-ка разборки в тематических разделах прекращать...
тишина, к Вам это относится в первую очередь !



ну вот, а я-то при чём? он первый начал упорно твердить, что, мол, бред и всё такое, модными словами кидаться, спасибо ему, конечно ему за помощь, но достаточно было сказать, что мне не хватает вот такой строчки Menu.Items.Add(Exit); а не разводить баталию, так что это не у меня проблемы в общении

Флейм удален. Закрыто...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.