Текущий архив: 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.47 MB
Время: 0.039 c