Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.02;
Скачать: CL | DM;

Вниз

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

 
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 вся ветка

Текущий архив: 2006.04.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.044 c
2-1142568436
Dub
2006-03-17 07:07
2006.04.02
Работа с формой


1-1141225888
ArtemESC
2006-03-01 18:11
2006.04.02
Алгоритм поиска относительного пути...


2-1142416375
Russ
2006-03-15 12:52
2006.04.02
Сервис после запуска сразу останавливается


10-1115351783
TankMan
2005-05-06 07:56
2006.04.02
Скажите как юзать параметр FieldInfo в методе OpenText


2-1142416756
VitV
2006-03-15 12:59
2006.04.02
DBLookupComboBox-заполнение.