Jump to content

Recommended Posts

Posted

Olá pessoais, precisava de uma pequena ajuda.

Tenho uma ListView com 3 colunas. A primeira são checkbox para poder escolher a linha, a segunda são os nomes dos programas para instalar e a terceira são os caminhos (localizações) dos programas.

Quando seleccionado um programa, está a ser instalado depois fecha, ou seja, isso está bem.

Agora, o meu problema é que se escolho dois ou mais programas não vão ser instalados.

Queria um código que permite, por exemplo, se escolho dois ou mais programas para ser instalado, só o primeiro programa deve instalar-se e quando acabar a instalação, muda logo pelo segundo programa para ser instalado.

O meu chefe aconselhou-me para usar "Thread" mas não conheço bem isto.

Obrigado.

Whalatta

Posted

Se usares aquele loop que te mostrei há dias, quando perguntaste pela maneira de passar a descrição para o TMemo, quando terminar a primeira instalação ele irá fechar aquela segunda form, e reabre-a outra vez, com o programa seguinte.

A alternativa de usar threads é uma hipotese, mas se não estás à vontade com isso, talvez seja melhor não fazeres, ou se fizeres, teres a noção que threads mal usadas vão com certeza criar problemas de dificil resolução.

De qualquer maneira, deixo-te um link de um topico cá do forum onde se falou de threads, com um exemplo de utilização:

http://www.portugal-a-programar.pt/topic/50251-simular-multithreading-em-pascal/#entry436618

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

É que pensava que não tinha outras maneiras para fazer que usar "Thread". Mas se pode criar problemas então prefiro não usar.

Então, se dá com o loop que vocês mostravam-me há dias, então, prefiro usar esta maneira.

É assim, eu queria que quando escolho 2 programas, aparece o bloco de notas e que a instalação do primeiro programa começa (Os dois ao mesmo tempo), quando a instalação está acabada, fecha o form do Tmemo e da instalação (sem eu precisar de fazer alguma coisa) e abra o bloco de nota e a instalação do segundo programa sem dar erros.

Não sei se expliquei bem.. Mas espero que vocês iam perceber.

Obrigado pelo link (vou dar uma pequena vista).

Whalatta

Posted

Podes sempre fazer sem threads.

As threads só são obrigatórias se precisares de fazer mais do que uma tarefa em simultaneo. No caso julgo que até nem convém, estar a instalar dois programas ao mesmo tempo pode criar instabilidade.

- Basicamente, o que precisas é englobar o código que tens feito desde a criação à finalização da 2ª form (onde a instalação se processa, certo?) dentro de um ciclo FOR.

- O ciclo deverá correr desde o 1º item da listview até ao ultimo (de 0 a listview.items.count -1).

- Dentro do ciclo tens de colocar um if, que teste se o items actual está Checked. Se estiver, corre o teu código, se não estiver não faz nada

Poderás ter de alterar o teu código no sentido de ele saber, de cada vez que corre, qual o item que está a abrir. Para isso tens de usar a variável indice do ciclo FOR de cada vez que precises referir-te a um item.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

Já agora, a ultima coisa que fazes no ciclo, já depois de fechares a 2ª form, deverá ser a finalização do processamento de mensagens do windows, para teres a certeza de que antes de começar uma nova instalação, a antiga está completamente concluida.

Para isso, basta podes antes do End relativo ao ciclo (ou mais concretamente, ao If que testa se o item está Checked), deves colocar a seguinte linha:

.
.
for i:=0 to ListView1.Items.Count - 1 do
  if ListView1.Items[i].Checked
     then begin
             .
             .
             .
             Application.ProcessMessages;  // Insere esta linha no final do FOR
          end;
Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

Era só inserir esta linha "Application.ProcessMessages;" né?

Mas com isto não me aparece as instalações (Form4)..

É melhor mostrar qual código que tenho neste momento.

procedure TForm1.Button1Click(Sender: TObject);
//label erro;
var
  i:integer;
begin
 form7:=Tform7.Create(self);
 for i := 0 to listview1.Items.Count-1 do
	 if listview1.Items[i].Checked
		then with Form7 do
				 begin
					  Memo1.Lines.Clear;
					  Memo1.Lines.Add(listview1.Items[i].SubItems[1]);
					  ShowModal;
					  Application.ProcessMessages;
				 end;
			  form7.Free;
 //   goto erro;
Application.CreateForm(TForm4, Form4);
  Form4.install;
// erro:
  //	ShowMessage('Não foi encontrado o caminho pretendido!!');
 //Form1.Hide;
 ////WinExec('comandos.dll', SW_NORMAL);
 //Proc := TProcess.Create(nil);
 //for x in ListView1.Items do
 //	begin
 //		 if x.Checked then
 //			begin
 //			  Proc.CommandLine := x.SubItems.Strings[0] ;
 //			  Proc.Execute;
 //			  //Fid(Proc.ProcessID);
 //			  //Proc.WaitOnExit;
 //			  repeat until ((not Proc.Running) or (button.click));
 //			  if button.click;
 //			  Form3.
 //			  //DeleteFile('temp.dll') ;
 //			end;
 //	end;
 //Form1.Show;
 //WinExec('taskkill /F /IM comandos.dll /T', SW_HIDE);
end;													  

Form7 = Bloco de notas, Form4 = Instalações e Form1 = listView.

Com este código (se escolho 2 programos), mostra-me o primeiro bloco de notas, o segundo bloco de nota e depois a primeira instalação e depois a segunda.

Mas eu queria o primeiro bloco de nota e a primeira instalação (ao mesmo tempo) e depois o segundo bloco de nota e a instalação.

Obrigado pela ajuda.

Whalatta

Edited by thoga31
GeSHi
Posted

Aquelas linhas todas em comentário é de proposito?

O quê que te faz a instalação, é aquele Form4.Install, certo?

O que tens de fazer é usar apenas um ciclo para o bloco de notas e para a instalação. Como tens dois, ele faz primeiro o de cima (bloco de notas) e depois o de baixo (que possivelmente tens dentro do install.

Recomendação:

A ser verdade que tens um ciclo dentro do Form4.Install, remove-o, e usa só o do bloco de notas (ou vice-versa, removes o do bloco de notas e metes as linhas dentro do ciclo do install).

É preciso é que tanto o bloco de notas como a instalação use o mesmo ciclo.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Sim, as linhas são comentários sobre o que se passa na parte da instalação.

Sim, é o Form4 que serve a instalar.

Se eu percebi bem vou ter que fazer 2 ciclo "For", um pelas instalações e outro pelos blocos de notas, certo?

Whalatta

Posted

Não. Dois FOR já tu tens!

É preciso é que passe a ser só um, para fazer os dois trabalhos. Só assim dá para ligar uma coisa à outra, ou neste caso, o bloco de notas à instalação em curso.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

Tipo assim?

var
i:integer;
begin
form7:=Tform7.Create(self);
Application.CreateForm(TForm4, Form4);
for i := 0 to listview1.Items.Count-1 do
if listview1.Items[i].Checked
then with Form7 do
begin
Memo1.Lines.Clear;
Memo1.Lines.Add(listview1.Items[i].SubItems[1]);
ShowModal;
Form4.install;
Application.ProcessMessages;
end;
form7.Free;
Form4.free;
end;

Whalatta

Edited by nunopicado
Indicação da linguagem ao GeShi
Posted

Sim, tipo isso. Mas isso implica alterares o teu form4.install, de modo a que ao correres esse procedimento ele instale apenas o item indicado, e não os corra todos novamente.

Ficaria algo tipo

.
.
form4.install(i);
.
.

E dentro do procedimento instalas apenas o programa que têm o índice i

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.