Jump to content
Fórum Script Brasil

Dolfin

Membros
  • Posts

    10
  • Joined

  • Last visited

Everything posted by Dolfin

  1. O que tá rolando aqui é: eu tenho um componente OpenTextDialog que abre o TXT com endereços IP dos servidores para conexão... Cada thread cria um socket, cada socket conecta em um IP... Isso tá funcionando, porém, a conexão fica aberta e se eu preciso fechar e abri-la novamente, o programa por algum motivo já perdeu a propriedade Host, e tenta abrir a conexão com último host setado(última linha lida do TXT de IPs)... Vou colar o trecho que abre o TXT utilizando o OpenDialog: procedure TForm1.Button1Click(Sender: TObject); begin OpenTextFileDialog1.InitialDir:= ExtractFilePath(Application.ExeName); if (OpenTextFileDialog1.Execute) then begin AssignFile(HostsFile, OpenTextFileDialog1.FileName); Reset(HostsFile); Esse código acima le o arquivo TXT e grava na variável HostsFile, aí eu chamo um procedure da Thread chamada ThreadsController, que controla o número de threads abertas pelo valor de um Edit ou pelo número de linhas do TXT, como segue abaixo: procedure Threads.ThreadsController; begin while ((StrToInt(Form1.Edit2.Text) > iThread) and (not eof(HostsFile))) do begin inc(iThread); Readln(HostsFile, HLine); Process:=Threads.Create(True); Sleep(10); UserController; end; end; Como pode ver, eu crio a Thread nessa procedure, e logo após a criação, ela é executada como segue a procedure: procedure Threads.Execute; begin Application.ProcessMessages; ClientSocket:= TClientSocket.Create(Application); ClientSocket.Port:= 81; ClientSocket.OnConnect:= OnConnect; ClientSocket.OnRead:= OnRead; ClientSocket.OnDisconnect:= OnDisconnect; ClientSocket.Host:= HLine; end; Bom, eu passo pela criação da Thread com sucesso para cada linha do TXT, ele abre cada thread para uma linha, cada socket com seu respectivo Host... O único problema é quando eu preciso fechar a conexão de alguma thread e re-abrir, porque aí a propriedade Host do ClientSocket já virou o último IP lido da lista... As threads não estão guardando essa propriedade do ClientSocket. A cada passada na Thread.Execute, as propriedades viram 'absolutas' e todos os ClientSockets de outras threads inclusive, ficam com a mesma propriedade parece... Lembrando que ClientSocket é uma variável privada da própria Thread, como mostro abaixo: Threads= class(TThread) private ClientSocket: TClientSocket; procedure ThreadsController; procedure UserController; .....
  2. Pessoal, é o seguinte... Eu estou trabalhando com o componente ClientSocket e Threads, e para cada thread, eu crio uma nova instância de um Socket com o seguinte código: procedure Threads.Execute; begin Application.ProcessMessages; ClientSocket:= TClientSocket.Create(Application); //criando o socket ClientSocket.Port:= 81; //setando a porta para conexao ClientSocket.OnConnect:= OnConnect; //setando evento onconnect ClientSocket.OnRead:= OnRead; //setando evento onread ClientSocket.OnDisconnect:= OnDisconnect; //setando evento ondisconnect ClientSocket.Host:= HLine; //lendo o host de um TXT end; Aonde: ClientSocket é uma variável privada da thread HLine aonde eu seto o Host, é uma variável que eu pego de uma linha de um TXT com servidores para conexão. O problema é: Com esse código eu achei que criava 1 socket por thread, e setava o Host do Socket para a linha atual que estaria lendo o TXT, e isso até funciona em partes... Ele abre as conexões com cada linha lida do TXT, porém num determinado momento, eu preciso fechar a conexão... E abri-la novamente mais tarde, e aí eu notei o seguinte: A propriedade Host do ClientSocket está sempre ficando com apenas 1 servidor... Ele não tá gravando cada ClientSocket de cada Thread com um Host, ele pega sempre o último o Host e seta como se fosse para todos... Como eu posso fazer para que cada thread tenha seu socket e cada socket tenha seu Host, para que eu possa abrir, fechar, re-abrir conexões, cada socket com seu host?
  3. Galera, eu sou novo no Delphi como podem perceber hehe... Eu tentei fazer uma procedure aqui, mas ela só é executada quando tem um ShowMessage dentro dela!! Ela tá declarada assim: procedure SocketsConnect(Sender: TClientSocket); Aí logo abaixo eu chamo ela assim: SocketsConnect(Sockets); E ela tá assim: procedure TForm1.SocketsConnect(Sender: TClientSocket); begin BannerControl:=0; UserAuthControl:=0; PassAuthControl:=0; //ShowMessage('To ae'); if Sockets[i].Socket.ReceiveLength > 0 then begin Texto:= Sockets[i].Socket.ReceiveText; if (BannerControl = 0) and (UserAuthControl = 0) and (PassAuthControl = 0) then begin inc(BannerControl); Memo1.Lines.Append(Texto); Texto:=''; end; end; Como podem ver tem até um ShowMessage comentado ali nela, que se eu deixo assim, nada dessa procedure é executado, mas se habilito o showmessage e clico em OK, executa a procedure toda certinha! Que isso???
  4. Primeiramente, boa tarde! Estou 'rascunhando' um cliente POP3 aqui no Delphi e para aprendizado to tentando fazer tudo via API do WinSock nativo do Windows. Mas sou iniciante em programação e no Delphi, uma vez ou outra pego para fazer algum programinha, mais por aprendizado mesmo... E me surgiu um problema que creio que para a maioria de vocês vai ser um problema bem bobo, mas já procurei e não consigo encontrar como solucionar... É o seguinte, eu conecto pela porta 110 do servidor POP3, e logo de cara ele me exibe a mensagem: +OK Hello there. <[email protected]> Porém eu não consigo puxar essa mensagem pelo meu programa, gostaria de exibir isso num Memo, porém só aparecem caracteres orientais e quadrados... Abaixo vou colar a parte do código: if(connect(sock,addr,sizeof(addr)) = -1) then begin writeln('Ocorreu um erro ao conectar-se.'); exit; end; ZeroMemory(@buf,100); recv(sock,buf,sizeof(buf),0); Memo1.Lines.Add(StrPas(buf)); end; Essa parte conecta, recebe o texto, grava na variavel buf e adiciona o conteúdo da buf na Memo1... Como disse, só aparecem caracteres esquisitos... Aguardo a ajuda de vocês!!!
  5. você não precisa fazer isso basta usar o select, e usar o adoquery1.post pra salvar o registro, o insert vai inserir um novo registro e pelo que eu entendi você quer alterar um registro que ta na tela. Tem como exemplificar? ATENÇÃO: Atente para as Regras do Forum
  6. Uhmm... Ok, mas o problema na verdade está na hora da Query... No FormCreate eu dou a seguinte query: ADOQuery1.SQL.Add('select Nome, CPF, Endereço from Clientes'); Assim ele preenche a DBGrid, aí na hora de salvar os dados eu to fazendo assim: ADOQuery1.SQL.Add('insert into Clientes(Endereço) VALUES (:a)'); ADOQuery1.Parameters.ParamByName('a').Value:= DBEdit1.Text; Só que pra isso eu preciso dar um .clear, pra fazer a nova query... Como que eu vou ficar trabalhando com novas queries e deixando as antigas lá??
  7. Estou editando o post, pois minha dúvida não foi esclarecida, então vou escrever de forma mais compacta e objetiva! É o seguinte: tenho um DBGrid, que exibe os dados de uma tabela clientes, através do ADOQUERY(select Nome, CPF, Endereço from Clientes)... Eu gostaria de fazer alterações manualmente no banco de dados, através de DBEdits, então carrego os dados do cliente selecionado na DBGrid em DBEdits, e tenho um botão de salvar que executa a seguinte QUERY(insert into Clientes(Nome) values (:a)) e logo abaixo: ADOQuery1.Parameters.ParamByName('a').Value:= DBEdit1.Text; Supostamente isso deveria pegar o valor do DBEdit1 e adicionar na tabela certo? Errado, pois quando faço a nova query insert no ADOQuery, ele limpa e some com todos os registros, inclusive do DBGrid e do DBEdit (que está tudo conectado) e acaba inserindo uma linha vazia na tabela, uma vez que perdeu todos os dados no momento da nova query... Como realizar isso? Como salvar os dados da primeira query no DBGrid para realizar a segunda query sem que eu perca tudo? Coisas tentadas Usar o comando ADOQuery1.Post depois da primeira query, achando que ia salvar, mas não salvou nada, quando dou a segunda query, some tudo do mesmo jeito... Coisa pensadas Depois de preencher o DBGrid com os dados na primeira query, 'deslinkar' ele do DataSource, para que não passe mais queries por ele, mas acho que isso ficaria uma porcaria :blink: ... SALVE-ME QUEM PUDER!!
  8. Po tá difícil... Eu só consegui descobrir que a imagem só tá vindo um pedaço, não sei porque, já coloquei um while pra ficar lendo a imagem até o tamanho enviado pelo stream seja o mesmo do recebido, mas não adiantou... Engraçado que o código é simples e funciona quando não tem aquele 'if', como já disse no post...Infelizmente acho que o pessoal aqui não sabe qual a conclusão... Agradeço mesmo assim.
  9. Sim foi uma ótima dica, se eu não quisesse desenvolver o meu. Existem centenas de programas de assistência remota por aí, mas eu estou fazendo um que atende a necessidades particulares do meu ambiente de trabalho. E além disso tem a questão do aprendizado, não é porque existem programas prontos que eu vou desistir de fazer um meu. Ainda não consegui fazer funcionar, se alguém souber... A dúvida continua...
  10. Bom, primeiramente quero dizer que apesar desse ser meu primeiro post no fórum, já tirei muitas dúvidas aqui, e espero que possam me ajudar com essa. Estou fazendo um programa de Assistência Remota, com o envio da screenshot do ServerSocket através de stream. Já estou conseguindo emular os clicks do mouse e até teclas apertadas, apesar da função não estar muito boa, porém o problema não é esse. O lance é o seguinte, o meu código para envio do stream atual está assim no servidor: Comando:=Socket.ReceiveText; if Comando='screen' then begin {Aqui começa a função de Bitblt para pegar a imagem,etc...Não interessa pra nós } jpg.SaveToStream(Stream); Stream.Position:=0; Socket.SendText('Screen:' + inttostr(Stream.Size) + #0); //Envio depois do Stream.Size o #0 para delimitar o Size sem misturar com o inicio da imagem Socket.SendStream(Stream); ----- Aí surgiu o problema, se no Socket.SendText eu ponho apenas Socket.SendText(inttostr(Stream.Size) + #0); sem o 'Screen:' funciona perfeitamente, porém aí no clientread lá no Cliente, eu não posso usar um if Comando='Screen:' ... E eu preciso disso, prq eu vou receber mais de 1 coisa no clientread e sem isso, é como se todo evento do read fosse uma screen...Abaixo segue o código do cliente para vocês visualizarem melhor: if LeftStr(Chegando,7) = 'Screen:' then begin Delete(Chegando, 1, 7); //Deleto o 'Screen:' da var Chegando, pois ele é só pra identificar que é uma screen, não faz parte da coisa toda... if not Receiving then //Se o BOOL Receiving ainda for falso(não estiver recebendo) eu pego o Stream.Size enviado e gravo na var stSize begin if pos(#0,Chegando) > 0 then //Se encontrar o delimitador #0 que enviei lá no server na var Chegando então... stSize:=strtoint(copy(Chegando,1,pos(#0,Chegando)-1))//O StSize é o que veio antes dele, ou seja o Stream.Size else exit; begin Stream:=TMemoryStream.Create;//Crio o Stream Receiving:=True;//Começo a receber Delete(Chegando,1,pos(#0,Chegando));//Deleto o que tem antes do #0 ou seja Stream.Size pois não faz parte da imagem end; end; try Stream.Write(Chegando[1],Length(Chegando));//Começo a escrever o stream recebido if Stream.Size = stSize then//Aqui me indica o problema,se nesse if eu ponho Stream.Size < stSize ele começa a exibir o inicio da img apenas,porém se fica = ou seja: quando o recebido e escrito, for igual ao stSize que é o Stream.Size enviado do servidor forem iguais,ou seja a img tiver sido recebida por completa...Eu ponho ela num componente Image1...Isso não interessa colar aki também... --------------------- Bom pessoal, esse código funciona, desde que no servidor tire do Socket.SendText o 'Screen:' e no ClientOnRead ponha apenas começando o if Not Receiving, sem aquele if Chegando = 'Screen:' .... Pelo que percebi é que o Stream.Size recebido pelo Cliente é sempre menor que o Stream.Size enviado...Parece que o Cliente não consegue receber a imagem toda,só o inicio...mas tenho certeza que o servidor envia a img toda...Prq já puis um ShowMessage lá, indicando o Stream.Size enviado e foi da img toda, porém o recebido pelo Cliente é um pedacinho só...Minimo... Espero que vocês possam me ajudar, tentei formatar o post o máximo possível para organizar as coisas, é bem complicado, mas leiam que vocês vão entender.. Valeu!!
×
×
  • Create New...