Fórum Criação De Wizards Para A Ide Do Delphi. #354045

19/02/2008

0

Pessoal, estou usando o Delphi para fazer um wizard que me possibilite criar forms e conexão a banco de dados da forma que estou acostumado, uso Delphi 7, minha dúvida é a seguinte:

Como eu faço para que o wizard que eu to fazendo se instale num novo menu na IDE do Delphi, pq da forma que eu estou fazendo ele está sendo instalado no Menu ´Help´ do Delphi, e isso além de não ser nada elegante não me possibilita a criação de submenus.

Valeu.


Lincesmarques

Lincesmarques

Responder

Posts

19/02/2008

Host

Estou desenvolvendo um backup para delphi e estou colocando no menu Edit abaixo do delete. Espero que tenha lhe ajudado.

var
EditMenu: TMenuItem;
InsertPosition: Integer;
Item: TMenuItem;
I: Integer;
begin
EditMenu := (BorlandIDEServices as INTAServices).MainMenu.Items[1];

// Move all the items from PopupMenu1 to the Edit menu,
// right after SelectAll.

// Start by finding where to insert the new item.
InsertPosition := EditMenu.Count; // default is at end of menu
for I := 0 to EditMenu.Count-1 do
if CompareText(EditMenu[I].Name, ´EditSelectAll´) = 0 then
begin
InsertPosition := I;
Break;
end;

for I := PopupMenu1.Items.Count-1 downto 0 do
begin
// Remove the item from the popup menu.
Item := PopupMenu1.Items[I];
PopupMenu1.Items.Delete(I);
// Then add it to Delphi´s menu.
EditMenu.Insert(InsertPosition, Item);
end;


Responder

Gostei + 0

19/02/2008

Host

Claro tem que usar o ToolsAPI na sessão uses.


Responder

Gostei + 0

19/02/2008

Lincesmarques

Mano é isso mesmo, Open Tools API, to lendo muita coisa a respeito, meu wizard ta até feito, mas não consigo criar um menu na IDE do delphi pra por ele. Seguinte o pedaço de código que vc me enviou ta colocando a onde? na função ´GetIDString´ ??


Responder

Gostei + 0

19/02/2008

Host

É um pouco mais complicado ..... mas vou ser bem teu amigo ..... vou dxar vc quebrar sua cabeça pra descobrir. Na real foi assim que fiz .... poe o codigo e roda que vc verá o que acontece. Dpois me fala.



procedure TfrMBackup.FormCreate(Sender: TObject);
var
EditMenu: TMenuItem;
InsertPosition: Integer;
Item: TMenuItem;
I: Integer;
begin
EditMenu := (BorlandIDEServices as INTAServices).MainMenu.Items[1];

// Move all the items from PopupMenu1 to the Edit menu,
// right after SelectAll.

// Start by finding where to insert the new item.
InsertPosition := EditMenu.Count; // default is at end of menu
for I := 0 to EditMenu.Count-1 do
if CompareText(EditMenu[I].Name, ´EditSelectAll´) = 0 then
begin
InsertPosition := I;
Break;
end;

for I := PopupMenu1.Items.Count-1 downto 0 do
begin
// Remove the item from the popup menu.
Item := PopupMenu1.Items[I];
PopupMenu1.Items.Delete(I);
// Then add it to Delphi´s menu.
EditMenu.Insert(InsertPosition, Item);
end;
end;


Responder

Gostei + 0

19/02/2008

Lincesmarques

Mano, muito bom isso, usando suas dicas e adaptando um pouco com o Gexperts eu consegui criar o item de menu na IDE do Delphi, fazendo assim:

function TADPCHStickerWizard.GetIDString: string;
begin
AddMenuItem(Self);
end;

procedure TADPCHStickerWizard.AddMenuItem;
var
MainMenu: TMainMenu;
Temp, ToolsMenuItem: TMenuItem;
begin
inherited Create;

// Cria o menu.
FGExpertsTopLevelMenu := TMenuItem.Create(nil);
{$IFDEF GX_UseMenuShortCutInitializationWorkAround}
FGExpertsTopLevelMenu.OnClick := TopLevelMenuClick;
{$ENDIF GX_UseMenuShortCutInitializationWorkAround}

FGExpertsTopLevelMenu.Caption := ´Meu E&xpert´;
FGExpertsTopLevelMenu.Name := ´MeuExpert´;

// Insere o menu na IDE.
MainMenu := (BorlandIDEServices as INTAServices).MainMenu;
MainMenu.Items.Insert(MainMenu.Items.Count - 2, FGExpertsTopLevelMenu);

// Aqui vai ser inserido os sub itens do menu posteriormente

// Insere o separador (por enquanto sem uso).
Temp := TMenuItem.Create(FGExpertsTopLevelMenu);
Temp.Caption := ´-´;
Temp.Name := ´GX_Sep1´;
FGExpertsTopLevelMenu.Add(Temp);
end;

Agora vou colocar os sub itens do menu, espero :)


Responder

Gostei + 0

22/02/2008

Lincesmarques

Po, to quase la. ele a criando o menu, só que ta criando 2, executa esse código ai pra vcs verem:

------------------------------
unit ADWizard;

interface

uses
ToolsAPI, Windows, SysUtils, Classes, Forms, Messages, Menus;

type
TADPCHStickerWizard = class(TNotifierObject, IOTAWizard, IOTAMenuWizard)
public
{ IOTAWizard }
function GetIDString: string;
function GetName: string;
function GetState: TWizardState;
procedure Execute;
{ IOTAMenuWizard }
function GetMenuText: string;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterPackageWizard(TADPCHStickerWizard.Create);
end;

procedure TADPCHStickerWizard.Execute;
var
i : integer;
MainMenu: TMainMenu;
MenuPrincipal: TMenuItem;
begin
inherited Create;
MainMenu := (BorlandIDEServices as INTAServices).MainMenu;
MenuPrincipal := TMenuItem.Create(nil);
MenuPrincipal.Caption := ´Me&u Wizard´;
MenuPrincipal.Name := ´Meu´;
// Insert menu in the IDE.
MainMenu.Items.Insert(9, MenuPrincipal);
end;

function TADPCHStickerWizard.GetIDString: string;
begin
Result := ´Some.MeuWizard´;
Execute;
end;

function TADPCHStickerWizard.GetMenuText: string;
begin
Result := ´Me&u Wizard´;
end;

function TADPCHStickerWizard.GetName: string;
begin
Result := ´Some.MeuWizard´;
end;

function TADPCHStickerWizard.GetState: TWizardState;
begin
Result := [wsEnabled];
end;

procedure InitWizard;
begin
// nothing needed
end;

procedure DoneWizard;
begin
// Remove
end;

initialization
InitWizard;

finalization
DoneWizard;


end.
---------------------------

Alguem poderia dar uma olhada ai? Me da um help.


Responder

Gostei + 0

06/03/2008

Ara.es

estou tendo o mesmo problema que algumas pessoas nesse topico, meu wizard está funcionando legal, so que ele está sendo inserido no menu Help, queria que fosse inserido no menu Tools. como posso fazer isso?? desde já agradeço aos que colaborarem. valeu !!


Responder

Gostei + 0

06/03/2008

Lincesmarques

Cara, até hoje não consegui também. Não consigo achar uma resposta clara pra isso, pior que tem vários wizards que fazem isso. Observando eles me pareceu que eles pegam uma cópia da ToolsAPI e a modificam para inserir um menu principal com o nome deles na IDE do Delphi. Mas realmente tá dificil viu.

Ainda continuo precisando disso.


Responder

Gostei + 0

06/03/2008

Ara.es

Tenso mesmo. Agora eu não consigo mexer nisso, mas no fim de semana, irei dar uma olhada com calma se conseguir algo novo te falo.. valeu !!


Responder

Gostei + 0

06/03/2008

Ara.es

NoiadoXm testei com seu codigo, e descobrir algumas coisas, ja consigo inserir em qualquer item que desejo, assim como descobrir por que o seu codigo estava duplicado o item. Retirei algumas coisas do seu codigo, na verdada acabei alterando ele todo, mas tem coisas que tem nele que nao uso mais. Irei verificar mais algumas coisas e posto aqui mais tarde. qualquer coisa pergunte.


Responder

Gostei + 0

06/03/2008

Lincesmarques

Obaaaaa. o f.o.d.a era a duplicação do item que ele tava fazendo..


Responder

Gostei + 0

06/03/2008

Lincesmarques

Amigo e ai? Conseguiu? Manda o código ai pra gente.


Responder

Gostei + 0

07/03/2008

Ara.es

Noiadox, primeiro falarei do erro da duplicacao.

Uma das funções que temos que implementar, que está definida numa das interfaces, e a GetIDString que retorna o ID do seu Wizard, e nela vc chamava o metodo execute. O que creio que estava acontecendo é que o delphi deve chamar essa função sempre que renderiza o menu, e quando vc instalava ele devia estar chamando esse metodo varias vezes e executando o metodo execute tbm varias vezes. tanto que vc disse que com vc o codigo estava duplicando, na minha maquina ele nao estava duplicando e sim triplicando.. ou seja aparecida tres vezes o item.


Responder

Gostei + 0

07/03/2008

Ara.es

NoiadoX, na sua implementação vc usa os metodo register, initWizard e DoneWizard, nos materiais que encontrei nenhum utilizava esses metodos. mas acabei utilizando o initWizard para inserir o item. O que fiz foi: Coloquei o registro do wizard (RegisterPackageWizard(TADPCHStickerWizard.Create) ) na parte initialization da unit, junto com o metodo InitWizard. No metodo Initwizard eu coloquei o codigo que insere o item no menu do delphi.

Veja como ficou:

unit saa;

interface

uses
  ToolsAPI, Windows, SysUtils, Classes, Forms, Messages, Menus, Dialogs;

type
  TADPCHStickerWizard = class(TNotifierObject, IOTAWizard, IOTAMenuWizard)
public
    { IOTAWizard }
    function GetIDString: string;
    function GetName: string;
    function GetState: TWizardState;
  procedure Execute;
    { IOTAMenuWizard }
    function GetMenuText: string;
    procedure ItemClick(Sender : TObject);
end;

implementation

procedure TADPCHStickerWizard.Execute;
begin 
// 
end; 

function TADPCHStickerWizard.GetIDString: string; 
begin 
  Result := ´Some.MeuWizard´;
end;

function TADPCHStickerWizard.GetMenuText: string;
begin
  Result := ´Me&u Wizard´;
end;

function TADPCHStickerWizard.GetName: string;
begin
  Result := ´Some.MeuWizard´;
end;

function TADPCHStickerWizard.GetState: TWizardState;
begin
  Result := [wsEnabled];
end;

procedure TADPCHStickerWizard.ItemClick(Sender: TObject);
begin
  ShowMessage(´TADPCHStickerWizard´);
end;

procedure InitWizard;
var
  i : integer;
  MainMenu: TMainMenu;
  MenuPrincipal: TMenuItem;
begin
  MainMenu := (BorlandIDEServices as INTAServices).MainMenu; 
  MenuPrincipal := TMenuItem.Create(nil); 
  MenuPrincipal.Caption := ´Me&u Wizard´; 
  MenuPrincipal.Name := ´Meu´;
  MenuPrincipal.OnClick := ItemClick 
  // Insert menu in the IDE. 
  MainMenu.Items.Insert(9, MenuPrincipal);  
end;

procedure DoneWizard;
begin
// Remove
end;

initialization
  RegisterPackageWizard(TADPCHStickerWizard.Create);
  InitWizard;

end.


Ainda estou vendo umas possibilidades, qualquer coisa me escreva. Quando terminar de ver outras coisas eu posto aqui. Flw!!


Responder

Gostei + 0

07/03/2008

Ara.es

NoiadoX, esse código tem um problema, que estou tentando resolver, e acabou indo um parte da correção do problema. por favor retire a linha ´MenuPrincipal.OnClick := ItemClick´ do método InitWizard. O problema o seguinte como o metodo InitWizard não faz parte da classe TADPCHStickerWizard, ele não consegue acessar os métodos desta classe. já arrumou um jeito de acertar isso, só que não acho q é a melhor solução por isso estou procurando uma melhor. A solução que encontrei foi, criar um metodo que adiciona os items no menu do delphi dentro da classe TADPCHStickerWizard, e no InitWizard, vc declarar uma variavel do tipo da classe, instaciar essa variavel e depois chamar o metodo por esse objeto.

mas ou menos assim:

unit saa;

interface

uses
  ToolsAPI, Windows, SysUtils, Classes, Forms, Messages, Menus, Dialogs;

type
  TADPCHStickerWizard = class(TNotifierObject, IOTAWizard, IOTAMenuWizard)
public
    { IOTAWizard }
    function GetIDString: string;
    function GetName: string;
    function GetState: TWizardState;
  procedure Execute;
    { IOTAMenuWizard }
    function GetMenuText: string;
    procedure ItemClick(Sender : TObject);
    procedure AdicionarItem;
end;

implementation

procedure TADPCHStickerWizard.AdicionarItem;
var
  i : integer;
  MainMenu: TMainMenu;
  MenuPrincipal: TMenuItem;
begin
  MainMenu := (BorlandIDEServices as INTAServices).MainMenu; 
  MenuPrincipal := TMenuItem.Create(nil); 
  MenuPrincipal.Caption := ´Me&u Wizard´; 
  MenuPrincipal.Name := ´Meu´;
  MenuPrincipal.OnClick := ItemClick; 
  // Insert menu in the IDE. 
  MainMenu.Items.Insert(9, MenuPrincipal);
end;

procedure TADPCHStickerWizard.Execute;
begin 
// 
end; 

function TADPCHStickerWizard.GetIDString: string; 
begin 
  Result := ´Some.MeuWizard´;
end;

function TADPCHStickerWizard.GetMenuText: string;
begin
  Result := ´Me&u Wizard´;
end;

function TADPCHStickerWizard.GetName: string;
begin
  Result := ´Some.MeuWizard´;
end;

function TADPCHStickerWizard.GetState: TWizardState;
begin
  Result := [wsEnabled];
end;

procedure TADPCHStickerWizard.ItemClick(Sender: TObject);
begin
  ShowMessage(´TADPCHStickerWizard´);
end;

procedure InitWizard;
var
  obj : TADPCHStickerWizard;
begin
  obj := TADPCHStickerWizard.Create;
  obj.AdicionarItem;
end;

procedure DoneWizard;
begin
// Remove
end;

initialization
  RegisterPackageWizard(TADPCHStickerWizard.Create);
  InitWizard;

end.


Cara acho que é isso, qualquer novidade posto aqui. Estou tentando agora: Quando chamar o wizard, através dele eu acessar o código aberto, assim como estabelecer um atalho para o mesmo. Valeu. Flw!!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar