302 lines
10 KiB
ObjectPascal
302 lines
10 KiB
ObjectPascal
|
|
{**************************************************************************************************}
|
||
|
|
{ }
|
||
|
|
{ Project JEDI Code Library (JCL) }
|
||
|
|
{ }
|
||
|
|
{ The contents of this file are 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/ }
|
||
|
|
{ }
|
||
|
|
{ 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. }
|
||
|
|
{ }
|
||
|
|
{ The Original Code is UnitVersioningTestMain.pas. }
|
||
|
|
{ }
|
||
|
|
{ The Initial Developer of the Original Code is Uwe Schuster. }
|
||
|
|
{ Portions created by Uwe Schuster are Copyright (C) Uwe Schuster. All rights reserved. }
|
||
|
|
{ }
|
||
|
|
{ Contributor(s): }
|
||
|
|
{ Uwe Schuster (uschuster) }
|
||
|
|
{ }
|
||
|
|
{**************************************************************************************************}
|
||
|
|
{ }
|
||
|
|
{ sample for TUnitVersioning }
|
||
|
|
{ }
|
||
|
|
{ Unit owner: Uwe Schuster }
|
||
|
|
{ }
|
||
|
|
{**************************************************************************************************}
|
||
|
|
|
||
|
|
// Last modified: $Date: 2005/10/17 13:19:01 $
|
||
|
|
// For history see end of file
|
||
|
|
|
||
|
|
unit UnitVersioningTestMain;
|
||
|
|
|
||
|
|
{$I jcl.inc}
|
||
|
|
|
||
|
|
interface
|
||
|
|
|
||
|
|
uses
|
||
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
||
|
|
StdCtrls, ComCtrls, ExtCtrls, JclUnitVersioning, JclUnitVersioningProviders,
|
||
|
|
JclDebug, JclFileUtils;
|
||
|
|
|
||
|
|
type
|
||
|
|
TfrmUnitVersioningTestMain = class(TForm)
|
||
|
|
tv: TTreeView;
|
||
|
|
Panel1: TPanel;
|
||
|
|
btnTestDummyProvider: TButton;
|
||
|
|
btnTestGetLocationInfoStr: TButton;
|
||
|
|
btnShowUVContent: TButton;
|
||
|
|
btnTestFindMethods: TButton;
|
||
|
|
btnLoadDLL: TButton;
|
||
|
|
btnInsertSection: TButton;
|
||
|
|
procedure FormCreate(Sender: TObject);
|
||
|
|
procedure FormDestroy(Sender: TObject);
|
||
|
|
procedure btnTestFindMethodsClick(Sender: TObject);
|
||
|
|
procedure btnTestDummyProviderClick(Sender: TObject);
|
||
|
|
procedure btnTestGetLocationInfoStrClick(Sender: TObject);
|
||
|
|
procedure btnShowUVContentClick(Sender: TObject);
|
||
|
|
procedure btnLoadDLLClick(Sender: TObject);
|
||
|
|
procedure btnInsertSectionClick(Sender: TObject);
|
||
|
|
private
|
||
|
|
{ Private declarations }
|
||
|
|
FFindMethodsInfoPtrs: TList;
|
||
|
|
TestDLLHandle: THandle;
|
||
|
|
procedure FreeTestDLL;
|
||
|
|
public
|
||
|
|
{ Public declarations }
|
||
|
|
end;
|
||
|
|
|
||
|
|
var
|
||
|
|
frmUnitVersioningTestMain: TfrmUnitVersioningTestMain;
|
||
|
|
|
||
|
|
implementation
|
||
|
|
|
||
|
|
{$R *.dfm}
|
||
|
|
|
||
|
|
const
|
||
|
|
TestDLLFileName = 'UnitVersioningTestDLL.dll';
|
||
|
|
|
||
|
|
procedure TfrmUnitVersioningTestMain.FormCreate(Sender: TObject);
|
||
|
|
begin
|
||
|
|
FFindMethodsInfoPtrs := TList.Create;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TfrmUnitVersioningTestMain.FormDestroy(Sender: TObject);
|
||
|
|
var
|
||
|
|
I: Integer;
|
||
|
|
begin
|
||
|
|
for I := 0 to FFindMethodsInfoPtrs.Count - 1 do
|
||
|
|
Dispose(FFindMethodsInfoPtrs[I]);
|
||
|
|
FFindMethodsInfoPtrs.Free;
|
||
|
|
FreeTestDLL;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TfrmUnitVersioningTestMain.FreeTestDLL;
|
||
|
|
begin
|
||
|
|
if TestDLLHandle <> 0 then
|
||
|
|
begin
|
||
|
|
if FreeLibrary(TestDLLHandle) then
|
||
|
|
TestDLLHandle := 0;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TfrmUnitVersioningTestMain.btnTestFindMethodsClick(Sender: TObject);
|
||
|
|
const MaxCnt = 1000;
|
||
|
|
var
|
||
|
|
UnitVersioning: TUnitVersioning;
|
||
|
|
I, Idx: Integer;
|
||
|
|
UnitVersionInfoPtr: PUnitVersionInfo;
|
||
|
|
begin
|
||
|
|
UnitVersioning := GetUnitVersioning;
|
||
|
|
for I := 1 to MaxCnt do
|
||
|
|
begin
|
||
|
|
New(UnitVersionInfoPtr);
|
||
|
|
with UnitVersionInfoPtr^ do
|
||
|
|
begin
|
||
|
|
RCSfile := Format('unit%d.pas', [I]);
|
||
|
|
Revision := '';
|
||
|
|
Date := '';
|
||
|
|
LogPath := '';
|
||
|
|
Extra := '';
|
||
|
|
Data := nil;
|
||
|
|
end;
|
||
|
|
FFindMethodsInfoPtrs.Add(UnitVersionInfoPtr);
|
||
|
|
RegisterUnitVersion(HInstance, UnitVersionInfoPtr^);
|
||
|
|
end;
|
||
|
|
if MaxCnt >= 500 then
|
||
|
|
begin
|
||
|
|
Idx := UnitVersioning.IndexOf('unit500.pas');
|
||
|
|
if Idx <> -1 then
|
||
|
|
ShowMessage(Format('IndexOf %s = %d', [UnitVersioning.Items[Idx].RCSfile, Idx]))
|
||
|
|
else
|
||
|
|
ShowMessage('IndexOf failed');
|
||
|
|
end;
|
||
|
|
if MaxCnt >= 600 then
|
||
|
|
begin
|
||
|
|
if Assigned(UnitVersioning.FindUnit('unit600.pas')) then
|
||
|
|
ShowMessage('FindUnit ' + UnitVersioning.FindUnit('unit600.pas').RCSfile)
|
||
|
|
else
|
||
|
|
ShowMessage('FindUnit failed');
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
type
|
||
|
|
TDummyUnitVersioningProvider = class(TCustomUnitVersioningProvider)
|
||
|
|
private
|
||
|
|
FUV: PUnitVersionInfo;
|
||
|
|
public
|
||
|
|
constructor Create; override;
|
||
|
|
destructor Destroy; override;
|
||
|
|
procedure LoadModuleUnitVersioningInfo(Instance: THandle); override;
|
||
|
|
end;
|
||
|
|
|
||
|
|
constructor TDummyUnitVersioningProvider.Create;
|
||
|
|
begin
|
||
|
|
inherited Create;
|
||
|
|
FUV := nil;
|
||
|
|
end;
|
||
|
|
|
||
|
|
destructor TDummyUnitVersioningProvider.Destroy;
|
||
|
|
begin
|
||
|
|
if Assigned(FUV) then
|
||
|
|
Dispose(FUV);
|
||
|
|
inherited Destroy;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TDummyUnitVersioningProvider.LoadModuleUnitVersioningInfo(Instance: THandle);
|
||
|
|
begin
|
||
|
|
if (Instance = HInstance) and not Assigned(FUV) then
|
||
|
|
begin
|
||
|
|
New(FUV);
|
||
|
|
FUV^.RCSfile := 'DummyUnit.pas';
|
||
|
|
FUV^.Revision := '0.12';
|
||
|
|
FUV^.Date := '';
|
||
|
|
FUV^.LogPath := '';
|
||
|
|
FUV^.Extra := '';
|
||
|
|
FUV^.Data := nil;
|
||
|
|
RegisterUnitVersion(Instance, FUV^);
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TfrmUnitVersioningTestMain.btnTestDummyProviderClick(Sender: TObject);
|
||
|
|
var
|
||
|
|
UnitVersioning: TUnitVersioning;
|
||
|
|
Idx: Integer;
|
||
|
|
begin
|
||
|
|
UnitVersioning := GetUnitVersioning;
|
||
|
|
UnitVersioning.RegisterProvider(TDummyUnitVersioningProvider);
|
||
|
|
UnitVersioning.LoadModuleUnitVersioningInfo(HInstance);
|
||
|
|
Idx := UnitVersioning.IndexOf('DummyUnit.pas');
|
||
|
|
if Idx <> -1 then
|
||
|
|
ShowMessage(Format('IndexOf %s=%d Revision=%s', [UnitVersioning.Items[Idx].RCSfile,
|
||
|
|
Idx, UnitVersioning.Items[Idx].Revision]))
|
||
|
|
else
|
||
|
|
ShowMessage('DummyProvider Test failed');
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TfrmUnitVersioningTestMain.btnTestGetLocationInfoStrClick(Sender: TObject);
|
||
|
|
var
|
||
|
|
S: string;
|
||
|
|
begin
|
||
|
|
S := GetLocationInfoStr(@TUnitVersioning.LoadModuleUnitVersioningInfo,
|
||
|
|
False, True, True, False);
|
||
|
|
ShowMessage(S);
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TfrmUnitVersioningTestMain.btnShowUVContentClick(Sender: TObject);
|
||
|
|
var
|
||
|
|
I, J: Integer;
|
||
|
|
UnitVersioning: TUnitVersioning;
|
||
|
|
tnModule: TTreeNode;
|
||
|
|
LongFileName: string;
|
||
|
|
begin
|
||
|
|
UnitVersioning := GetUnitVersioning;
|
||
|
|
UnitVersioning.RegisterProvider(TJclDefaultUnitVersioningProvider);
|
||
|
|
for I := 0 to Pred(UnitVersioning.ModuleCount) do
|
||
|
|
UnitVersioning.LoadModuleUnitVersioningInfo(UnitVersioning.Modules[I].Instance);
|
||
|
|
tv.Items.BeginUpdate;
|
||
|
|
try
|
||
|
|
tv.Items.Clear;
|
||
|
|
for I := 0 to Pred(UnitVersioning.ModuleCount) do
|
||
|
|
begin
|
||
|
|
tnModule := tv.Items.Add(nil, Format('%s [%d units]',
|
||
|
|
[GetModulePath(UnitVersioning.Modules[I].Instance), UnitVersioning.Modules[I].Count]));
|
||
|
|
for J := 0 to Pred(UnitVersioning.Modules[I].Count) do
|
||
|
|
with UnitVersioning.Modules[I][J] do
|
||
|
|
begin
|
||
|
|
LongFileName := LogPath;
|
||
|
|
if LongFileName <> '' then
|
||
|
|
LongFileName := PathAddSeparator(LongFileName);
|
||
|
|
LongFileName := LongFileName + RCSfile;
|
||
|
|
tv.Items.AddChild(tnModule, Format('%s %s %s', [LongFileName, Revision, Date]));
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
finally
|
||
|
|
tv.Items.EndUpdate;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TfrmUnitVersioningTestMain.btnLoadDLLClick(Sender: TObject);
|
||
|
|
begin
|
||
|
|
if TestDLLHandle = 0 then
|
||
|
|
begin
|
||
|
|
TestDLLHandle := LoadLibrary(TestDLLFileName);
|
||
|
|
if TestDLLHandle = 0 then
|
||
|
|
ShowMessage(Format('Could not load %s', [TestDLLFileName]));
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TfrmUnitVersioningTestMain.btnInsertSectionClick(Sender: TObject);
|
||
|
|
var
|
||
|
|
TestStream: TMemoryStream;
|
||
|
|
UnitList: TJclUnitVersioningList;
|
||
|
|
UnitVersionInfo: TUnitVersionInfo;
|
||
|
|
I: Integer;
|
||
|
|
begin
|
||
|
|
FreeTestDLL;
|
||
|
|
if TestDLLHandle = 0 then
|
||
|
|
begin
|
||
|
|
TestStream := TMemoryStream.Create;
|
||
|
|
try
|
||
|
|
UnitList := TJclUnitVersioningList.Create;
|
||
|
|
try
|
||
|
|
for I := 1 to 20 do
|
||
|
|
begin
|
||
|
|
with UnitVersionInfo do
|
||
|
|
begin
|
||
|
|
RCSfile := Format('unit%d.pas', [I]);
|
||
|
|
Revision := Format('0.%d', [I]);
|
||
|
|
Date := '';
|
||
|
|
LogPath := '';
|
||
|
|
Extra := '';
|
||
|
|
Data := nil;
|
||
|
|
end;
|
||
|
|
UnitList.Add(UnitVersionInfo);
|
||
|
|
end;
|
||
|
|
if not InsertUnitVersioningSection(TestDLLFileName, UnitList) then
|
||
|
|
ShowMessage(Format('Inserting UnitVersion information section into %s failed',
|
||
|
|
[TestDLLFileName]));
|
||
|
|
finally
|
||
|
|
UnitList.Free;
|
||
|
|
end;
|
||
|
|
finally
|
||
|
|
TestStream.Free;
|
||
|
|
end;
|
||
|
|
end
|
||
|
|
else
|
||
|
|
ShowMessage('Can''t insert section - DLL still loaded and unload failed...');
|
||
|
|
end;
|
||
|
|
|
||
|
|
// History:
|
||
|
|
|
||
|
|
// $Log: UnitVersioningTestMain.pas,v $
|
||
|
|
// Revision 1.1 2005/10/17 13:19:01 rrossmair
|
||
|
|
// - moved over from examples\vcl\*
|
||
|
|
//
|
||
|
|
// Revision 1.1 2005/03/07 18:47:42 uschuster
|
||
|
|
// new example for UnitVersioning
|
||
|
|
//
|
||
|
|
|
||
|
|
end.
|