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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.07.2008, 13:14
JIexa21 JIexa21 вне форума
Прохожий
 
Регистрация: 23.07.2008
Адрес: Россия, Новочебоксарск
Сообщения: 15
Репутация: 10
По умолчанию Помогите пожалуйста с хитрым меню

Помогите пожалуйста разобраться с менюхами.
Есть ini файл приблизительно такого содержания:
group=Группа 1
пункт1=файл1
пункт2=файл2
пункт3=файл3

group2=Группа2
пункт4=файл4
пункт5=файл5
и т.д.
Т.е. заголовок группы должно быть меню со стрелкой, а там должны быть списки с пунктами при выборе которых возвращается нужное значение. Пока вот что написал, но че делать дальше не представляю - при создании сабменю какие-то ошибки выходят и не понятно как вытащить данные о выборе...
Код:
Procedure TfmMain.InitChipMenu();
var
i,posit,len:integer;
str,str2:string;

begin

  OOptions := TStringList.create;
  OOptions.LoadFromFile(ExtractFilePath(Application.ExeName)+'options.cfg');

  for i:= 0 to OOptions.Count - 1 do begin

    str := OOptions.Strings [i]	;
    if pos(';',str)=0 then begin

    len := Length(str);
      posit := pos('GROUP=',str);
      if posit > 0 then begin
        str2 :=copy(str,7,len-posit);
        chip1.Add(NewItem(str2,0,False,True,MenuItem1Click,0,'MenuItem1'));
         //chip1.Add(NewSubMenu(str2,0,str2,ai,true));
      end;
    end;
  end;
end;

Найденные примеры в сети и на этом сайте ограничиваются стандартным набором. Тут набор пунктов заранее может быть не известным.
Ответить с цитированием
  #2  
Старый 25.07.2008, 18:15
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

во первых, если они у тебя в виде ini-файла, так и читай их с помощью ini-файла. Только группы переделай на соотв. формат.
должно быть типа такого:

Код:
[group1]
name=Группа 1
File1=disk:\path\filename1
File2=disk:\path\filename2
File3=disk:\path\filename3

[group2]
name=Группа 2
File1=disk:\path\filename1
File2=disk:\path\filename2
File3=disk:\path\filename3

Код разбора:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  Ini : TIniFile;
  Sec : TStringList;
  Items : TStringList;
  I, J : Integer;
  TopMenuItem, MenuItem : TMenuItem;
begin
  Ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'menu.cfg');

  Sec := TStringList.Create;
  Ini.ReadSections(Sec);

  For I := 0 To Sec.Count-1 Do
    Begin
      Items := TStringList.Create;
      Ini.ReadSection(Sec[i],Items);

      If Items.IndexOf('name') <> -1 Then
        Begin
          TopMenuItem := TMenuItem.Create(Self);
          TopMenuItem.Caption := Ini.ReadString(Sec[i],'name','');
          miMenu.Add(TopMenuItem);

          For J := 0 To Items.Count-1 Do
            Begin
              If Items[J] = 'name' Then Continue;
              MenuItem := TMenuItem.Create(Self);
              MenuItem.Caption := Ini.ReadString(Sec[i],Items[J],'');
              MenuItem.OnClick := MenuClick;
              TopMenuItem.Add(MenuItem);
            End;
        End;
      Items.Free;
    End;

  Sec.Free;
  Ini.Free;
end;

procedure TForm1.MenuClick(Sender: TObject);
begin
  If Sender Is TMenuItem Then
    ShowMessage('Selected: ' + (Sender As TMenuItem).Caption);
end;

Если хочется писать более осмысленные имена файлов, то заведи где-нить список, имена файлов пиши туда, а для меню ставь в свойство Tag индекс нужного элемента. Соответсвенно, в обработчике по индексу получаешь элемент и радуешься жизни.
Ответить с цитированием
  #3  
Старый 25.07.2008, 18:46
JIexa21 JIexa21 вне форума
Прохожий
 
Регистрация: 23.07.2008
Адрес: Россия, Новочебоксарск
Сообщения: 15
Репутация: 10
По умолчанию

Спасибо большое, попробую таким способом.
В ini файл превращать не хотел - я как бы хочу сделать Windows версию одной проги которую можно запустить только под вин98 или под голым досом и поэтому хотел оставить полную совместимость с ее cfg файлами. И хотя в принципе конвертер написать вообще не проблема, хотел все равно оставить все как в оригинале.
Ответить с цитированием
  #4  
Старый 25.07.2008, 18:47
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Работать с ini проще, чем писать свой парсер.
Но тут это не принципиально, просто сделай свою оболочку для тех функций, которые я использовал и все.
Ответить с цитированием
  #5  
Старый 25.07.2008, 20:01
JIexa21 JIexa21 вне форума
Прохожий
 
Регистрация: 23.07.2008
Адрес: Россия, Новочебоксарск
Сообщения: 15
Репутация: 10
По умолчанию

Согласен что удобнее с ini, но свой парсер мне писать все равно придется для обработки загруженных модулей (которые будут грузиться из этих созданных пунктов меню), так что одним больше одним меньше...
Ответить с цитированием
  #6  
Старый 25.07.2008, 21:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, дело хозяйское. Хочешь - пиши.
Если с кодом создания разобрался - то вперед на баррикады.
Ответить с цитированием
  #7  
Старый 29.07.2008, 00:53
JIexa21 JIexa21 вне форума
Прохожий
 
Регистрация: 23.07.2008
Адрес: Россия, Новочебоксарск
Сообщения: 15
Репутация: 10
По умолчанию

lmikle, спасибо, по твоему примеру сделал все как хотел - обрабатывает мой файл без проблем, но есть одна непонятка. Почему-то стринг после выбора меню возвращается в виде типа такого: пу&нкт1 или пункт&1... Можно это как-то убрать на стадии создания меню? Самое интересное что в самом меню символов хоткеев нет, а возвращается с ним...
Ответить с цитированием
  #8  
Старый 29.07.2008, 01:06
JIexa21 JIexa21 вне форума
Прохожий
 
Регистрация: 23.07.2008
Адрес: Россия, Новочебоксарск
Сообщения: 15
Репутация: 10
По умолчанию

А все, сорри, разобрался - в самом меню в конструкторе поставил мануал хоткей...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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