pjelias
asked on
Help Needed creating a Popup in the Icon Tray
I have created an application that runs in the Icon Tray, that when clicked, a Menu Appears with applications that I wish to Run.
This works well.
I now want to modify the Application (Version 2), where my application reads the Following INI File.
[App1]
AppDesc='Run App1'
AppPath='D:\My Apps\App1.exe'
[App2]
AppDesc='Run App2'
AppPath='D:\My Projects\Projects\App2.exe '
[App3]
AppDesc='Run App3'
AppPath='D:\My Projects\App3\App3.exe'
[App4]
AppDesc='Run App4'
AppPath='D:\My Projects\App4\App4.exe'
I want the Application to then Create a Menu Item for each AppDesc, and then allows the user to EXECUTE the application contained within the AppPath.
I basically have the following code, my previous application had 4 procedures
MyPopupHandler1(Sender: TObject);
MyPopupHandler2(Sender: TObject);
MyPopupHandler3(Sender: TObject);
MyPopupHandler4(Sender: TObject);
Which were hardcoded with the Application Path and EXE Name and all worked well
type
TForm1 = class(TForm)
abcTrayIcon1: TabcTrayIcon;
abcSingle: TabcSingleInstance;
mPopup: TPopupMenu;
procedure FormCreate(Sender: TObject);
procedure MyPopupHandler(Sender: TObject);
procedure ExitApp(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
MyItem: array[0..4] of TMenuItem;
i: Integer;
SystemIni: TIniFile;
secList: TStrings;
begin
secList:=TStringList.Creat e;
SystemIni := TIniFile.Create('C:\data\P opup.ini') ;
SystemIni.ReadSections(sec List);
for I := 0 to secList.Count - 1 do begin // Iterate
MyItem[i] := TMenuItem.Create(Self);
MyItem[i].Caption := SystemIni.ReadString(secLi st.Strings [I],'AppDe sc','-');
appPath := SystemIni.ReadString(secLi st.Strings [I],'AppPa th','-');
MyItem[i].OnClick := MyPopupHandler;
mPopup.Items.Add(MyItem[i] );
end; // for
MyItem[i+1] := TMenuItem.Create(Self);
MyItem[i+1].Caption := 'Exit';
MyItem[i+1].OnClick := ExitApp;
mPopup.Items.Add(MyItem[i+ 1]);
end;
procedure TForm1.MyPopupHandler(Send er: TObject);
begin
WinExec(appPath,SW_SHOW); // application Path and EXE here
end;
procedure TForm1.ExitApp(Sender: TObject);
begin
Application.Terminate;
end;
Any help would be greatly appreciated
Thanks
PE
This works well.
I now want to modify the Application (Version 2), where my application reads the Following INI File.
[App1]
AppDesc='Run App1'
AppPath='D:\My Apps\App1.exe'
[App2]
AppDesc='Run App2'
AppPath='D:\My Projects\Projects\App2.exe
[App3]
AppDesc='Run App3'
AppPath='D:\My Projects\App3\App3.exe'
[App4]
AppDesc='Run App4'
AppPath='D:\My Projects\App4\App4.exe'
I want the Application to then Create a Menu Item for each AppDesc, and then allows the user to EXECUTE the application contained within the AppPath.
I basically have the following code, my previous application had 4 procedures
MyPopupHandler1(Sender: TObject);
MyPopupHandler2(Sender: TObject);
MyPopupHandler3(Sender: TObject);
MyPopupHandler4(Sender: TObject);
Which were hardcoded with the Application Path and EXE Name and all worked well
type
TForm1 = class(TForm)
abcTrayIcon1: TabcTrayIcon;
abcSingle: TabcSingleInstance;
mPopup: TPopupMenu;
procedure FormCreate(Sender: TObject);
procedure MyPopupHandler(Sender: TObject);
procedure ExitApp(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
MyItem: array[0..4] of TMenuItem;
i: Integer;
SystemIni: TIniFile;
secList: TStrings;
begin
secList:=TStringList.Creat
SystemIni := TIniFile.Create('C:\data\P
SystemIni.ReadSections(sec
for I := 0 to secList.Count - 1 do begin // Iterate
MyItem[i] := TMenuItem.Create(Self);
MyItem[i].Caption := SystemIni.ReadString(secLi
appPath := SystemIni.ReadString(secLi
MyItem[i].OnClick := MyPopupHandler;
mPopup.Items.Add(MyItem[i]
end; // for
MyItem[i+1] := TMenuItem.Create(Self);
MyItem[i+1].Caption := 'Exit';
MyItem[i+1].OnClick := ExitApp;
mPopup.Items.Add(MyItem[i+
end;
procedure TForm1.MyPopupHandler(Send
begin
WinExec(appPath,SW_SHOW); // application Path and EXE here
end;
procedure TForm1.ExitApp(Sender: TObject);
begin
Application.Terminate;
end;
Any help would be greatly appreciated
Thanks
PE
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
? ?
I forgot the
FreeAndNil(SystemIni);
FreeAndNil(secList);
and the
appPath: String; is not used
I forgot the
FreeAndNil(SystemIni);
FreeAndNil(secList);
and the
appPath: String; is not used
What...............
May I ask what was wrong with my answer...?
Shane
May I ask what was wrong with my answer...?
Shane
Hey Slick812, thanks for stepping on me?
Shane
Shane
ASKER
Shane,
I probably could have split the points, I used Slick182's because the code looked a bit "cleaner" ie. didn't need to modify INI - Add Count, PopUpHandler (MyClick) Used 1 line instead of 3 etc.....
My apologies
PE
I probably could have split the points, I used Slick182's because the code looked a bit "cleaner" ie. didn't need to modify INI - Add Count, PopUpHandler (MyClick) Used 1 line instead of 3 etc.....
My apologies
PE
You got to be kidding me, you couldn't tell he ran with my code..... beautifying it up.
Oh well, some people just don't get it.
Good luck!
Shane
shaneholmes, I did my code compleatly independently of anything you have ever posted here, the creative part of my code is using the hint for the extra string for appPath, where in your code is that? And on your click event, why do you do something as ineficient as reading the ini file a second time?
im not gonna give you the satifisfaction of answering you slick218 - enjoy the points and have a good day - end of subject!
Shane
Shane
I added a main section with a count to my inifile
[MAIN]
COUNT= 3
[App1]
AppDesc='Preso'
AppPath='C:\Program Files\Borland\Delphi7\Proj
[App2]
AppDesc='GCM'
AppPath='C:\Program Files\Borland\Delphi7\Proj
[App3]
AppDesc='Poker'
AppPath='C:\Program Files\Borland\Delphi7\Proj
you will need this to execute the applications
uses
ShellAPI;
//this is the OnClick event you will assign to each menuitem
procedure TForm1.MyCLick(Sender: TObject);
var
IFile: TIniFile;
IApp: String;
begin
//open ini file
IFile:= TIniFile.Create(ChangeFile
//get menu item path
IApp:= IFile.ReadString('APP' + IntToStr(TMenuItem(Sender)
//execute menu item
ShellExecute(Handle, 'open', PChar(IApp), nil, nil, SW_SHOWNORMAL);
end;
//create menu items on form startup
procedure TForm1.FormActivate(Sender
var
IFile: TIniFile;
MItem : TMenuItem;
I, Count: Integer;
IName: String;
begin
//open inifile
IFile:= TIniFile.Create(ChangeFile
//get count
Count:= IFile.ReadInteger('MAIN','
for I:= 1 to Count do
begin
//get app name
IName:= IFile.ReadString('APP' + IntToStr(I),'AppDesc','');
MItem := TMenuItem.Create(PopupMenu
MItem.Caption:= IName;
MItem.OnClick := MyCLick;
PopupMenu1.Items.Add(MItem
end;
end;
end.
Hope this helps
Shane