unit main;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, Menus,
ComCtrls, StdCtrls;
Type
TShowStatusEvent = procedure(Status: String) of Object;
TMyThread = class(TThread)
private
fStatusText : string;
FOnShowStatus: TShowStatusEvent;
procedure ShowStatus;
protected
procedure Execute; override;
public
Constructor Create(CreateSuspended : boolean);
property OnShowStatus: TShowStatusEvent read FOnShowStatus write FOnShowStatus;
end;
type
{ TfrmMain }
TfrmMain = class(TForm)
btnStart: TButton;
mnuToMonitor4: TMenuItem;
mnuToMonitor3: TMenuItem;
mnuToMonitor2: TMenuItem;
mnuToMonitor1: TMenuItem;
mnuSep4: TMenuItem;
mnuToMonitor: TMenuItem;
mnuMainQuit: TMenuItem;
mnuSep3: TMenuItem;
mnuMainToTray: TMenuItem;
mnuFile: TMenuItem;
mnuMain: TMainMenu;
mnuQuit: TMenuItem;
mnuSep2: TMenuItem;
mnuCurrent: TMenuItem;
mnuCentre: TMenuItem;
mnuSep1: TMenuItem;
mnuShow: TMenuItem;
mnuTray: TPopupMenu;
sbStatus: TStatusBar;
sysTray: TTrayIcon;
tGetCardInfo: TTimer;
tvAudio: TTreeView;
procedure btnStartClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormWindowStateChange(Sender: TObject);
procedure mnuCentreClick(Sender: TObject);
procedure mnuCurrentClick(Sender: TObject);
procedure mnuQuitClick(Sender: TObject);
procedure mnuShowClick(Sender: TObject);
procedure mnuToMonitor1Click(Sender: TObject);
private
threadCounter: Integer;
threads: array[0..9] of TMyThread;
procedure centerOnMonitor(Mon: TMonitor);
public
procedure onShowStatus(status: string);
end;
var
frmMain: TfrmMain;
implementation
{TMyThread}
constructor TMyThread.Create(CreateSuspended : boolean);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := True;
end;
procedure TMyThread.ShowStatus;
begin
if Assigned(FOnShowStatus) then
begin
FOnShowStatus(fStatusText);
end;
end;
procedure TMyThread.Execute;
var
newStatus : string;
counter: Integer;
begin
counter:= 0;
fStatusText := 'TMyThread Starting...';
Synchronize(@ShowStatus);
newStatus := 'TMyThread Running...';
while (not Terminated) and (counter < 100000) do
begin
if newStatus <> fStatusText then
begin
fStatusText := newStatus;
Synchronize(@ShowStatus);
end;
Inc(counter);
newStatus:= IntToStr(counter);
end;
fStatusText := 'TMyThread Finished...';
Synchronize(@ShowStatus);
end;
{$R *.lfm}
{ TfrmMain }
procedure TfrmMain.FormCreate(Sender: TObject);
var
i: Integer;
mnuItem: TMenuItem;
begin
threadCounter:= 0;
if Screen.MonitorCount > 1 then
begin
mnuToMonitor.Enabled:=true;
for i:= 0 to Screen.MonitorCount - 1 do
begin
mnuItem:= TMenuItem.Create(mnuToMonitor);
mnuItem.Caption:= 'Monitor' + IntToStr(i);
mnuItem.Name:= 'mnuToMonitor' + IntToStr(i);
mnuitem.Tag:= i;
mnuItem.Visible:= true;
mnuItem.Enabled:= true;
mnuItem.OnClick:= @mnuToMonitor1Click;
mnuToMonitor.Add(mnuItem);
end;
end;
end;
procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:= MessageDlg('Do you really want to quit?', mtConfirmation, [mbYes, mbNo], 0) = mrYes
end;
procedure TfrmMain.btnStartClick(Sender: TObject);
begin
threads[threadCounter]:= TMyThread.Create(true);
threads[threadCounter].OnShowStatus := @onShowStatus;
threads[threadCounter].Start;
Inc(threadCounter);
end;
procedure TfrmMain.onShowStatus(status: string);
var
item: TTreeNode;
begin
item:= tvAudio.Items.AddChild(tvAudio.Items[0], status);
item.MakeVisible;
end;
procedure TfrmMain.FormWindowStateChange(Sender: TObject);
begin
if (WindowState = wsMinimized) and (mnuMainToTray.Checked) then Hide;
end;
procedure TfrmMain.mnuCentreClick(Sender: TObject);
begin
centerOnMonitor(Screen.MonitorFromWindow(Self.Handle));
end;
procedure TfrmMain.mnuCurrentClick(Sender: TObject);
begin
centerOnMonitor(Screen.MonitorFromPoint(Mouse.CursorPos));
end;
procedure TfrmMain.mnuToMonitor1Click(Sender: TObject);
begin
centerOnMonitor(Screen.Monitors[TMenuItem(Sender).Tag]);
end;
procedure TfrmMain.mnuQuitClick(Sender: TObject);
begin
if MessageDlg('Do you really want to quit?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then Application.Terminate;
end;
procedure TfrmMain.mnuShowClick(Sender: TObject);
begin
frmMain.WindowState := wsNormal;
Show;
end;
procedure TfrmMain.centerOnMonitor(Mon: TMonitor);
begin
Left:= Mon.Left + (Mon.Width - Width) div 2;
Top:= Mon.Top + (Mon.Height - Height) div 2;
end;
end.