![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Ага, теперь прояснилось, спасибо. Было у меня подозрение, что это рекурсия, но как-то умом прошлась по алгоритму и запуталась
![]() |