динамические объекты delphi

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DooD, 15 Aug 2011.

  1. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    Приветствую народ.1)Хочу спросить,допустим я создаю динамический объект- подпункт пункта меню и я хочу чтобы он там был все время,при каждом запуске проги.
    2) еще вот есть main menu в нем пункты (items) в этих пунктах еще есть ответвления (стрелочка еще там есть).вот как их динамически создавать?
     
  2. Nikitosavich

    Nikitosavich New Member

    Joined:
    14 Mar 2011
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    DooD, по ходу никак [​IMG]
     
  3. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    можно,кривым путем будет запись конфига в файл,при ините проги считывание и динамическое создание,но это кривое решение.и 2 вопрос мне тоже важен.
     
  4. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Только уничтожать в конце не забывай

    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;
     
    #4 xophet, 15 Aug 2011
    Last edited: 15 Aug 2011
  5. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    ок попробую,что на счет 1-го вопроса?мой метод куёвый
     
  6. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    я не совсем понимаю зачем динамически создавать что-то, чтобы оно ВСЕГДА там было?
    не проще ли создать при дизайне еще?
    а, к стати, а события ты как собираешься вешать на динамически созданные пункты меню?
    т.е. если ты их, допустим, из ининшника подгрузишь, а событий ты таких при разработке не учитывал...

    в общем непонятно зачем тебе это нужно и что ты хочешь получить отсюда
     
    #6 xophet, 15 Aug 2011
    Last edited: 15 Aug 2011
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Ну почему же сразу кривой путь? Большинство программ именно так и работают. (в частности мультиязычность многих так пашет)
    Самый лучший способ для этого: древние функции WritePrivateProfileString/GetPrivateProfileString для работы с ini файлами.

    Конечно MS не рекомендует её и говорит типа она устаревшая и лучше юзать реестр, но бывают случае когда лучше использовать их чем что-то мудрить с реестром. Главное не забывать о том, что для создания ini файла надо иметь права на запись в папку при любых правах пользователя. По этому лучше всего подойдет папка APPDATA
     
  8. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    нет,смотри какая постанова: допустим юзверу не хватает какого то дополнения в проге,например хекс редактора ...ну ты понел,я предоставляю юзверу самому возможность настроить все через интерфейс моей программы,а в дальнейшем юзать для автоматических рутинных дейстивий,думаю понятно описал.то-есть он там выбрал какую нить тулзу ,настроил то-се,в менюшку добавился пунктик,и все спокойно юзается,ну и надо уже чтоб пунктик был до тех пор пока юзверь сам не соизволит стереть его.
     
  9. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    а, ага, въехал.
    так тогда используй инишник.
     
  10. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    ну я думал что кривой:)...

    учту.А вообще я думал делать все тупо в куче,бо по-моему с секциями чуток парится надо.То есть тупо считал какуюто зарезервированную строку,сравнил и при совпадении вызвал процедуру динамического создания, как то так представляется...
     
  11. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    у IniFile есть метод ReadSection, который всю секцию читает в стринглист
    ну а со стринглистом думаю разберешься :)

    т.е. допустим создал секцию
    [PopupMenu]
    сделал Ini.readsection('PopupMenu',MenuList);
    и теперь по списку пробегайся и вызывай свою процедуру динамического создания меню итемов
     
  12. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    т.е. ты намекаешь на то, что после создания можно забывать о созданном объекте? :D :D :D
    Насколько мне известно правилом хорошего тона является _самому_уничтожать_созданные_объекты, даже если хозяином указан Applicaton (т.е. вроде как при выходе из программы она сама за собой все почистит)
     
    1 person likes this.
  13. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    2DooD
    Не страдай херней ;). Иной реализации твоего примера нигде не встречал. Через ini все прекрасно программируется, да и вообще эти файлы и были созданы для того, чтобы запоминать настройки и параметры программ. Покури само устройство файлов. Там нет нифига сложного (Section - раздел файла, Ident - ключ этого раздела, Value - значение ключа). Для работы имеются методы записи/чтения (WriteString/ReadString etc).
     
  14. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    все же не получается добавить подменю.
    в пункт меню добавляю подменю так :
    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-й пункт актуален.
     
    #14 DooD, 17 Aug 2011
    Last edited: 17 Aug 2011
  15. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Нафик массив компонент то????
    Вот так:
    Code:
    TButton(FindComponent('btn1')).Caption:='bbb';
    можно работать с динамически созданными компонентами и обращатся к ним (набросал для кнопки, думаю для едита сам переделаешь)


    Писец, ЧУВАК, перед кем я распинался, что за хрень ты тут делаешь?
    НАДО ТАК:
    Code:
     toi:=TMenuItem.Create(nil);
      toi.Caption:='bbbbbbbbb';
      [SIZE=4][COLOR=DarkRed]aa2[/COLOR][/SIZE].Add(toi);
    где aa2 - пункт меню, в который ты хочешь добавить подпункт
     
    #15 xophet, 17 Aug 2011
    Last edited: 17 Aug 2011
  16. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    правилом хорошего тона есть: самому уничтожать то, что создал не полагаясь на автоматическое уничтожение.
     
    #16 xophet, 17 Aug 2011
    Last edited: 17 Aug 2011
  17. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    2xophet, я проверил твой код же наверно,ога?и добавляет он подменю,а мне надо как бы подменю,подменю :D ща скрин сделаю что бы ты понял.
    [​IMG]
    а твой код создает лишь подпункт.
    з.ы.,а поиск компоненты для работы с ней это ваще жесть,не кажется ли тебе что заюзать индексы куда как более проще?
     
  18. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5

    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.
     
  19. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    смотри,есть например 20 эдитов созданных динамически,записи содержат например 2,5,7
    проще обратиться через индекс типа:
    a:array[1..20]of Tedit;
    ...some code
    a[2].text:=s;
    a[5].text:=s1; и т.д
    з.ы. опробую твой код.
     
  20. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    ёмана все оказалось невероятно просто!
    2xophet не помог твой код кстати
     
    #20 DooD, 17 Aug 2011
    Last edited: 17 Aug 2011