Приветствую народ.1)Хочу спросить,допустим я создаю динамический объект- подпункт пункта меню и я хочу чтобы он там был все время,при каждом запуске проги. 2) еще вот есть main menu в нем пункты (items) в этих пунктах еще есть ответвления (стрелочка еще там есть).вот как их динамически создавать?
можно,кривым путем будет запись конфига в файл,при ините проги считывание и динамическое создание,но это кривое решение.и 2 вопрос мне тоже важен.
Только уничтожать в конце не забывай Code: var item, item2:TMenuItem; begin item:=TMenuItem.Create(nil);//пункт меню item.Name:='aaa'; item.Caption:='bbb'; item2:=TMenuItem.Create(nil);//пункт подменю item2.Name:='aaaaaaaaaaaaaa'; item2.Caption:='cccc'; //добавим подменю item.Add(item2); //добавим в меню pm1.Items.Add(item); end;
я не совсем понимаю зачем динамически создавать что-то, чтобы оно ВСЕГДА там было? не проще ли создать при дизайне еще? а, к стати, а события ты как собираешься вешать на динамически созданные пункты меню? т.е. если ты их, допустим, из ининшника подгрузишь, а событий ты таких при разработке не учитывал... в общем непонятно зачем тебе это нужно и что ты хочешь получить отсюда
Ну почему же сразу кривой путь? Большинство программ именно так и работают. (в частности мультиязычность многих так пашет) Самый лучший способ для этого: древние функции WritePrivateProfileString/GetPrivateProfileString для работы с ini файлами. Конечно MS не рекомендует её и говорит типа она устаревшая и лучше юзать реестр, но бывают случае когда лучше использовать их чем что-то мудрить с реестром. Главное не забывать о том, что для создания ini файла надо иметь права на запись в папку при любых правах пользователя. По этому лучше всего подойдет папка APPDATA
нет,смотри какая постанова: допустим юзверу не хватает какого то дополнения в проге,например хекс редактора ...ну ты понел,я предоставляю юзверу самому возможность настроить все через интерфейс моей программы,а в дальнейшем юзать для автоматических рутинных дейстивий,думаю понятно описал.то-есть он там выбрал какую нить тулзу ,настроил то-се,в менюшку добавился пунктик,и все спокойно юзается,ну и надо уже чтоб пунктик был до тех пор пока юзверь сам не соизволит стереть его.
ну я думал что кривой... учту.А вообще я думал делать все тупо в куче,бо по-моему с секциями чуток парится надо.То есть тупо считал какуюто зарезервированную строку,сравнил и при совпадении вызвал процедуру динамического создания, как то так представляется...
у IniFile есть метод ReadSection, который всю секцию читает в стринглист ну а со стринглистом думаю разберешься т.е. допустим создал секцию [PopupMenu] сделал Ini.readsection('PopupMenu',MenuList); и теперь по списку пробегайся и вызывай свою процедуру динамического создания меню итемов
т.е. ты намекаешь на то, что после создания можно забывать о созданном объекте? Насколько мне известно правилом хорошего тона является _самому_уничтожать_созданные_объекты, даже если хозяином указан Applicaton (т.е. вроде как при выходе из программы она сама за собой все почистит)
2DooD Не страдай херней . Иной реализации твоего примера нигде не встречал. Через ini все прекрасно программируется, да и вообще эти файлы и были созданы для того, чтобы запоминать настройки и параметры программ. Покури само устройство файлов. Там нет нифига сложного (Section - раздел файла, Ident - ключ этого раздела, Value - значение ключа). Для работы имеются методы записи/чтения (WriteString/ReadString etc).
все же не получается добавить подменю. в пункт меню добавляю подменю так : Code: var new, toi: Tmenuitem; begin toi := form1.mainmenu1.items[2]; \\ в 3-й пункт new := tmenuitem.create(toi); \\создаем new.caption := edit1.Text; \\ название из эдита new.onclick := ???; \\ тут будет какоето событие toi.insert(toi.count, new); \\добавляем получается добавляется запись из эдита,а мне еще нужно чтобы по наведению на эту запись было еще подменю,записи в которое добавляются из динамически созданных эдитов,как разобраться из какого эдита (их там 4-5 допустим) идет запись я так и не понял. динамически эдиты создаю так: Code: begin for i:=1 to 5 do begin E:=TEdit.Create(Self); E.Parent:=Form7; E.Left:=280; походу надо юзать массив компонент upd да с массивом компонент вышло.1-й пункт актуален.
Нафик массив компонент то???? Вот так: Code: TButton(FindComponent('btn1')).Caption:='bbb'; можно работать с динамически созданными компонентами и обращатся к ним (набросал для кнопки, думаю для едита сам переделаешь) Писец, ЧУВАК, перед кем я распинался, что за хрень ты тут делаешь? НАДО ТАК: Code: toi:=TMenuItem.Create(nil); toi.Caption:='bbbbbbbbb'; [SIZE=4][COLOR=DarkRed]aa2[/COLOR][/SIZE].Add(toi); где aa2 - пункт меню, в который ты хочешь добавить подпункт
правилом хорошего тона есть: самому уничтожать то, что создал не полагаясь на автоматическое уничтожение.
2xophet, я проверил твой код же наверно,ога?и добавляет он подменю,а мне надо как бы подменю,подменю ща скрин сделаю что бы ты понял. а твой код создает лишь подпункт. з.ы.,а поиск компоненты для работы с ней это ваще жесть,не кажется ли тебе что заюзать индексы куда как более проще?
Code: toi:=TMenuItem.Create(nil); toi.name:='[COLOR=Red]aa3[/COLOR]'; toi.Caption:='bbbbbbbbb'; [COLOR=Red]aa2[/COLOR].Add(toi); toi:=TMenuItem.Create(nil); toi.name:='[COLOR=Red]aa4[/COLOR]'; toi.Caption:='bbbbbbbbb'; [COLOR=Red]aa3[/COLOR].Add(toi); ну и по аналогии дальше думаю поймешь как хоть до 50-го уровня вложенности P.S. на счет индексов ты имел в виду создать массив с сылками на твои компоненты, и через него обращаться к компонентам? да ну нафик. Заводить отдельный массив, тратить память, ради чего? можно конечно через Components, но тебе все равно прийдется смотреть имя и тип компонента, что вряд ли получится быстрее, чем FindComponent.
смотри,есть например 20 эдитов созданных динамически,записи содержат например 2,5,7 проще обратиться через индекс типа: a:array[1..20]of Tedit; ...some code a[2].text:=s; a[5].text:=s1; и т.д з.ы. опробую твой код.