Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.11.2010, 10:39
vikk vikk вне форума
Начинающий
 
Регистрация: 01.10.2010
Сообщения: 132
Репутация: 10
По умолчанию Как сохранить в cxPropertiesStore элемент PopupMenu, создаваемый в runtime?

Помогите разобраться, плиииизз!!!
В процессе работы программы в контекстное меню то добавляется то удаляется пункт и его подпункты. Надо сохранить состояние меню при выходе из формы. Для сторинга использую cxPropertiesStore. Пыталась добавлять в хранилку компонент простым InsertComponent(При появлении в меню пункта и подпунктов), а удалять, соответственно, посредством RemoveComponent при удалении пункта и подпунктов. Не ест!!! - При выходе из программы выдаёт исключение. Что я делаю не так?
Ответить с цитированием
  #2  
Старый 11.11.2010, 23:21
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Не думаю, что 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  
Старый 12.11.2010, 09:57
vikk vikk вне форума
Начинающий
 
Регистрация: 01.10.2010
Сообщения: 132
Репутация: 10
По умолчанию

В очередной раз - большое спасибо! Правда, не всё понятно в коде, но буду разбираться. А то, что процедура SaveMenu вызывает сама себя - это не ошибка? И ещё : 'helper for' в определении класса - это синтаксис или комментарий?
Ответить с цитированием
  #4  
Старый 12.11.2010, 12:29
vikk vikk вне форума
Начинающий
 
Регистрация: 01.10.2010
Сообщения: 132
Репутация: 10
По умолчанию

вот ещё возник вопрос по поводу меню, вроде можно его прям сюда, поскольку родственный: как вообще можно перебирать все пункты меню(ну, типа цикла, штоль), если у TPopupMenu нет свойства(или оно как-то от меня скрывается всё время ), определяющего количество его пунктов? Научите, будьте добры!!!
Ответить с цитированием
  #5  
Старый 12.11.2010, 12:42
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Вызов самого себя - это не ошибка. Это называется рекурсия именно для перебора всех пунктов меню с любым уровнем вложенности она и сделана. Вы запустите в отладке и пошагово выполняйте - станет понятнее.
Что касается хэлпера, то это фишка дельфи которая позволяет несколько улучшить существующий класс, без создания наследника. В примере я добавляю новый метод для извлечения сразу ключа и значения из секции ини-файла.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 13.11.2010, 09:42
vikk vikk вне форума
Начинающий
 
Регистрация: 01.10.2010
Сообщения: 132
Репутация: 10
По умолчанию

Ага, теперь прояснилось, спасибо. Было у меня подозрение, что это рекурсия, но как-то умом прошлась по алгоритму и запуталась
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:41.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025