[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]
{+--------------------------------------------------------------------------+
| Class: TIDEStream
| Created: 8.97
| Author: Martin Waldenburg
| Copyright 1997, all rights reserved.
| Description: A simple and effective interface to the IDE's text buffer
| Version: 1.0
| Status: FreeWare
| Disclaimer:
| This is provided as is, expressly without a warranty of any kind.
| You use it at your own risc.
+--------------------------------------------------------------------------+}
unit mwIDEStream; { demo program below !! }
interface
uses
Windows,
SysUtils,
Messages,
Classes,
ToolIntf,
EditIntf,
ExptIntf;
type
TIDEStream = class(TMemoryStream)
private
fStreamTextLen:Longint;
function GetAsPChar:PChar;
protected
public
constructor Create;
destructor Destroy; override;
procedure WriteText(Text: PChar);
property Capacity;
property AsPChar:PChar read GetAsPChar;
function GetText:PChar;
property StreamTextLen:Longint read fStreamTextLen;
published
end;
var
fToolServices : TIToolServices;
fModuleInterface: TIModuleInterface;
fEditorInterface: TIEditorInterface;
ActualReader: TIEditReader;
ActualWriter: TIEditWriter;
implementation
function GetProjectName: String;
begin
Result:= fToolServices.GetProjectName;
end; { GetProjectName }
function GetCurrentFile: String;
begin
Result:= fToolServices.GetCurrentFile;
end; { GetCurrentFile }
function GetToolServieces:TIToolServices;
var
FileExt: String;
begin
fToolServices:= ExptIntf.ToolServices;
if GetProjectName = '' then raise exception.create('Sorry, a project must be open');
FileExt:= ExtractFileExt(GetCurrentFile);
if FileExt = '.dfm' then raise exception.create('Sorry, must be a PAS or DPR file');
end; { GetToolServieces }
procedure GetEditReader;
begin
GetToolServieces;
fModuleInterface:= fToolServices.GetModuleInterface(GetCurrentFile);
fEditorInterface:= fModuleInterface.GetEditorInterface;
ActualReader:= fEditorInterface.CreateReader;
end; { GetEditReader }
procedure GetEditWriter;
begin
GetToolServieces;
fModuleInterface:= fToolServices.GetModuleInterface(GetCurrentFile);
fEditorInterface:= fModuleInterface.GetEditorInterface;
ActualWriter:= fEditorInterface.CreateWriter;
end; { GetEditWriter }
procedure FreeEditReader;
begin
ActualReader.Free;
fEditorInterface.Free;
fModuleInterface.Free;
end; { GetEditorInterface }
procedure FreeEditWriter;
begin
ActualWriter.Free;
fEditorInterface.Free;
fModuleInterface.Free;
end; { GetEditorInterface }
destructor TIDEStream.Destroy;
begin
inherited Destroy;
end; { Destroy }
constructor TIDEStream.Create;
begin
inherited Create;
fStreamTextLen:= 0;
end; { Create }
function TIDEStream.GetAsPChar:PChar;
const
TheEnd: Char = #0;
begin
Position:= Size;
Write(TheEnd, 1);
SetPointer(Memory, Size -1);
Result:= Memory;
end; { GetAsPChar }
function TIDEStream.GetText:PChar;
const
BuffLen = 16383;
var
TextBuffer: PChar;
Readed, BuffPos: LongInt;
begin
Clear;
GetMem(TextBuffer, BuffLen +1);
BuffPos:= 0;
GetEditReader;
try
repeat
Readed:= ActualReader.GetText(BuffPos, TextBuffer, Bufflen);
Write(TextBuffer^, Readed);
inc(BuffPos, Readed);
until Readed < BuffLen;
finally
FreeEditReader;
FreeMem(TextBuffer, BuffLen +1);
end;
fStreamTextLen:= Size;
Result:= AsPchar;
end;
procedure TIDEStream.WriteText(Text: PChar);
begin
GetEditWriter;
try
ActualWriter.CopyTo(0);
ActualWriter.DeleteTo(fStreamTextLen -1);
ActualWriter.Insert(Text);
finally
FreeEditWriter;
end;
end;
end.
unit mwIDEExpert;
{+--------------------------------------------------------------------------+
| Unit: mwIDEExpert
| Created: 8.97
| Author: Martin Waldenburg
| Copyright 1997, all rights reserved.
| Description: A simple demo for TIDEStream
| Version: 1.0
| Status: FreeWare
| Disclaimer:
| This is provided as is, expressly without a warranty of any kind.
| You use it at your own risc.
+--------------------------------------------------------------------------+}
interface { DFM file is included below - use XX34 to extract it }
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, ExptIntf, ToolIntf, mwIDEStream, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
TMyIDEExpertExpert = class(TIExpert)
private
MenuItem: TIMenuItemIntf;
protected
procedure OnClick( Sender: TIMenuItemIntf); virtual;
public
constructor Create; virtual;
destructor Destroy; override;
function GetName: string; override;
function GetAuthor: string; override;
function GetStyle: TExpertStyle; override;
function GetIDString: string; override;
end;
procedure Register;
implementation
{$R *.DFM}
procedure Register;
begin
RegisterLibraryExpert(TMyIDEExpertExpert.Create);
end;
{ TMyIDEExpertExpert code }
function TMyIDEExpertExpert.GetName: String;
begin
Result := 'MyIDEExpertExpert'
end;
function TMyIDEExpertExpert.GetAuthor: String;
begin
Result := 'Martin_Waldenburg'; { author }
end;
function TMyIDEExpertExpert.GetStyle: TExpertStyle;
begin
Result := esAddIn;
end;
function TMyIDEExpertExpert.GetIDString: String;
begin
Result := 'private.MyIDEExpertExpert';
end;
constructor TMyIDEExpertExpert.Create;
var
Main: TIMainMenuIntf;
ReferenceMenuItem: TIMenuItemIntf;
Menu: TIMenuItemIntf;
begin
inherited Create;
MenuItem := nil;
if ToolServices <> nil then begin { I'm an expert! }
Main := ToolServices.GetMainMenu;
if Main <> nil then begin { we've got the main menu! }
try
{ add the menu of your choice }
ReferenceMenuItem := Main.FindMenuItem('ToolsOptionsItem');
if ReferenceMenuItem <> nil then
try
Menu := ReferenceMenuItem.GetParent;
if Menu <> nil then
try
MenuItem := Menu.InsertItem(ReferenceMenuItem.GetIndex+1,
'MyIDEExpert',
'MyIDEExpertExpertItem','',
0,0,0,
[mfEnabled, mfVisible], OnClick);
finally
Menu.DestroyMenuItem;
end;
finally
ReferenceMenuItem.DestroyMenuItem;
end;
finally
Main.Free;
end;
end;
end;
end;
destructor TMyIDEExpertExpert.Destroy;
begin
if MenuItem <> nil then
MenuItem.DestroyMenuItem;
inherited Destroy;
end;{Destroy}
procedure TMyIDEExpertExpert.OnClick( Sender: TIMenuItemIntf);
begin
with TForm1.Create(Application) do
try
{ do your processing here }
ShowModal;
finally
Free;
end;
end;
{ TForm1 code }
procedure TForm1.Button1Click(Sender: TObject);
var
IDEStream: TIDEStream;
StreamText, UText, UFind, fReplace: String;
FindLen, P: LongInt;
begin
IDEStream:= TIDEStream.Create;
StreamText:= IDEStream.GetText;
UText:= UpperCase(StreamText);
UFind:= UpperCase(Trim(Edit1.Text));
fReplace:= Trim(Edit2.Text);
FindLen:= Length(UFind);
P:= Pos(UFind, UText);
if P <> 0 then
begin
Delete(StreamText, P, FindLen);
Insert(fReplace, StreamText, P);
IDEStream.WriteText(PChar(StreamText));
end;
IDEStream.Free;
end;
end.
{ the following contains additional files that should be included with this
file. To extract, you need XX3402 available with the SWAG distribution.
1. Cut the text below out, and save to a file .. filename.xx
2. Use XX3402 : xx3402 d filename.xx
3. The decoded file should be created in the same directory.
4. If the file is a archive file, use the proper archive program to
extract the members.
{ ------------------ CUT ----------------------}
*XX3402-000564-150897--72--85-59531----MWIDEEXP.DFM--1-OF--1
zkc+J2NDIYol+1+E7+6++3FEFX+4J2NjQaol-INjQaol-2lZNbE1m++1J4xk+ak3JqZYR4U1
Fk24G4JdNqVo+vA+-oBVQ5FdPqs42IFZPKwUPqMUJ2Z2FJBmNK3h12NjPbEiEqVVQbBZR+QD
F2J4EJJAJ3x1G23GIoJI0YNjPbEiEqxgPr6514BgJqZiN4xrJ4JsR+h4Pqto9YVZOKRcR+9p
0INjPbEiHa3hNEMBHJAUIq3iQm-HNL7dNUd4Pqto9ZBoSKlZ0k+BI4ZsNKlnI4JmGKtXO+7U
0ZFZS5F6NKZbO5E01E+4J2lVMaJg-YlVMaJgAEFANKNo+W+1J4xk+VU3JqZYR4U03+N6NKZb
O5E01ER1ML-oOKxi-UF4OKtY+++4J2lVMaJg-YlVMaJgAUFANKNo+W+1J4xk+Y+3JqZYR4U0
8+N6NKZbO5E01ER1ML-oOKxi-URGNL-gMKBZ+++5J27pR5FjPUR0RLFoPqsl-2lZNbE0S+BI
Pr+0M+JLOKFoO+79-YVZOKRcR+6N-oBVQ5FdPqs4-o7pR5FjPX26J43WHr7YNL60++RDPYBg
OKBf-kl0RLFoPqslEqldMqg+++JIFKFdR+J3N4ZoAEFANKNo+Z+1J4xk+V+3JqZYR4U1kE+4
G4JdNqVo+VI6J43WHr7YNL60+E++-JF3N4Zo-IJYOLEm-2lZNbE0I+BIPr+0C+JLOKFoO+D-
++N6NKZbO5E03EVIMK7DQaFZQU60++++
***** END OF BLOCK 1 *****
[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]