Adicionar unit ao projeto em Run Time

Delphi

16/05/2008

Olá,
Como faço para adicionar uma unit, a partir de um endereço armazenado num edit em run time e como pegar o nome do Form desta unit?

Att
Dalton


Dbergkamps10

Dbergkamps10

Curtidas 0

Respostas

Dbergkamps10

Dbergkamps10

16/05/2008

upando...


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

up


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

sobe


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

alguém se habilita?


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

Caramba, já procurei em todo buraco e nao achei. Aqui o post ta com quase uma semana e não temos nem ideia de como se faz isso... :lol: :lol: :lol:
Será que é impossível????
Se puderem indicar algum material ficarei grato.

Obrigado.

Att
Dalton


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

16/05/2008

acho que isso não é possível.

você pode utilizar um interpretador de scripts pra algo bem específico, mas creio não ser possível fazer exatamente como você quer, pois seria necessário compilar a unit...


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

Olá,
Prezado Emerson,
Obrigado pela força. Eu só quero adicionar a unit a um projeto especifico, mas nao quero compilar. vai ser assim: escolho o .dpr e depois escolho a unit a ser adicionado a este dpr, mas nao vou compilar.

Se puder dar mais uma forcinha agradeço.

Att
Dalton


GOSTEI 0
Brunodsr

Brunodsr

16/05/2008

Nao ha como adicionar units a um projeto em runtime, exceto se vc o fizer por DLLs. Cria chamadas para DLLs em runtime. Mas é só a chamada ok? Cada DLL será um módulo. Aconselho a gravar o nome dos forms que vc quer em um arquivo INI.

//Procedure para carregar modulos em runtime
procedure TFormPrincipal.CarregaFormDe(const NomeDaDLL: String);
type
  TMetodoDeNotificacao = procedure of object;
  TFuncaoDeForm = function(Owner: TComponent; MetodoDeNotificacao: TMetodoDeNotificacao): TForm;
var
  CriaForm: TFuncaoDeForm;
begin
  LiberaForm;
  FIdentificador := LoadLibrary(PChar(NomeDaDLL));
  if FIdentificador = 0 then
  begin
    ExibeErro(´Não foi possível carregar o arquivo "´ + NomeDaDLL + ´"!´);
    Exit;
  end; // if
  try
    @CriaForm := GetProcAddress(FIdentificador, ´CriaForm´);
    if @CriaForm = nil then
    begin
      ExibeErro(´Não foi possível encontrar a função "CriaForm" no arquivo "´ +
                NomeDaDLL + ´"!´);
      Abort;
    end; // if
    FForm := CriaForm(Application, AcionaTimerDeLiberacao);
    FForm.ShowModal;
  except
    FreeLibrary(FIdentificador);
    FIdentificador := 0;
  end; // try-except
end;

//Usando a procedure
procedure TFormPrincipal.ButtonExibirClick(Sender: TObject);
begin
  ExibeInformacao(´Carregando o módulo, criando o form e exibindo-o...´);
  CarregaFormDe(´ModuloTeste.dll´);
  ExibeInformacao(´Tudo ok.´);
end;


Espero ter ajudado. Caso sinta dúvidas, me da um toque e eu te passo os fontes com um exemplo ok?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

16/05/2008

Olá, Prezado Emerson, Obrigado pela força. Eu só quero adicionar a unit a um projeto especifico, mas nao quero compilar. vai ser assim: escolho o .dpr e depois escolho a unit a ser adicionado a este dpr, mas nao vou compilar. Se puder dar mais uma forcinha agradeço. Att Dalton

o que você quer é manipular o ´texto´ do dpr? incluir os units como se fosse o Delphi incluindo, editando o arquivo dpr?


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

Olá
Exatamente isso amigo emerson. Como faço pra conseguir isso?
Att
Dalton


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

upando...


GOSTEI 0
Mazzi

Mazzi

16/05/2008

... Olha meu caro... se tu apenas editar o ´texto´-codigo do .DPR... nao vai adiantar muito se o mesmo nao for compilado, pra vc ter o efeito desejado.


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

Olá,
Mazzi obrigado pela força.
O q eu quer fazer eh o seguinte: tenho um exe rodando. Nele, tenho a opção de escolher um arquivo dpr. Tambem tenho a opção de adicionar os arquivos *.pas que faram parte desse dpr. O que eu quero eh codigo pra adicionar o *.pas ao dpr em run time.

Att
Dalton


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

Upando...


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

Up.


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

Up


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

16/05/2008

unit AddUnitDPR;

interface
  uses Classes, SysUtils, Forms, StdCtrls, Controls;

type
  TAddUnitDPR = class
  private
    FDPR: string;
    FUnit: string;
    FArquivoDPR: TStringList;
    FFormExibeDPR: TForm;
    FMemoExibeDPR: TMemo;
    procedure SetDPR(const Value: string);
    function Add: boolean;
  public
    constructor Create;
    destructor Destroy; override;

    property DPR: string read FDPR write SetDPR;
    property UnitAdicionar: string read FUnit write FUnit;
    property ArquivoDPR: TStringList read FArquivoDPR;

    function AddUnit(FUnitAdd: string): boolean;
    procedure ExibeDPR;
    procedure SalvaDPR(NomeDoProjeto: string = ´´);
  end;

implementation

{ TAddUnitDPR }

function TAddUnitDPR.Add: boolean;
var
  i, FAdicionarLinha: integer;
  FAcheiUses: boolean;
  FNomeDoArquivo, FNomeDoArquivoSemExtensao, FExtensaoDoArquivo,
  FPastaDoArquivo, FPastaDoProjeto, FConteudoLinha: string;
begin
  FAcheiUses := False;
  FAdicionarLinha := -1;

  FNomeDoArquivo := ExtractFileName(FUnit);
  FExtensaoDoArquivo := ExtractFileExt(FUnit);
  FPastaDoArquivo := AnsiUpperCase(ExtractFilePath(FUnit));
  FPastaDoProjeto := AnsiUpperCase(ExtractFilePath(FDPR));
  FNomeDoArquivoSemExtensao :=
    Copy(FNomeDoArquivo, 1, Length(FNomeDoArquivo) - Length(FExtensaoDoArquivo));

  if FPastaDoArquivo <> FPastaDoProjeto then
    FNomeDoArquivo := FUnit;

  FConteudoLinha := ´  ´ + FNomeDoArquivoSemExtensao +
    ´ in ´ + QuotedStr(FNomeDoArquivo)+´;´;

  for i := 0 to FArquivoDPR.Count-1 do
    if UpperCase(FArquivoDPR[i]) = ´USES´ then
      FAcheiUses := True
    else
    if (Trim(FArquivoDPR[i]) = ´´) and FAcheiUses then
    begin
      FAdicionarLinha := i;
      break;
    end;

  Result := FAcheiUses and (FAdicionarLinha >= 0);

  if Result then
  begin
    FArquivoDPR[FAdicionarLinha-1] :=
      StringReplace(FArquivoDPR[FAdicionarLinha-1], ´;´, ´,´, []);
    FArquivoDPR.Insert(FAdicionarLinha, FConteudoLinha);
  end;
end;

function TAddUnitDPR.AddUnit(FUnitAdd: string): boolean;
begin
  FUnit := FUnitAdd;
  Result := Self.Add;
end;

constructor TAddUnitDPR.Create;
begin
  FArquivoDPR := TStringList.Create;
  FFormExibeDPR := TForm.Create(nil);
  FFormExibeDPR.Width := Trunc(Screen.Width * 0.8);
  FFormExibeDPR.Height := Trunc(Screen.Height * 0.8);
  FFormExibeDPR.Position := poScreenCenter;

  FMemoExibeDPR := TMemo.Create(FFormExibeDPR);
  FMemoExibeDPR.Parent := FFormExibeDPR;
  FMemoExibeDPR.ReadOnly := True;
  FMemoExibeDPR.ScrollBars := ssBoth;
  FMemoExibeDPR.Align := alClient;
end;

destructor TAddUnitDPR.Destroy;
begin
  FFormExibeDPR.Free;
  FArquivoDPR.Free;

  inherited;
end;

procedure TAddUnitDPR.ExibeDPR;
begin
  FMemoExibeDPR.Lines.Assign(FArquivoDPR);
  FFormExibeDPR.Show;
end;

procedure TAddUnitDPR.SalvaDPR(NomeDoProjeto: string);
var
  FstrProjeto: string;
begin
  if NomeDoProjeto <> ´´ then
    FstrProjeto := NomeDoProjeto
  else
    FstrProjeto := FDPR;

  FArquivoDPR.SaveToFile(FstrProjeto);
end;

procedure TAddUnitDPR.SetDPR(const Value: string);
begin
  if FDPR <> Value then
  begin
    FDPR := Value;
    FArquivoDPR.LoadFromFile(FDPR);
  end;
end;

end.


como usar:
AddUnitDPR := TAddUniDPR.Create; // cria a instância da classe
AddUnitDPR.DPR := Nome_Do_Arquivo_DPR; // arquivo DPR
AddUnitDPR.AddUnit(Nome_Da_Unit); // adiciona a unit
AddUnitDPR.ExibeDPR; // exibe o conteúdo do dpr com a unit adicionada
AddUnitDPR.SalvaDPR(Nome_Do_Arquivo_DPR); // se for informado algum nome de arquivo no parâmetro, o dpr será salvo com esse nome. caso contrário será gravado com o nome informado na propriedade DPR

segue a definição de um form criado como exemplo:
unit uAlterarDPR;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, StrUtils, AddUnitDPR;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    RichEdit1: TRichEdit;
    OpenDialog1: TOpenDialog;
    Button2: TButton;
    Edit2: TEdit;
    Button3: TButton;
    OpenDialog2: TOpenDialog;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
    AddUnitDPR: TAddUnitDPR;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  AddUnitDPR := TAddUnitDPR.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    Edit1.Text := OpenDialog1.FileName;
    AddUnitDPR.DPR := OpenDialog1.FileName;

    RichEdit1.Clear;
    RichEdit1.Lines.AddStrings(AddUnitDPR.ArquivoDPR);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if OpenDialog2.Execute then
    Edit2.Text := OpenDialog2.FileName;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  AddUnitDPR.AddUnit(Edit2.Text);
  RichEdit1.Lines.Assign(AddUnitDPR.ArquivoDPR);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  AddUnitDPR.ExibeDPR;
end;

end.



GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

Valeu grande emerson!!!!
Vou testar e postar aqui o resultado.
Desculpa ae as importunações no MSN
flw


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

16/05/2008

faltam algumas consistências, como verificar se um DPR foi escolhido antes de adicionar a unit, e outras coisinhas.


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

Olá,
CARACA q unit porreta, emerson!!!!!!!!!!!!!!!!!!!!!!
Kra, preciso de mais uma ajuda se possível. Preciso listar num list box, todas as units de um dpr, capturado pela função q vc postou. Depois de escolher, preciso retornar o nome do Form da unit escolhida.
Se alguem puder ajudar, fico grato.
Mais uma vez obrigado,

Att
Dalton


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

uppp


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

upando de novo...


GOSTEI 0
Dbergkamps10

Dbergkamps10

16/05/2008

upando de novo...


GOSTEI 0
POSTAR