![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Помогите пожалуйста разобраться с менюхами.
Есть 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
|
|||
|
|||
![]() во первых, если они у тебя в виде 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
|
|||
|
|||
![]() Спасибо большое, попробую таким способом.
В ini файл превращать не хотел - я как бы хочу сделать Windows версию одной проги которую можно запустить только под вин98 или под голым досом и поэтому хотел оставить полную совместимость с ее cfg файлами. И хотя в принципе конвертер написать вообще не проблема, хотел все равно оставить все как в оригинале. |
#4
|
|||
|
|||
![]() Работать с ini проще, чем писать свой парсер.
Но тут это не принципиально, просто сделай свою оболочку для тех функций, которые я использовал и все. |
#5
|
|||
|
|||
![]() Согласен что удобнее с ini, но свой парсер мне писать все равно придется для обработки загруженных модулей (которые будут грузиться из этих созданных пунктов меню), так что одним больше одним меньше...
![]() |
#6
|
|||
|
|||
![]() Ну, дело хозяйское. Хочешь - пиши.
Если с кодом создания разобрался - то вперед на баррикады. |
#7
|
|||
|
|||
![]() lmikle, спасибо, по твоему примеру сделал все как хотел - обрабатывает мой файл без проблем, но есть одна непонятка. Почему-то стринг после выбора меню возвращается в виде типа такого: пу&нкт1 или пункт&1... Можно это как-то убрать на стадии создания меню? Самое интересное что в самом меню символов хоткеев нет, а возвращается с ним...
|
#8
|
|||
|
|||
![]() А все, сорри, разобрался - в самом меню в конструкторе поставил мануал хоткей...
|