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