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