Contributor: GARY NIELSEN
unit OnlyOne;
{ * * * * * * * * * * * * * * * * * * * * * * * * * * * *
	OnlyOne, version 1.00, Freeware
	 A Delphi 2.0 component
	composed by Gary Nielsen, 3/26/96
	 70323.2610@compuserve.com
	
	Drop the OnlyOne component onto a form and only one
	instance of that window will occur. Any attempt to make
	a second instance will restore the previous window.
	
	caveat artifex:
	 Use this component at your own risk. OnlyOne may not
	work with applications that change their title bar, or
	with applications that have names longer than 20 chars.
	I have only tested this component on a limited number
	of programs, so treat it as 'alpha'-ware.
	
	Acknowledgements:
	 To make this into a component, I used Steven L. Keyser's
	JustOne component as a template. I also derived some code
	from PC Mag's Michael J. Mefford's PicAlbum utility,
	in which hPrevInst is used, but, according to the
	documentation, hPrevInst always equals NULL	with Delphi 2
	and Win95.
	
	Please, if you modify or enhance this code,	drop me a
	note so that I can learn from your work. 
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * }
interface
uses
 SysUtils, Windows, Messages, Classes, Graphics, Controls,
 Forms, Dialogs;
type
 TOnlyOne = class(TComponent)
 private
 public
 constructor Create(AOwner:TComponent); override;
 destructor Destroy; override;
 published
 end;
procedure Register;
procedure LookForPreviousInstance;
var
 AtomText: array[0..31] of Char;
 
implementation
procedure Register;
begin
 RegisterComponents('Win95', [TOnlyOne]);
end;
procedure LookForPreviousInstance;
var
 PreviousInstanceWindow : hWnd;
 AppName : array[0..30] of char;
 FoundAtom : TAtom;
begin
 {put the app name into AtomText}
 StrFmt(AtomText, 'OnlyOne%s', [Copy(Application.Title,1,20)]);
 {check to see if there's a global atom based on the app name }
 FoundAtom := GlobalFindAtom(AtomText);
 if FoundAtom  0 then {another instance exists}
 begin
 {get the app name into a pointer string }
	 StrFmt(AppName,'%s', [Application.Title]);
 {change current title so that FindWindow doesn't see it }
 Application.Title := 'destroy me';
 {locate the previous instance of the app }
 PreviousInstanceWindow := FindWindow(nil,AppName);
	 {give focus to the previous instance of the app }
 if PreviousInstanceWindow  0 then
 if IsIconic(PreviousInstanceWindow) then
 ShowWindow(PreviousInstanceWindow,SW_RESTORE)
 else
 BringWindowToTop(PreviousInstanceWindow);
 {stop the current instance of the application }
 Application.Terminate;
 end;
 { make the global atom so no other instances can occur }
 FoundAtom := GlobalAddAtom(AtomText);
end;	 
constructor TOnlyOne.Create(AOwner:TComponent);
begin
 inherited Create(AOwner);
 LookForPreviousInstance;
end;
destructor TOnlyOne.Destroy;
var
 FoundAtom : TAtom;
 ValueReturned : word;
begin
 { must not forget to remove the global atom, so first
 check to see if there's a global atom already }
 FoundAtom := GlobalFindAtom(AtomText);
 if FoundAtom  0 then {and now remove that atom}
 ValueReturned := GlobalDeleteAtom(FoundAtom);
 inherited Destroy;
end;
end.


AltStyle によって変換されたページ (->オリジナル) /