Delphi IDE 확장 개발 마법사
이후 문장에서 나의 오프닝을 쓰지 않았다. 기술 교류, DH가 설명한 것은 모두 전재된 것이다. 작가의 이름을 알면 내가 쓸 것이다. 모르면 어쩔 수 없다.하지만 좋은 글은 꺼내서 여러분과 나눠야 합니다.
、
1、
Delphi IDE , , 。Delphi7 , CnPack IDE , Delphi7 IDE , 。
2、
:
(Add-in), DLL IDE 。
(Wizard), IOTAWizard IDE 。
(Repository Wizard), 、 。
(Package),Delphi 。
(Design-time Package), IDE 。
(Runtime Package), DLL 。
(Interface),Delphi COM 。
(Notifier), IDE 。
(Creator), 、 。
(Project),Delphi Project。
(Unit),Delphi Unit。
(Module), IDE , 、 、 。
(Editor),IDE 。
IDE、DLL、Action、Tools API , 。
、 Delphi IDE
1、 IDE
Open Tools API( Tools API), 、 、 IDE。Tools API 100 IDE , 、 、 Action 、 、 、 、 、 、 , 。
Tools API , , 。 Tools API DLL IDE 。 , Tools API 。 , 。
Tools API:
Tools API
Tools API
IDE
2、 Tools API
Tools API :ToolsAPI。 Tools API, designide , Tools API DLL 。 , 。
Tools API IOTAWizard, IDE (Wizards)。 ,C++Builder Delphi 。 Delphi , C++Builder , 。 IDE , 。 Tools API, ToolsAPI 。 Tools API , , IDE 。Tools API , , 。 、 、 。 , Tools API 。
, :
NTA(native tools API) Tools API IDE , IDE TMainMenu 。 , Borland , IDE 。 DLL 。
OTA(open tools API) Tools API , IDE。 , Delphi AnsiString Delphi , COM , Tools API OTA 。 OTA , IDE DLL。
Tools API : , IDE 。 : IDE 。 : (Wizards)、 (Notifiers) (Creators):
, IOTAWizard 。
Tools API 。IDE 。 , Tools API , 、 、 、 ,IDE 。 IDE 。
。Tools API 、 , 。 。
(Module) (Editor)。 , 。 。 IDE : (Source Editor) , (Form Designer) , (Project Resource) 。 。
3、
, 。 :
IOTAFormWizard 、
IOTAMenuWizard Help
IOTAProjectWizard 。
IOTAWizard
:
(Menu Wizard) IDE Help 。 ,IDE Execute 。 , 。
, (Object Repository) 。 , ( Tools|Repository ) 。 “New Form” , IDE “File|New Form” , 。 “Main Form” , IDE 。 “New Project” , “File|New Application” ,IDE 。
。 , , 。
Tools API , 。 ( )。
:
4、
IOTAWizard , , :IOTANotifier IInterface。 , :IOTARepositoryWizard、IOTAWizard、IOTANotifier IInterface。
IInterfac Delphi , COM 。 ,QueryInterface ,_AddRef _Release 。 。 ,ToolsAPI ,TNotifierObject, IOTANotifier 。
IOTANotifier, , IDE , ( TNotifierObject )。 , , , TNotifierObject IOTANotifier 。
5、
, (Wizard Package) Register 。( Register 。) Register , RegisterPackageWizard, , , :
procedure Register;
begin
RegisterPackageWizard(MyWizard.Create);
RegisterPackageWizard(MyOtherWizard.Create);
end;
, 、 , 。
, Delphi , 。 : 。
, : Install 。IDE 。 ,IDE 。
( : DLL , , Delphi7 MyWizard , HKEY_CURRENT_USER\Software\Borland\Delphi\7.0\Experts :MyWizard, DLL )
6、 Tools API
, IDE: 、 、 , 。Tools API , Action Action , , , 。 :
Tools API
INTAServices IDE : 、Action 、 。
IOTAActionServices : 、 、 。
IOTACodeCompletionServices , 。
IOTADebuggerServices 。
IOTAEditorServices 。
IOTAKeyBindingServices 。
IOTAKeyboardServices 。
IOTAKeyboardDiagnostics 。
IOTAMessageServices (Message View) 。
IOTAModuleServices 。
IOTAPackageServices 。
IOTAServices 。
IOTAToDoServices To-Do , To-Do 。
IOTAToolsFilter (Tools Filter Notifiers)。
IOTAWizardServices 。
, SysUtils Supports BorlandIDEServices 。 :
procedure set_keystroke_debugging(debugging: Boolean);
var
diag: IOTAKeyboardDiagnostics
begin
if Supports(BorlandIDEServices, IOTAKeyboardDiagnostics, diag) then
diag.KeyTracing := debugging;
end;
, 。
Tools API :
IDE
7、 IDE
IDE 、 、Action 。( :IDE Tools API 。)
IDE INTAServices , , Action Action , , 。 Action 。 , , , 。
:
Action Action
IDE TMainMenu、TActionList、TImageList TToolBar , 。 IDE , 。 , 。
8、
, 。 IDE , Action , 。 (Image Editor) 16X16 , :
constructor MyWizard.Create;
var
Services: INTAServices;
Bmp: TBitmap;
ImageIndex: Integer;
begin
inherited;
Supports(BorlandIDEServices, INTAServices, Services);
{ Add an image to the image list. }
Bmp := TBitmap.Create;
Bmp.LoadFromResourceName(HInstance, 'Bitmap1');
ImageIndex := Services.AddMasked(Bmp, Bmp.TransparentColor,
'Tempest Software.intro wizard image');
Bmp.Free;
end;
ID 。 。 , 。
9、 Action Action
Action, 。 OnExecute OnUpdate 。 OnUpdate Action, OnUpdate , ,IDE 。Action OnExecute Execute 。 , OnExecute Execute 。
NewAction := TAction.Create(nil);
NewAction.ActionList := Services.ActionList;
NewAction.Caption := GetMenuText();
NewAction.Hint := 'Display a silly dialog box';
NewAction.ImageIndex := ImageIndex;
NewAction.OnUpdate := action_update;
NewAction.OnExecute := action_execute;
Action Action。 。 View , View 。( , : 。 , Delphi 。 。 。)
for I := 0 to Services.MainMenu.Items.Count - 1 do
begin
with Services.MainMenu.Items[I] do
begin
if CompareText(Name, 'ViewsMenu') = 0 then
begin
NewItem := TMenuItem.Create(nil);
NewItem.Action := NewAction;
Insert(0, NewItem);
end;
end;
end;
Actoin IDE Action , Action 。 Action 。 : Action OnClick 。 , Action , 。
10、
, CM_CONTROLCHANGE 。 , ( )。 , Action , IDE ActionList MainMenu 。
procedure remove_action (Action: TAction; ToolBar: TToolBar);
var
I: Integer;
Btn: TToolButton;
begin
for I := ToolBar.ButtonCount - 1 downto 0 do
begin
Btn := ToolBar.Buttons[I];
if Btn.Action = Action then
begin
{ Remove "Btn" from "ToolBar" }
ToolBar.Perform(CM_CONTROLCHANGE, WPARAM(Btn), 0);
Btn.Free;
end;
end;
end;
destructor MyWizard.Destroy;
var
Services: INTAServices;
Btn: TToolButton;
begin
Supports(BorlandIDEServices, INTAServices, Services);
{ Check all the toolbars, and remove any buttons that use this action. }
remove_action(NewAction, Services.ToolBar[sCustomToolBar]);
remove_action(NewAction, Services.ToolBar[sDesktopToolBar]);
remove_action(NewAction, Services.ToolBar[sStandardToolBar]);
remove_action(NewAction, Services.ToolBar[sDebugToolBar]);
remove_action(NewAction, Services.ToolBar[sViewToolBar]);
remove_action(NewAction, Services.ToolBar[sInternetToolBar]);
NewItem.Free;
NewAction.Free;
end;
11、
Tools API IDE 。 , , 。
Tools API , IDE , , 。 , Delphi , “Run|Parameters…” Delphi (delphi32.exe) 。
, 。 , “Run|Run”, Delphi 。 , “Components|Install Package…” 。 Delphi , , 。( , ; ; .bpl 。)
, VCL、CLX RTL , , , 。
12、
, IOTAMessageServices, , IOTAMessageServices50, IOTAMessageServices40。 Delphi 。
Tools API COM , GUID 。 ,Tools API 。 GUID , GUID。 GUID 。
Tools API 。 , Tools API : Borland 。
IDE , 。 , 。
, , , 。
,Delphi 6 : 。 , 。 , IOTAMessageServices , IOTAMessageServices50( 5)。 IOTAMessageServices GUID IOTAMessageServices50 GUID , 。
IOTAIDENotifier 。Delphi 5 overload :AfterCompile BeforeCompile。 IOTAIDENotifer , , , IOTAIDENotifier50 。Delphi 6 , IOTAIDENotifier50。
。 Delphi , 。
13、
Tools API 。 IOTAModule, 。 , (Unit)。 , , (.pas) (.dfm .xfm) 。 IDE , , 。
:
14、
, (IOTAModuleServices) 。 , , 。
, , 、 。 。 , :
{ Return the current project group, or nil if there is no project group. }
function CurrentProjectGroup: IOTAProjectGroup;
var
I: Integer;
Svc: IOTAModuleServices;
Module: IOTAModule;
begin
Supports(BorlandIDEServices, IOTAModuleServices, Svc);
for I := 0 to Svc.ModuleCount - 1 do
begin
Module := Svc.Modules[I];
if Supports(Module, IOTAProjectGroup, Result) then
Exit;
end;
Result := nil;
end;
15、
。 , (.pas) (.dfm) 。 IOTAEditor , 。 , , :
{ Return the form editor for a module, or nil if the unit has no form. }
function GetFormEditor(Module: IOTAModule): IOTAFormEditor;
var
I: Integer;
Editor: IOTAEditor;
begin
for I := 0 to Module.ModuleFileCount - 1 do
begin
Editor := Module.ModuleFileEditors[I];
if Supports(Editor, IOTAFormEditor, Result) then
Exit;
end;
Result := nil;
end;
。 , 、 、 、 , 。
, 。 ( ) IOTAComponent 。 。 , IOTAComponent INTAComponent。 TComponent 。 Class , TFont , NTA 。
16、
Delphi , 。 (Object Repository) , , 。 。
。 , 、 , , ,IDE 。 (Creator) 。
IOTACreator 。 CreateModule ,IDE 。
, GetExisting False, GetUnnamed True。 ( ) ( )。 IDE ( 、 )、 、 。 , 。
, 。 , IOTAFile 。 , IOTAFile nil。
, , , 。 , 。
。 、 , Tools API 。 GetCreatorType Tools API : 。 , sUnit, , sForm。 , , , GetCreatorType 。 , NewImplSource NewIntfSource 。
TCreator = class(TInterfacedObject, IOTAModuleCreator)
public
constructor Create(const CreatorType: string);
{ IOTAModuleCreator }
function GetAncestorName: string;
function GetImplFileName: string;
function GetIntfFileName: string;
function GetFormName: string;
function GetMainForm: Boolean;
function GetShowForm: Boolean;
function GetShowSource: Boolean;
function NewFormFile(const FormIdent, AncestorIdent: string): IOTAFile;
function NewImplSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile;
function NewIntfSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile;
procedure FormCreated(const FormEditor: IOTAFormEditor);
{ IOTACreator }
function GetCreatorType: string;
function GetExisting: Boolean;
function GetFileSystem: string;
function GetOwner: IOTAModule;
function GetUnnamed: Boolean;
private
FCreatorType: string;
end;
TCreator 0、nil 。Boolean True, GetExisting, False。 GetOwner, , nil。 。 ,GetOwner , , , GetOwner 。 , , nil。
function TCreator.GetOwner: IOTAModule;
var
I: Integer;
Svc: IOTAModuleServices;
Module: IOTAModule;
Project: IOTAProject;
Group: IOTAProjectGroup;
begin
{ Return the current project. }
Supports(BorlandIDEServices, IOTAModuleServices, Svc);
Result := nil;
for I := 0 to Svc.ModuleCount - 1 do
begin
Module := Svc.Modules[I];
if Supports(Module, IOTAProject, Project) then
begin
{ Remember the first project module}
if Result = nil then
Result := Project;
end
else if Supports(Module, IOTAProjectGroup, Group) then
begin
{ Found the project group, so return its active project}
Result := Group.ActiveProject;
Exit;
end;
end;
end;
NewFormSource nil, 。 NewImplSource NewIntfSource, IOTAFile 。
TFile IOTAFile , -1 ( ), 。 TFile , ,TFile 。
TFile = class(TInterfacedObject, IOTAFile)
public
constructor Create(const Source: string);
function GetSource: string;
function GetAge: TDateTime;
private
FSource: string;
end;
constructor TFile.Create(const Source: string);
begin
FSource := Source;
end;
function TFile.GetSource: string;
begin
Result := FSource;
end;
function TFile.GetAge: TDateTime;
begin
Result := TDateTime(-1);
end;
, , , 。 , 。 : FormIdent, , , 。 IDE ( ), 。
function TCreator.NewImplSource(
const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile;
var
FormSource: string;
begin
FormSource :=
'{ ----------------------------------------------------------------- ' + #13#10 +
'%s - description'+ #13#10 +
'Copyright © %y Your company, inc.'+ #13#10 +
'Created on %d'+ #13#10 +
'By %u'+ #13#10 +
' ----------------------------------------------------------------- }' + #13#10 + #13#10;
return TFile.Create(Format(FormSource, ModuleIdent, FormIdent,
AncestorIdent));
}
: sUnit , sForm。 , INTAServices File|New 。 OnClieck Execute 。
, IDE 。 , , IDE Check In , 。
17、 IDE
IDE 。 , , 。 , , 。
。 , Tools API , ,IDE 。
IOTANotifier, , IOTANotifier 。 , 。
IOTANotifier
IOTABreakpointNotifier
IOTADebuggerNotifier , /
IOTAEditLineNotifier
IOTAEditorNotifier ,
IOTAFormNotifier , ( )
IOTAIDENotifier , , IDE
IOTAMessageNotifier ( )
IOTAModuleNotifier 、
IOTAProcessModNotifier
IOTAProcessNotifier
IOTAThreadNotifier
IOTAToolsFilterNotifier
, 。 , 。 , 。 , , 。
, 。 CreateModule , 。 , , , ,AfterSave 。 ModuleRenamed, IDE 。 :
TModuleIdentifier = class(TNotifierObject, IOTAModuleNotifier)
public
constructor Create(const Module: IOTAModule);
destructor Destroy; override;
function CheckOverwrite: Boolean;
procedure ModuleRenamed(const NewName: string);
procedure Destroyed;
private
FModule: IOTAModule;
FName: string;
FIndex: Integer;
end;
, 。 , ,IDE Destroyed 。 , 。IDE , 。 , : 。
constructor TModuleNotifier.Create( const Module: IOTAModule);
begin
FIndex := -1;
FModule := Module;
{ Register this notifier. }
FIndex := Module.AddNotifier(self);
{ Remember the module's old name. }
FName := ChangeFileExt(ExtractFileName(Module.FileName), '');
end;
destructor TModuleNotifier.Destroy;
begin
{ Unregister the notifier if that hasn't happened already. }
if Findex >= 0 then
FModule.RemoveNotifier(FIndex);
end;
procedure TModuleNotifier.Destroyed;
begin
{ The module interface is being destroyed, so clean up the notifier. }
if Findex >= 0 then
begin
{ Unregister the notifier. }
FModule.RemoveNotifier(FIndex);
FIndex := -1;
end;
FModule := nil;
end;
,IDE ModuleRenamed 。 , 。 , 。 , , 。
procedure TModuleNotifier.ModuleRenamed(const NewName: string);
var
ModuleName: string;
I: Integer;
Editor: IOTAEditor;
Buffer: IOTAEditBuffer;
Pos: IOTAEditPosition;
Check: string;
begin
{ Get the module name from the new file name. }
ModuleName := ChangeFileExt(ExtractFileName(NewName), '');
for I := 0 to FModule.GetModuleFileCount - 1 do
begin
{ Update every source editor buffer. }
Editor := FModule.GetModuleFileEditor(I);
if Supports(Editor, IOTAEditBuffer, Buffer) then
begin
Pos := Buffer.GetEditPosition;
{ The module name is on line 2 of the comment.
Skip leading white space and copy the old module name,
to double check we have the right spot. }
Pos.Move(2, 1);
Pos.MoveCursor(mmSkipWhite or mmSkipRight);
Check := Pos.RipText('', rfIncludeNumericChars or rfIncludeAlphaChars);
if Check = FName then
begin
Pos.Delete(Length(Check)); // Delete the old name.
Pos.InsertText(ModuleName); // Insert the new name.
FName := ModuleName; // Remember the new name.
end;
end;
end;
end;
? , , 。 , IOTAEditLineNotifier IOTAEditLineTracker 。
, 。 , , , 。 , ,IDE 。 , , 。 , , Destroyed , ,
Execute 。 , , (TInterfaceList)。
procedure DocWizard.Execute;
var
Svc: IOTAModuleServices;
Module: IOTAModule;
Notifier: IOTAModuleNotifier;
begin
{ Return the current project. }
Supports(BorlandIDEServices, IOTAModuleServices, Svc);
Module := Svc.CreateModule(TCreator.Create(creator_type));
Notifier := TModuleNotifier.Create(Module);
list.Add(Notifier);
end;
。 , IDE 。 IDE 。 , 。 , 。
destructor DocWizard.Destroy; override;
var
Notifier: IOTAModuleNotifier;
I: Integer;
begin
{ Unregister all the notifiers in the list. }
for I := list.Count - 1 downto 0 do
begin
Supports(list.Items[I], IOTANotifier, Notifier);
{ Pretend the associated object has been destroyed.
That convinces the notifier to clean itself up. }
Notifier.Destroyed;
list.Delete(I);
end;
list.Free;
FItem.Free;
end;
、 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.