![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Помогите разобраться, плиииизз!!!
В процессе работы программы в контекстное меню то добавляется то удаляется пункт и его подпункты. Надо сохранить состояние меню при выходе из формы. Для сторинга использую cxPropertiesStore. Пыталась добавлять в хранилку компонент простым InsertComponent(При появлении в меню пункта и подпунктов), а удалять, соответственно, посредством RemoveComponent при удалении пункта и подпунктов. Не ест!!! - При выходе из программы выдаёт исключение. Что я делаю не так? |
#2
|
||||
|
||||
![]() Не думаю, что cxPropertiesStore имеет смысл использовать для данной задачи. Насколько я понял, основное его применение сохранить/загрузить свойства для статических элементов - например форма настроек программы. Я так и использовал. А вот для динамического списка с произвольной вложенностью элементов похоже он уж не катит. Вот так можно все это дело замутить:
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, IniFiles, ExtCtrls; type TForm1 = class(TForm) PopupMenu1: TPopupMenu; N31: TMenuItem; N21: TMenuItem; N11: TMenuItem; N311: TMenuItem; N321: TMenuItem; N3111: TMenuItem; PopupMenu2: TPopupMenu; Panel1: TPanel; procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end; TSectionIniFile = array of record Key,Value: String end; THelperIniFile = class helper for TIniFile function ReadSectionIdentsAndValues(const Section: string): TSectionIniFile; end; var Form1: TForm1; implementation {$R *.dfm} function THelperIniFile.ReadSectionIdentsAndValues(const Section: string): TSectionIniFile; Var Strings: TStringList; i: Integer; begin Strings := TStringList.Create; ReadSectionValues(Section, Strings); SetLength(Result,Strings.Count); for i := 0 to Length(Result)-1 do begin Result[i].Key := Copy(Strings[i],1,Pos('=',Strings[i])-1); Result[i].Value := Copy(Strings[i],Pos('=',Strings[i])+1); end; end; procedure SaveMenu(IniFile: TIniFile; Item: TMenuItem; Section: String); Var i: Integer; begin for i := 0 to Item.Count - 1 do begin if Item[i].Count > 0 then SaveMenu(IniFile, Item[i], Item[i].Caption); IniFile.WriteString(Section,IntToStr(i),Item[i].Caption); end; end; procedure LoadMenu(IniFile: TIniFile; Item: TMenuItem; Section: String); Var i: Integer; MenuItem: TMenuItem; Items: TSectionIniFile; begin Items := IniFile.ReadSectionIdentsAndValues(Section); for i := 0 to Length(Items)- 1 do begin MenuItem := TMenuItem.Create(Item); MenuItem.Caption := Items[i].Value; Item.Add(MenuItem); LoadMenu(IniFile, MenuItem, Items[i].Value); end; end; procedure TForm1.FormActivate(Sender: TObject); Var IniFile: TIniFile; begin IniFile := TIniFile.Create('contextmenu.ini'); //SaveMenu(IniFile, PopupMenu1.Items,'PopupMenu1'); LoadMenu(IniFile, PopupMenu2.Items,'PopupMenu1'); end; end. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
![]() В очередной раз - большое спасибо! Правда, не всё понятно в коде, но буду разбираться. А то, что процедура SaveMenu вызывает сама себя - это не ошибка? И ещё : 'helper for' в определении класса - это синтаксис или комментарий?
|
#4
|
|||
|
|||
![]() вот ещё возник вопрос по поводу меню, вроде можно его прям сюда, поскольку родственный: как вообще можно перебирать все пункты меню(ну, типа цикла, штоль), если у TPopupMenu нет свойства(или оно как-то от меня скрывается всё время
![]() |
#5
|
||||
|
||||
![]() Вызов самого себя - это не ошибка. Это называется рекурсия именно для перебора всех пунктов меню с любым уровнем вложенности она и сделана. Вы запустите в отладке и пошагово выполняйте - станет понятнее.
Что касается хэлпера, то это фишка дельфи которая позволяет несколько улучшить существующий класс, без создания наследника. В примере я добавляю новый метод для извлечения сразу ключа и значения из секции ини-файла. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
|||
|
|||
![]() Ага, теперь прояснилось, спасибо. Было у меня подозрение, что это рекурсия, но как-то умом прошлась по алгоритму и запуталась
![]() |