Whalattax Posted May 31, 2012 at 09:11 AM Report #459335 Posted May 31, 2012 at 09:11 AM 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
nunopicado Posted May 31, 2012 at 11:04 AM Report #459415 Posted May 31, 2012 at 11:04 AM 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.
Whalattax Posted May 31, 2012 at 11:15 AM Author Report #459425 Posted May 31, 2012 at 11:15 AM É 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
nunopicado Posted May 31, 2012 at 11:58 AM Report #459437 Posted May 31, 2012 at 11:58 AM 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.
nunopicado Posted May 31, 2012 at 12:36 PM Report #459444 Posted May 31, 2012 at 12:36 PM (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 May 31, 2012 at 12:40 PM 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.
Whalattax Posted May 31, 2012 at 01:15 PM Author Report #459452 Posted May 31, 2012 at 01:15 PM (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 May 31, 2012 at 08:44 PM by thoga31 GeSHi
nunopicado Posted May 31, 2012 at 08:33 PM Report #459557 Posted May 31, 2012 at 08:33 PM 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.
Whalattax Posted June 1, 2012 at 08:19 AM Author Report #459621 Posted June 1, 2012 at 08:19 AM 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
nunopicado Posted June 1, 2012 at 01:22 PM Report #459692 Posted June 1, 2012 at 01:22 PM 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.
Whalattax Posted June 1, 2012 at 02:09 PM Author Report #459703 Posted June 1, 2012 at 02:09 PM (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 June 1, 2012 at 02:57 PM by nunopicado Indicação da linguagem ao GeShi
nunopicado Posted June 1, 2012 at 02:58 PM Report #459709 Posted June 1, 2012 at 02:58 PM 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.
Whalattax Posted June 1, 2012 at 03:10 PM Author Report #459713 Posted June 1, 2012 at 03:10 PM Obrigado pela ajuda. Se tenho outras dúvidas, escreverá aqui mais tarde. Obrigado e Bom tarde. Whalatta
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now