IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> динамическое создание меню
тишина
сообщение 2.05.2005 15:51
Сообщение #1





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


помогите описать динамическое создание меню, кнопки, панели получаются, меню так же прописываю, а оно не отображается, вот кусок из процедуры 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;


Тегами для подсветки кода пользуйтесь
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
Closed Topic Открыть новую тему 
Ответов(1 - 11)
Digitalator
сообщение 2.05.2005 20:39
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 247
Пол: Мужской

Репутация: -  1  +


Смею пердположить что шаманить над формой в FormCreate слишком рано. может попробовать onActivate ?


--------------------
In byte we trust
ICQ World.ru
mail[dog]digitalator[dot]com
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
тишина
сообщение 2.05.2005 20:47
Сообщение #3





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


предположение неверно, моя программа отлично работает, несмотря, что все нужные элементы создаются динамически, единственная проблема-это меню, мой препод сам ничё толком объяснить не может и если с другими элементами я легко разобралась, то с меню какая-то заморочка, это последний шаг к моей пятерке по экзамену! ОБЪЯСНИТЕ, ЧТО ДЕЛАТЬ С МЕНЮ!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Digitalator
сообщение 2.05.2005 20:52
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 247
Пол: Мужской

Репутация: -  1  +


Цитата
вот это вроде в свойствах меню нет, но надо же как-то
   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 - 2.05.2005 20:55


--------------------
In byte we trust
ICQ World.ru
mail[dog]digitalator[dot]com
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
тишина
сообщение 2.05.2005 20:57
Сообщение #5





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


в том-то и дело! надо обходится без визуального редактора, на этапе конструирования на форме ничего не должно находится, всё создаётся при запуске программы, с визуальным я бы уже давно всё сделала, чё там делать-то, но вот про динамическое создание нигде особо информации не найдёшь, а ваш текст, пожалуйста, с комментариями
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Digitalator
сообщение 2.05.2005 21:11
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 247
Пол: Мужской

Репутация: -  1  +


Цитата
в том-то и дело! надо обходится без визуального редактора

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

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

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.


--------------------
In byte we trust
ICQ World.ru
mail[dog]digitalator[dot]com
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
тишина
сообщение 2.05.2005 21:26
Сообщение #7





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


а вот и не бред, в некоторых случаях никак нельзя обойтись без динамического создания, либо такой способ облегчает программирование, как ни странно, вот кстати в моём случае - это так, и предмет - Технология программирования, значит мы должны научиться пользоваться различными способами задания компонентов, а не только уметь картинки переставлять, вот
а ваш код работает?
к сожалению сейчас проверить не могу, пора спать, но он, как мне кажется, практически дублирует, то что у меня прописано, только несколько строчек выведено в отдельную процедуру, для сравнения создания мной других элементов с созданием меню приведу полностью процедуру 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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
тишина
сообщение 2.05.2005 21:30
Сообщение #8





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


на переменную Kol:=15 не обращайте внимания, это не константа, она на своём месте, и служит исправно, только я её зачем-то повторила перед созданием массива кнопок, забылась smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Digitalator
сообщение 2.05.2005 21:36
Сообщение #9


Бывалый
***

Группа: Пользователи
Сообщений: 247
Пол: Мужской

Репутация: -  1  +


Цитата
спасибо, за то что стараетесь, но пока по-моему продвижений нет

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

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

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

[ CLOSE TOPIC ]
:nnn:


--------------------
In byte we trust
ICQ World.ru
mail[dog]digitalator[dot]com
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
тишина
сообщение 3.05.2005 16:05
Сообщение #10





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


во-первых делать не то,что задаёт препод, это умысленно терять шанс нам получение диплома, во-вторых ситуация в данном случае не надуманная, вы видели только одна процедуру, представления не имеете, что за программа и берётесь утверждать, что динамическое создание здесь лишнее, излишнее самомнение иногда вредит в жизни
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.05.2005 16:11
Сообщение #11


Гость






Так, давайте-ка разборки в тематических разделах прекращать...
тишина, к Вам это относится в первую очередь !
 К началу страницы 
+ Ответить 
тишина
сообщение 3.05.2005 16:58
Сообщение #12





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


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



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

Флейм удален. Закрыто...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Closed Topic Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 9.07.2025 18:48
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"