![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
А все, сорри, разобрался - в самом меню в конструкторе поставил мануал хоткей...
|