Ir para conteúdo
Fórum Script Brasil

jxfdasilva

Membros
  • Total de itens

    95
  • Registro em

  • Última visita

Tudo que jxfdasilva postou

  1. Boa noite companheiros, Viva Micheus, Cá vai o código de acordo com a tua sugestão: Na Unit2 (Setup) unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, CPort, StdCtrls, ExtCtrls, CPortCtl, Registry, yupack, CPDrv, EasyRegAdvanced, psvBasiclbl, psvBorderLabel, Buttons, OvalBtn, ScktComp; type TSetup = class(TForm) ComPort1: TComPort; Button1: TButton; //(...)por aí fora . . . . procedure FormCreate(Sender: TObject); procedure Btn3Click(Sender: TObject); procedure Btn1Click(Sender: TObject); procedure ComPortOpen(Sender: TObject); procedure ComPortClose(Sender: TObject); procedure OBtn1Click(Sender: TObject); procedure btnClientClick(Sender: TObject); procedure ClientSocket1Connect(Sender: TObject;Socket: TCustomWinSocket); procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); procedure AtualizaEstado(Enable :Boolean); procedure Button3Click(Sender: TObject); //procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } // procedure AtualizaEstado(Enable :Boolean); public { Public declarations } end; var Setup: TSetup; implementation uses Unit3, Unit1; {$R *.dfm} procedure TSetup.AtualizaEstado(Enable :Boolean); begin //btnEnvia.Enabled := Enable; end; procedure TSetup.FormCreate(Sender: TObject); . . . //.... (...) . . . procedure TMS8.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); begin MS8.ClientSocket1Read(Sender, Socket); end; ... e na Unit1 (Form principal): unit Unit1; interface uses //...(...) type TMS8 = class(TForm) . . . //...(....).... . . . procedure LBOffClick(Sender: TObject); procedure LBMenuClick(Sender: TObject); procedure LB0Click(Sender: TObject); procedure LB1Click(Sender: TObject); procedure LB2Click(Sender: TObject); procedure LB3Click(Sender: TObject); procedure LB4Click(Sender: TObject); procedure LB5Click(Sender: TObject); procedure LB6Click(Sender: TObject); procedure LB7Click(Sender: TObject); procedure LB00Click(Sender: TObject); procedure BmsXPButton1Click(Sender: TObject); procedure LB01Click(Sender: TObject); procedure LB02Click(Sender: TObject); procedure LB03Click(Sender: TObject); procedure LB04Click(Sender: TObject); procedure LB05Click(Sender: TObject); procedure LB06Click(Sender: TObject); procedure LB07Click(Sender: TObject); private { Private declarations } public { Public declarations } ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);// de acordo com o sugerido. end; Const Header = Char($AA) +Char($55); Aud = Char($02); //audio Vid = Char($01); //video ViAu = Char($03); //video + audio Header1 = '$AA$55'; Aud1 = '$02'; //audio Vid1 = '$01'; //video ViAu1 = '$03'; var MS8: TMS8; VA :Char; //Video e/ou Audio VA1, ReceivedMsg, LBSource1, HexaId :String; LBSource :Char; StrInt, DelimiterIdx: Integer; StrString:string; StrChar:Char; implementation uses Unit2; //uses Unit3; {$R *.dfm} . . . //....(....).... . . . . procedure TMS8.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);// de acordo com a tua sugestão. var ReceivedCmd :String; begin ReceivedCmd := Socket.ReceiveText; end; Espero que seja o suficiente para a análise em questão. Aquele abraço José Da Silva
  2. Olá Micheus, Boa tarde companheiros, Neste momento estou sem Delphi. Logo mais tarde enviarei o escopo do programa para podermos analisar. Aquele Abraço José África
  3. Olá Micheus, Só para calcinar as ideias: No Form Principal: uses Windows, Messages, ..., Sockets; type TFormPrincipal = class(TForm) ... public TFormPrincipal.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); Aqui da uma mão cheia de erros!! - ',' or ':' expected but '.' found ... e por aí fora... No form de configuração onde está o componente: ... implementation uses uFormPrincipal; //[b] Aqui será FormPrincipal ou apenas unit1? Porque se deixo o MS8 ele pede MS8.dcu!! - a propósito é mesmo 'u....MS8'? Atenção que o meu Form Principal se chama TMS8. Alguma coisa esta falhando... procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); begin FormPrincipal.ClientSocket1Read(Sender, Socket); end; ... Eu compreendi, só que dá um monte de erros.... Abraço
  4. P.S: Do género: procedure TfCadPersonalizado.FormShow(Sender: TObject); var formPrincipal : TForm; begin formPrincipal := Application.MainForm; funcBasico := TFuncoes(formPrincipal.FindComponent('funcBasico')); end;
  5. Boa Noite companheiros, Ola Micheus, Só hoje pude pegar na aplicação por motivos profissionais. O servidor já esta pronto e apenas falta tratar algumas excepções. Entretanto, e porque tracei uma estratégia para trabalhar o problema que consiste em não permitir que haja mais do que um cliente no mesmo source e destination, que passa pela condição de não haver duplicação de comandos. Poderia eventualmente, e se calhar seria mais fácil, optar por uma base de dados com uma tabela e alguns campos onde estaria os valores chaves dos comandos. Mas como prefiro uma boa luta, enveredei por exercício mais moroso e didáctico. Algumas dúvidas subsistem ainda: Tenho um form Setup, do lado do cliente onde configura-se o IP do servidor o nº de cliente e a ligação. Assim, o componente ClienteSocket, esta neste unit. Mas no Main Form preciso de estar a receber os eventos da rede, ou seja, os comandos que estão a ser reenviados pelo servidor ($AA$...$nn), do género: procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); Acontece porem que este procedimento só funciona no Unit onde esta o componente ClienteSocket, que no meu caso esta no Form Setup. Como chama-lo para que no Main form eu possa estar a receber sempre os comandos reenviados pelo Servidor? Do género: procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var ReceivedCmd :String; begin // armazena na variável o texto recebido ReceivedCmd := Socket.ReceiveText; // mostra quem enviou e o texto no memo Memo1.Lines.Add(Format('from: %s > %s', [Socket.RemoteAddress, ReceivedCmd])); end; Qualquer ajuda é bem vinda. Aquele Abraço José
  6. Olá Companheiros, Finalmente o Sistema já funciona...!!! Irei brevemente publicar a parte do código mais interessante de forma a beneficiar a todos! Aquele Abraço, José Da Silva
  7. Olá Micheus, Viva companheiros, É, de facto o meu erro estava no ComPort1.WriteStr(); , para alem de outros, naturalmente. Com o ComPort.Write(); funciona bem. Optei por usar Neste momento estou refazendo o código todo, já que foi implementada uma nova forma de enviar os Comandos. Para já funciona beleza... Resta tratar algumas excepções e testar de novo. A ideia é a partir do servidor controlar a aplicação. Ainda algum trabalho pela frente. Valeu Micheus, tu sabe da coisa! Um dia vou convidar-te para sentarmos aqui em Moçambique debaixo de um coqueiro bebendo leite de coco enquanto miramos a paisagem... sem Delphi na cabeça! Aquele abraço José O Africano
  8. Olá Micheus, Já tinha tentado algo assim, seccionei em trios o string, mas creio que usei uma forma diferente de enviar o string. Mas deixa tentar de novo e logo, logo digo-te qualquer coisa... Agora estou sem Delphi.... Aquele abraço José
  9. Olá Micheus, Acho que entendi a sua ideia agora, mas não estou conseguindo implementa-la. Consigo receber a srting $AA$55$03$00$1F, e guarda-la numa variável . Acontece porem quando tento enviar - e aqui o Delphizinho trata de converter as coisas e depois já não sei a quantas ando -, ao monta-lo no Setup.ComPort1.WriteStr();, ele simplesmente volta a converter em Hexa e estraga tudo. No Soft onde monitorizo a chegada dos strings , em ASCii consigo ter exactamente a string que mando , inclusive com os respectivos '$'... Do lado do Cliente usei uma variável x:='$AA$55$03$00$1F'; e depois despejei no ClientSocket1.Socket.SendText(x); P.S. Depois de analise ao componente verifico uqe cada vez que envio um comando para o hardware, ex: $AA$55...$1F, de forma a que o hardware o interprete , o que na verdade enviamos é um Cha(x). Talvez a solução passasse por modificar para Char o comando a enviar antes de o faze-lo. O facto é que não consigo ate o momento uma função que trabalhe em condições. Aquele abraço José
  10. Boa Tarde Companheiros, Viva Micheus, Você quer dizer algo do género: HexaConv:= (ReceivedCmd); //onde ReceivedCmd são os comandos '$AA$55$03$00$1F' HexaConv:= AnsiReplaceStr(HexaConv, '$', '#$'); //Onde Existe o '$' substituo por '#$' Desta forma eu posso armazenar numa variável HexaConv a String e depois envio através do Setup.ComPort1.WriteStr...Esta é ideia?? Aquele abraço
  11. Boa Noite a todos, Ola Micheus, Estou tentando resolver um pequeno problema na implementação do código. Quando envio uma string em hexa ex:#$AA#$55#$03#$00#$1F, ele elimina os zeros aparentemente usando a função ChatToHExa. Pensei que fosse este o problema, mas ao enviar para Matriz nem sequer uso a função. Mais grave é que no exemplo que atrás nomeei os valores #$00 são completamente apagados e já não aparece o #$1F. Ora, existe um comando onde precisamente uso #$00. Liguei para monitorar um soft. 232 Hexa Com Tool, e verifiquei que ele volta (ou existe e não aparece!!??), dizia, ele volta a adicionar os zeros em falta, menos quando a situação é #$00, onde ele elimina de facto o #$00 e o restante #$1F, ficando apenas AA5503. Isso faz com o comando perca efectividade, ou seja a Matriz não reage. Outra situação é que, por algum motivo quando os valores a enviar são nulos, ou seja , em branco, no soft. de monitorização aparece em hexa sempre 0D0A ???. No caso anterior como ele elimina o último byte to string , aparece apenas AA5503 e o restante 0D0A!!?? Atenção: Isso tudo é quando uso o servidor. Ou seja, o Cliente envia para o Server e o Server através de 232 para a Matriz. Se envio directamente para a Matriz via 232 nada disso acontece. Entretanto, estou dando volta a tudo que é possível, procurando entender... Aquele abraço José
  12. Olá Micheus, Boa Noite companheiros, É... de facto as coisas estão a compor-se. Com o código que me mandastes, para além de simplificar demasiado os processos, revela grande conhecimento da tua parte. Neste momento, tenho de reconhecer que nada sei... mas espero um dia conseguir pelo menos fazer um "mano-a-mano" contigo, como se diz por cá! Para além de só apanhar em tutorias coisas que servem para pouca coisa, reconheço a minha ignorância! - Tive que fazer algumas alterações, naturalmente, mas como tu dizias, valeu o espírito da coisa. Amanha vou fazer testes a procura de bugs, e logo, logo posto o código ou....espero que não! , algumas dúvidas. Aquele abraço José O Africano
  13. Ola Micheus, Estou sem Delphi neste momento. Mas logo a noite irei testar a ideia. De facto faz mais sentido como você desenhou o código. Eu tinha tentado algo parecido (muito pouco parecido, convenhamos), só que ele convertia a identificação Cliente(n) em Hexa..!? Aquele abraço, José
  14. Boa Noite Companheiros, Viva Micheus, Do Lado do Cliente o código que envia o Valor Hexa: ClientSocket1.Socket.SendText(#$AA#$55#$03#$07#$1F); {Aqui é o comando em Hexa} //e ClientSocket1.Socket.SendText(Format('%s %s',[ComboBox1.Text, Edit1.Text])); {Aqui eu recebo o nº de cliente do ComboBox1 e, do Edit1 qualquer comando (sem ser em Hexa) que queira enviar} Do lado do Servidor Recebo: var ReceivedCmd :String; HexaValue:String; {As variáveis} (*...*) ReceivedCmd:= CharsToHexa(Socket.ReceiveText); {Tento converter para Hexa através desta função CharsToHexa. Originalmente estava ReceivedCmd:= Socket.ReceiveText; } HexaValue := Copy(ReceivedCmd, 10, Length(ReceivedCmd)); Memo1.Lines.Add(Format('De: %s > %s', [Socket.RemoteAddress, ReceivedCmd])); {porque usei anteriormente função já consigo receber o valor em Hexa, e o IP do Cliente} Memo1.SelStart:= Length(Memo1.Lines.Text); //... ListBox1.Items.Add(Copy(ReceivedCmd, 10, Length(ReceivedCmd))); {Adiciono o Comando neste ListBox1 onde sera posteriormente enviado } ListBox1.ItemIndex := ListBox1.Count -0; //... Setup.ComPort1.WriteStr(ListBox1.Items.Text); {Aqui envio via porta 232 para a Matriz} A questão agora esta no facto de, se eu utilizar o ReceivedCmd:= CharsToHexa(Socket.ReceiveText); perco o Identificação CLIENTE(n) mas recebo os valores em Hexa no TMemo. Só que tem um problema - o servidor fica sem funcionar de acordo com o projectado . Se retiro CharToHexa - ReceivedCmd:= Socket.ReceiveText; - Funciona tudo bem mas sem valores Hexadecimais...!?!? Não existe uma forma de eu separar a string de forma que eu tenha a Identificação do Cliente e simultaneamente o valor Hexa? Aquele abraço e obrigado pela paciência... José
  15. Ola Micheus, Boa Noite Companheiros, Tentei o teu código e de facto condensou bastante o nº de linhas. Valeu! Quanto ao hexa é que ta complicando. Já tentei outras forma e o resultado é :"Is not a valid Integer Value"!! Vou lutando para ver no que dá... Obrigadão Micheus... José
  16. Boa Tarde a todos, Viva Micheus, Só poderei testar o seu código logo mais. Neste momento não tenho aqui o Delphi. Quanto ao valor Hexa , o problema é que nem sequer aparece no TMemo2, muito menos no TListBox1. Assim, já não existe envio de nada porque se não houver comparação, de acordo com o algoritmo, não envia para a ListBox1. No TMemo1 ainda aparece em formato Char.... P.S. a minha string para alem da identificação 'Cliente1,...,n' vem a seguir (ou supostamente deveria vir), o Valor ex:AA55030201 em Hexa.... Aquele abraço José
  17. Boa Tarde a todos, O código continua a funcionar em condições. O único problema é que os comandos em Hexa não são aceites ou , no caso do Memo1, são convertidos para Char. Alguma ideia de como ultrapassar este problema (ou porque acontece) sera bem vindo. MC José
  18. Boa Noite Companheiros, Resolvido o problema de comparação. Resta agora solucionar o problema dos valores Hexadecimais nos Tmemo, TLbox.... Entretanto fica o código enquanto irei testa-lo mais amiude por forma a descobrir possíveis bugs. O código: for I:=Memo2.Lines.Count-1 downto 0 do //a propriedade Count retorna o nº de linhas if Memo2.Lines.IndexOf(Copy(ReceivedCmd, 10, Length(ReceivedCmd))) = -1 then //evito que repita no Memo os mesmos strings if Pos('Cliente1', ReceivedCmd) = 1 then //selecciono o Cliente begin Memo2.Lines.Delete(0); //forço o delete na Linha 1ª Memo2.Lines.Insert(0,Copy(ReceivedCmd, 10, Length(ReceivedCmd)));//insiro directamente na linha1ª ListBox1.Items.Add(Copy(ReceivedCmd, 10, Length(ReceivedCmd)));// Crio um delay com o Timer para ser enviado via socket para Matriz ListBox1.ItemIndex := ListBox1.Count -0; end; Ate amanha José
  19. Boa Madrugada a todos, Consegui resolver o problema seguindo sugestão do Micheus e organizei o código da seguinte forma: for I:=Memo2.Lines.Count-1 downto 0 do if Memo2.Lines.IndexOf(Copy(ReceivedCmd, 10, Length(ReceivedCmd))) = -1 then if Pos('Cliente1', ReceivedCmd) = 1 then begin Memo2.Lines.Delete(0); Memo2.Lines.Insert(0,Copy(ReceivedCmd, 10, Length(ReceivedCmd))); end; if Memo2.Lines.IndexOf(Copy(ReceivedCmd, 10, Length(ReceivedCmd))) = -1 then if Pos('Cliente2', ReceivedCmd) = 1 then begin Memo2.Lines.Delete(1); Memo2.Lines.Insert(1,Copy(ReceivedCmd, 10, Length(ReceivedCmd))); end; Desta forma fixo os strings em determinada linha. Para já funciona com dois Clientes... Vou tentar evoluir para os 8 Clientes e, logo deixarei o meu testemunho. José, O Africano
  20. Boa Noite, Outra solução passaria por seleccionar a Linha da Memo onde quero cada cliente. Assim permitiria que apagasse a linha especifica e cada cliente ficaria fixo numa determinada Linha... Abraço
  21. Se eu uso tento com dois clientes ele usa sempre a mesma linha...o que estraga tudo: if Memo2.Lines.IndexOf(Copy(ReceivedCmd, 10, Length(ReceivedCmd))) = -1 then if Pos('Cliente1', ReceivedCmd) = 1 then begin Memo2.Clear; Memo2.Lines.Add(Copy(ReceivedCmd, 10, Length(ReceivedCmd))); end; if Memo2.Lines.IndexOf(Copy(ReceivedCmd, 10, Length(ReceivedCmd))) = -1 then if Pos('Cliente2', ReceivedCmd) = 1 then begin Memo2.Clear; Memo2.Lines.Add(Copy(ReceivedCmd, 10, Length(ReceivedCmd))); end;
  22. Boa Noite Companheiros, Viva Micheus, Criei um código que funciona usando a tua ideia do TEdit. Fiz em TMemo, mas só funciona perfeito para um Cliente e sem repetir a linha. Quando mudo de comando ele substitui a Linha por outro comando novo. O Problema é usa-lo para o restantes cliente. Você pode testa-lo como SocketDemo que me mandou. Usei o comando (ex.) AA55030201... if Memo2.Lines.IndexOf(Copy(ReceivedCmd, 10, Length(ReceivedCmd))) = -1 then if Pos('Cliente1', ReceivedCmd) = 1 then begin Memo2.Clear; Memo2.Lines.Add(Copy(ReceivedCmd, 10, Length(ReceivedCmd))); end; Como fazer para os restantes? Tentei os outros clientes so que quando mudo o Cliente1 ele apaga tudo no Memo2... Abraço José
  23. Ola Companheiros, Viva Micheus, A questão é que se eu uso apenas um TEdit, como irei apagar os comandos apenas de um determinado cliente que envia? Ou seja o cliente envia um comando, se existir já um em seu nome ele devera apagar e substituir pelo novo... mas não os comandos dos outros clientes. Por isso criei a LBox(n), para tratar cada casa separadamente. De outra forma como seria? Aceito soluções... Certo! E é substituido sempre pelo novo comando que chega dos cliente...desde que não seja repetido. Exactamente. Mas quando tento comparar com os demais LBox's não funciona. Ou seja , funciona apenas se comparar com um único... ou estou fazendo algo de errado! Mas eu não quero converter! Como faço?E isto complica também as comparações que devo fazer nos Momos e LBox, etc... Aquele Abraço José
  24. Ola Micheus, Bom te ler.... Bem, cá vai a ideia que pretendo para o servidor. Na prática com a solução destes problemas poderia já começar a testa-lo. Nesta snapshot esta a imagem parcial do servidor onde podera ver os campos com os comandos dos clientes recebidos: A ideia é que nos campos do LBox1, LBox2, ..., LBox8 os valores não se repitam, ou seja, jamais podem ser iguais... O Código não esta completo porque falta esta opção: if Pos('Cliente1', ReceivedCmd) = 1 then Begin LBox1.Clear; LBox1.Items.Add(Copy(ReceivedCmd, 10, Length(ReceivedCmd))); end; if Pos('Cliente2', ReceivedCmd) = 1 then begin LBox2.Clear; LBox2.Items.Add(Copy(ReceivedCmd, 10, Length(ReceivedCmd))); end; if Pos('Cliente3', ReceivedCmd) = 1 then begin LBox3.Clear; LBox3.Items.Add(Copy(ReceivedCmd, 10, Length(ReceivedCmd)));//...até ao 8º end; ...por ai fora ate completar o 8ºCliente... Mas como pode observar os códigos repetem-se...(naturalmente por falta de sintaxe adequada). Agora quanto a seguinte imagem, O que se pretende é que ele compare o código recebido no LBox1, LBox2,...,LBox8 de forma a que se forem repetidos ele rejeite. Consegui fazer isso apenas comparando com um LBOx1. Se tento que ele compare com mais do que um não surte efeito. O código if not AnsiContainsText(Comparador.Lines.Text, LBox2.Items.Text) then begin Comparador.Clear; Comparador.Lines.Add(HexaValue); ListBox1.Items.Add(Copy(ReceivedCmd, 10, Length(ReceivedCmd))); ListBox1.ItemIndex := ListBox1.Count -0; Comparador.Refresh; end; Veja que neste código, uma vez comparado com o LBox1 e senão for repetido será adicionado ao ListBox1 que por sua vez tem um timer que faz um delay (por causa do hardware), permitindo depois enviar para todos os clientes... if ListBox1.Count > 0 then begin for Idx := 1 to ComboBox1.Items.Count -1 do (ComboBox1.Items.Objects[Idx] as TCustomWinSocket).SendText(Listbox1.Items[0]); Setup.ComPort1.WriteStr(ListBox1.Items.Text); ListBox1.Items.Delete(0); { elimina comando da lista } Acontece porem que só consigo que ele compare eficazmente coma apenas um LBox, e, quando tento que a comparação com os outros não resulta. Da mesma forma nos LBox1,2,...,8, não consigo eficazmente que ele não se repita. Por fim tenho o tal problema de os códigos em Hexa vindos dos Clientes serem convertidos (??) para Char dentro dos ListBox ou Memos.... Um Abraço e mais uma vez obrigado pela ajuda incomensurável. José
  25. Ilustres companheiros, Apenas uma pequena nota informando e, de certa maneira, alertando para a complexidade (ciclomática) do código, onde poderá originar erros de sintaxe, e se nos descuidarmos com os if´s, begins e ends, podemos até alimentar alguns bugs difíceis de encontrar - foi o meu caso. Entretanto ficam alguma dúvidas que subsistem e que, se puderem contribuir, seria maravilhoso. São elas em relação ao facto de, nos Memos, LBoxes e Edites, converter os valores Hexas recebidos para Char, complicando de sobremaneira as coisas e, outra tem a haver com o facto de não conseguir comparar uma Sting - ex. no LBox - com outras nos outros LBox , Edits etc. Isto porque só consegui comparar eficazmente 2 strings!!! Comparar uma string com várias outras fica difícil. A solução passaria eventulamente - e isto para evitar as montanhas de IF´s, por alguma função(!?) .... Toda a ajuda é bem vinda... Aquele abraço José O Africano
×
×
  • Criar Novo...