Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];

Вниз

Как в ран-тайме добавить в попап-меню расширенное меню?   Найти похожие ветки 

 
Volf_555   (2006-01-14 15:45) [0]

Как в ран-тайме добавить в попап-меню расширенное меню?

Использую следующий код, который добавляет в попам-меню одноранговое меню.

procedure TForm1.Button1Click(Sender: TObject);
var
s:Integer;
a,a1:String;
ares:TStringList;
q:Integer;

z:TMenuItem;
begin
Edit1.Text:="1\2\3";

z:=TMenuItem.Create(PopupMenu1);
ares:=TStringList.Create;
a:=edit1.Text;
a1:="";
for s:=1 to Length(a) do
begin
 if a[s]<>"\" then
  a1:=a1+a[s] else
 if a[s]="\" then
 begin
  ares.Add(a1);
  a1:="";
 end;
end;
ares.Add(a1);

for q:=0 to ares.Count-1 do
begin
 z.Add(NewItem(ares.Strings[q],0,false,false,NIL,0,"Item"+IntToStr(q)+IntToStr(ares.Count)+IntToStr(q div ares.count)));
end;
popupmenu1.Items.Add(z);
end;


Как мне добавить в попап-меню расширенное меню?
То есть:
1>2>3
пункт 2 - подпункт пункта 1
пункт 3 - подпункт пункта 2


 
ss2   (2006-01-14 23:22) [1]

var
i,ii: integer;
ares:TStringList;
procedure UM( P: TMenuItem);
var M: TMenuItem;
begin
Inc(i);
if i = ii+1 then exit;
M := TMenuItem.Create(Form1);
M.Caption := ares.Strings[i-1];
P.Add(M);
UM( M );
end;

procedure TForm1.Button8Click(Sender: TObject);
var
s:Integer;
a,a1:String;
q:Integer;
z:TMenuItem;
begin
Edit1.Text:="1\2\3\4\5\6\7\8\9";
ii:=0;
z:=TMenuItem.Create(PopupMenu1);
ares:=TStringList.Create;
a:=edit1.Text;
a1:="";
for s:=1 to Length(a) do
begin
if a[s]<>"\" then
 a1:=a1+a[s] else
if a[s]="\" then
begin
 ares.Add(a1);
 a1:="";
end;
end;
ares.Add(a1);

for q:=0 to ares.Count-1 do
begin
Inc(ii);
Caption:=IntToStr(ii);
//z.Add(NewItem(ares.Strings[q],0,false,false,NIL,0,"Item"+IntToStr(q)+IntToStr(ares.Count)+IntToStr(q div ares.count)));
end;
popupmenu1.Items.Add(z);
i:=0;
UM(z);
end;


 
Volf_555   (2006-01-15 17:35) [2]


> ss2   (14.01.06 23:22) [1]

Огромное спасибо! В упрощённом варианте всё ОК!
Следующая процедура работает неверно:
procedure TForm1.ModifyMenu;
var
s:TIniFile;
z,w:Integer;
a,a1,a2:TStringList;
itemsall:Integer;
prov,res:Integer;

provslesh:Integer;
sleshA1:String;
q:Integer;
zMI:TMenuItem;
begin
 s:=TIniFile.Create(ExtractFilePath(Application.ExeName)+"options.ini");
 zMI:=TMenuItem.Create(PopupMenu1);
for itemsall:=popupmenu1.Items.Count-3 downto 0 do
  popupmenu1.Items.Delete(itemsall);
 a:=TStringList.Create;
 a1:=TStringList.Create;
 a2:=TStringList.Create;

 ares:=TStringList.Create;

 try
 s.ReadSections(combobox1.Items);
 if combobox1.Items.Count>0 then
  combobox1.ItemIndex:=0;
  s.ReadSection(combobox1.Text,combobox2.Items);
  if combobox2.Items.Count>0 then
  begin
   combobox2.ItemIndex:=0;
   edit4.Text:=s.ReadString(combobox1.Text,combobox2.Text,"");
  end;
 except
 end;
 
 s.ReadSections(a); //s - содержит все секции INI-файла
 if a.Count<>0 then
 begin

  for z:=0 to a.Count-1 do //Цикл для секций
  begin
   s.ReadSection(a.Strings[z],a1); //a1 - содержит все параметры текущей секции
   cursec:=a.Strings[z]; //cursec - содержит значение текущей секции

   ares:=TStringList.Create;
   for provslesh:=1 to Length(cursec) do
   begin
   if cursec[provslesh]<>"\" then
    SleshA1:=SleshA1+cursec[provslesh] else
   if cursec[provslesh]="\" then
   begin
    ares.Add(SleshA1);
    SleshA1:="";
   end;
   end;
   ares.Add(SleshA1);
   

   if cursec="Line" then
     PopupMenu1.Items.Insert(0,NewLine);
     
   for w:=0 to a1.Count-1 do //Цикл для параметров
   begin
    curpar:=a1.Strings[w];
    curval:=s.ReadString(cursec,curpar,"");

    res:=0;
    for prov:=0 to PopupMenu1.Items.Count-1 do
    begin
      if cursec=popupmenu1.Items.Items[prov].Caption then
       res:=1;
    end;

    if res=0 then //Добавление разделов в меню
     {PopupMenu1.Items.Insert(0,NewItem(cursec,0,False,True,NIL,0,"MenuItem"+IntToStr(z)+IntToStr(w)));}
    begin
     for q:=0 to ares.Count-1 do
       Inc(ii);
     PopupMenu1.Items.Insert(0,zMI);
     i:=0;
     UM(zMI);
    end;
    PopupMenu1.Items.Items[0].Insert(0,NewItem(curpar,0,False,True,MyMenuClick,0,"MenuItem44"+IntToStr(z)+IntToStr(w)));
   end;
  end;
 end;
 a.Free;
 a1.Free;
 a2.Free;
 s.Free;
end;

В чём причина её неправильной работы?


 
Zeqfreed ©   (2006-01-15 17:39) [3]

Volf_555   (15.01.06 17:35) [2]

> В чём причина её неправильной работы?

Она слишком большая.


 
Volf_555   (2006-01-15 19:46) [4]


> Zeqfreed ©   (15.01.06 17:39) [3]

Какие твои предложения по уменьшению процедуры?

Процедура должна делать следующее:
1) считывать ini-файл (в данном случае options.ini)
Кусок ini-файла:

[Программы\Системные]
Редактор реестра=C:\WINDOWS\regedit.exe
Коммандная строка=cmd
Проводник=explorer.exe
Nero Express=C:\Program Files\Ahead\Nero\nero.exe, -w
[Программы\Разработка]
Delphi=C:\Program Files\Borland\Delphi6\Bin\delphi32.exe
[Избранное]
Проверить почту на Mail.Ru=E:\ХОББИ\HTML\Стартовая страничка\mail.html
Проверить почту на Yandex.Ru=E:\ХОББИ\HTML\Стартовая страничка\yandex.html

...


2) считывать и проверять на наличие "\" секции ini-файла
3) в случае нахождения слэша, добавлять разделы в TStringList, если слэша нет, то добавить в TStringList только одно значение
4) добавить в меню PopupMenu1 необходимые значения + присвоить события при щелчке на них
5) если имя раздела="Line" - вставить в popup-меню новый разделитель

Какие тогда твои предложения по реализации выше сказанного?


 
Zeqfreed ©   (2006-01-16 11:52) [5]

Volf_555   (15.01.06 19:46) [4]
Так вот, это должны быть как минимум 5 независимых, как можно более универсализированных, процедуры. А не одна, непонятно что делающая.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.039 c
1-1141295597
Николай2006
2006-03-02 13:33
2006.04.02
использование TChart для рисования многоугольника


2-1142943375
VAZMan
2006-03-21 15:16
2006.04.02
Активное окно формы


15-1141969191
Павел Кудрявцев
2006-03-10 08:39
2006.04.02
Ищутся умные люди!


4-1137499500
polinom
2006-01-17 15:05
2006.04.02
Memory, как определить размер и область памяти для нового процеса


4-1136988987
~ShamaN~
2006-01-11 17:16
2006.04.02
Скрытие окна в панели задач





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский