Componentes.Terceros.jvcl/official/3.32/examples/JvDBExplorer/SQLMON.PAS

275 lines
7.1 KiB
Plaintext

{******************************************************************
JEDI-VCL Demo
Copyright (C) 2002 Project JEDI
Original author:
Contributor(s):
You may retrieve the latest version of this file at the JEDI-JVCL
home page, located at http://jvcl.sourceforge.net
The contents of this file are used with permission, subject to
the Mozilla Public License Version 1.1 (the "License"); you may
not use this file except in compliance with the License. You may
obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1_1Final.html
Software distributed under the License is distributed on an
"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
******************************************************************}
{*******************************************************}
{ }
{ Delphi VCL Extensions (RX) demo program }
{ }
{ Copyright (c) 1996 AO ROSNO }
{ }
{*******************************************************}
unit SqlMon;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls, JvSplit, DB,
ComCtrls, Grids, Menus, JvComponent, JvFormPlacement, JvGrids,
JvExExtCtrls, JvExGrids;
type
TTraceSQL = class(TForm)
Splitter: TJvxSplitter ;
ViewPanel: TMemo;
FormStorage: TJvFormStorage ;
TraceBox: TJvDrawGrid ;
SaveLogDialog: TSaveDialog;
PopupMenu: TPopupMenu;
miPopupCopy: TMenuItem;
miPopupClear: TMenuItem;
miPopupSelectAll: TMenuItem;
miSaveLog: TMenuItem;
N1: TMenuItem;
procedure TraceBoxClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure TraceBoxDrawCell(Sender: TObject; Col, Row: Longint;
Rect: TRect; State: TGridDrawState);
procedure miPopupSelectAllClick(Sender: TObject);
procedure miPopupClearClick(Sender: TObject);
procedure miPopupCopyClick(Sender: TObject);
procedure miSaveLogClick(Sender: TObject);
procedure PopupMenuPopup(Sender: TObject);
private
{ Private declarations }
procedure UpdateData;
public
{ Public declarations }
procedure Clear;
end;
var
TraceSQL: TTraceSQL;
procedure BufAddLine(const Msg: string);
procedure BufClear(Confirm: Boolean);
procedure BufSetSize(Value: Integer);
implementation
uses
Options, JvJCLUtils, Math;
{$R *.DFM}
var
TraceBuffer: TStrings = nil;
BufSize: Integer = 256;
CurBufSize: Longint = 0;
TraceForm: TTraceSQL = nil;
procedure CheckEmpty;
begin
if TraceBuffer.Count = 0 then
raise Exception.Create('SQL log buffer is empty');
end;
procedure CheckBufferSize(AddSize: Integer);
var
ItemSize: Integer;
begin
while (CurBufSize + AddSize) div 1024 >= BufSize do begin
ItemSize := Length(TraceBuffer[0]) + SizeOf(Longint) + 1;
TraceBuffer.Delete(0);
Dec(CurBufSize, ItemSize);
end;
end;
procedure BufAddLine(const Msg: string);
begin
CheckBufferSize(Length(Msg) + SizeOf(Longint) + 1);
TraceBuffer.AddObject(Msg, TObject(DateTimeToFileDate(SysUtils.Now)));
if TraceForm <> nil then TraceForm.UpdateData;
end;
procedure BufClear(Confirm: Boolean);
begin
CheckEmpty;
if Confirm then begin
case MessageDlg('Ok to clear log buffer?', mtConfirmation,
mbYesNoCancel, 0) of
mrYes: TraceBuffer.Clear;
mrCancel: SysUtils.Abort;
end;
end
else TraceBuffer.Clear;
if TraceForm <> nil then TraceForm.UpdateData;
end;
procedure BufSetSize(Value: Integer);
begin
if (BufSize > Value) and (TraceBuffer.Count > 0) then BufClear(True);
BufSize := Max(Value, MinSQLTraceBuffer);
end;
{ TTraceSQL }
procedure TTraceSQL.Clear;
begin
ViewPanel.Lines.Clear;
BufClear(True);
UpdateData;
end;
procedure TTraceSQL.UpdateData;
begin
TraceBox.RowCount := Max(2, TraceBuffer.Count + 1);
TraceBox.Row := Max(1, TraceBuffer.Count);
TraceBoxClick(nil);
end;
procedure TTraceSQL.TraceBoxClick(Sender: TObject);
begin
ViewPanel.Lines.Clear;
if (TraceBox.Row > 0) and (TraceBox.Row <= TraceBuffer.Count) then begin
ViewPanel.Lines.Add(TraceBuffer[TraceBox.Row - 1]);
end;
end;
procedure TTraceSQL.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TTraceSQL.FormShow(Sender: TObject);
begin
UpdateData;
TraceForm := Self;
ActiveControl := TraceBox;
FormResize(Self);
end;
procedure TTraceSQL.FormDestroy(Sender: TObject);
begin
TraceForm := nil;
end;
procedure TTraceSQL.FormResize(Sender: TObject);
begin
TraceBox.ColWidths[2] := ClientWidth - (TraceBox.ColWidths[0] +
TraceBox.ColWidths[1]);
end;
procedure TTraceSQL.TraceBoxDrawCell(Sender: TObject; Col, Row: Longint;
Rect: TRect; State: TGridDrawState);
var
S: string;
Align: TAlignment;
begin
Align := taLeftJustify;
S := '';
if Row = 0 then begin
case Col of
0: S := 'No.';
1: S := 'Time Stamp';
2: S := 'SQL Statement';
end;
end
else if Row <= TraceBuffer.Count then begin
case Col of
0: begin
S := IntToStr(Row) + ' ';
Align := taRightJustify;
end;
1: begin
S := FormatDateTime('hh:mm:ss', FileDateToDateTime(
Longint(TraceBuffer.Objects[Row - 1])));
Align := taCenter;
end;
2: S := TraceBuffer[Row - 1];
end;
end;
TraceBox.DrawStr(Rect, S, Align);
end;
procedure TTraceSQL.miPopupSelectAllClick(Sender: TObject);
begin
ViewPanel.SelectAll;
ActiveControl := ViewPanel;
end;
procedure TTraceSQL.miPopupClearClick(Sender: TObject);
begin
Self.Clear;
end;
procedure TTraceSQL.miPopupCopyClick(Sender: TObject);
begin
ViewPanel.CopyToClipboard;
end;
procedure TTraceSQL.miSaveLogClick(Sender: TObject);
var
S: string;
I: Integer;
Stream: TStream;
begin
CheckEmpty;
if SaveLogDialog.Execute then begin
Stream := TFileStream.Create(SaveLogDialog.FileName, fmCreate);
try
for I := 0 to TraceBuffer.Count - 1 do begin
S := FormatDateTime('hh:mm:ss ', FileDateToDateTime(
Longint(TraceBuffer.Objects[I]))) + TraceBuffer[I] + #10#13;
Stream.WriteBuffer(Pointer(S)^, Length(S));
end;
finally
Stream.Free;
end;
end;
end;
procedure TTraceSQL.PopupMenuPopup(Sender: TObject);
var
NotEmpty: Boolean;
begin
miPopupCopy.Enabled := ViewPanel.SelLength > 0;
NotEmpty := (TraceBuffer.Count > 0);
miPopupClear.Enabled := NotEmpty;
miPopupSelectAll.Enabled := NotEmpty;
miSaveLog.Enabled := NotEmpty;
end;
initialization
TraceBuffer := TStringList.Create;
finalization
TraceBuffer.Free;
end.