Adicionar unit ao projeto em Run Time
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
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
Curtidas 0
Respostas
Dbergkamps10
16/05/2008
upando...
GOSTEI 0
Dbergkamps10
16/05/2008
up
GOSTEI 0
Dbergkamps10
16/05/2008
sobe
GOSTEI 0
Dbergkamps10
16/05/2008
alguém se habilita?
GOSTEI 0
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
Será que é impossível????
Se puderem indicar algum material ficarei grato.
Obrigado.
Att
Dalton
GOSTEI 0
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...
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
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
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
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.
Espero ter ajudado. Caso sinta dúvidas, me da um toque e eu te passo os fontes com um exemplo ok?
//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
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
16/05/2008
Olá
Exatamente isso amigo emerson. Como faço pra conseguir isso?
Att
Dalton
Exatamente isso amigo emerson. Como faço pra conseguir isso?
Att
Dalton
GOSTEI 0
Dbergkamps10
16/05/2008
upando...
GOSTEI 0
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
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
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
16/05/2008
Upando...
GOSTEI 0
Dbergkamps10
16/05/2008
Up.
GOSTEI 0
Dbergkamps10
16/05/2008
Up
GOSTEI 0
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
16/05/2008
Valeu grande emerson!!!!
Vou testar e postar aqui o resultado.
Desculpa ae as importunações no MSN
flw
Vou testar e postar aqui o resultado.
Desculpa ae as importunações no MSN
flw
GOSTEI 0
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
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
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
16/05/2008
uppp
GOSTEI 0
Dbergkamps10
16/05/2008
upando de novo...
GOSTEI 0
Dbergkamps10
16/05/2008
upando de novo...
GOSTEI 0