enviando dados com fontes pelo Tclientsocket

Delphi

10/03/2005

oi galera,
eu tenho uma aplicação em que eu envio mensagem pelo tclientsocket,so que antes de enviar a mensagem eu altero as configurações de fontes e quando eu mando a mensagem o contato recebe a mensagem sem essas modificações de fonte,como que eu faço p/ que o meu contato receba a minha mensagem com essas alterações ?


Anicetojunior

Anicetojunior

Curtidas 0

Respostas

Kapak

Kapak

10/03/2005

Essa eu não entendí e gostaria de aprender.
Como assim enviar msgs pelo ClientSocket c/ alteração de fontes ?


GOSTEI 0
Anicetojunior

Anicetojunior

10/03/2005

vc ja deve ter utilizado o messenger ou o icq,a minha ideia e fazer o mesmo,eu poder antes de enivar a mensagem p/ o meu contato eu alterar a fonte da minha mensagem por exemplo,mudar p/ negrito italico.....e o meu contato receber a minha mensagem com esssas alteraçoes


GOSTEI 0
Kapak

Kapak

10/03/2005

Olá colega, bom no meu caso os ClientSockets sempre se conectam a um ServerSocket e com isto todas as máquinas conectadas conseguem se comunicar. Quando um client quiser se comunicar com outro, sempre tem que passar pelo server, pedindo assim que ele mande a informação p/ o outro client.
Vc diz que envia msgs pelo ClientSocket certo ?
E o outro lado como recebe essas msgs ?


GOSTEI 0
E_gama

E_gama

10/03/2005

Ne caso vc já está entranto no conceito de protocolos personalizados.
Voce poderia definir um padrão de mensagens, tipo:

[FONT-NOME]Arial
[FONT-TAM]=12
[MSG]=Aqui entra a mensagem em sí
[FONT-NAME]OutraFonte
[MSG]=Outra mensagem [FONT-NEGRITO][FONT-ITALICO]resto da mensagem

Mas aí vc teria que ter uma rotina para ´decodificar´ o dado enviado, mais ou menos como os browser Web fazem com HTML.

se eu fosse fazer, e quizesse enviar mensagens formatadas, certamente faria utilizando texto em formato HTML ou RTF... assim ficaria mais fácil mostrar os dados na outra ponta do socket, não precisando ´decodificar´ a mensagem.


GOSTEI 0
Anicetojunior

Anicetojunior

10/03/2005

respondendo as perguntas eu estou utilizando um clientsocket e um servesocket,os meus clientsockets se comunicam ao serversocket e quando eu recebo uma mensagem eu coloco essa mesagem recebida em um memo.

2° como que eu faria entao p/ mandar essas mensagem no formato html ou rtf como o nosso amigo e_gama falou ? vc´s tem outas ideias ?


GOSTEI 0
Kapak

Kapak

10/03/2005

Bom, então vc utiliza o mesmo que eu.
Vc não consegue formatar fontes pq a filosofia de ServerSocket e ClientSocket é de conexão via tcp/ip e porta.
Então vc utiliza SendText/SendBuf e ReceiveText/ReceiveBuf para enviar e receber de um lado p/ outro; isto não tem nada a ver c/ fontes, vc simplesmente envia e recebe um buffer de dados.

Se foi vc quem fez os dois programas(Client e Server), então modifique o modo de envio e recepção, mandando os parâmetros de fontes na frente; com isto no lado que recebe, vc formata o texto pelos parâmetros recebidos que virão antes da msg.


GOSTEI 0
E_gama

E_gama

10/03/2005

Vamos imaginar o seguinte cenário:

- No lado cliente tem um TMemo onde o usuário digita a mensagem e envia para a outra ponta da conexão.
- No outro lado tem um ´TRichEdit´ que mostrará a mensagem formatada.
- A melhor forma de madar os dados formatados, seria mandar o próprio OBJETO TMemo, com todas as configurações de fonte, cor, tamanho, etc....
- Mas como mandar o OBJETO?

Não tem como enviar um OBJETO em sí, mas podemos enviar sua ´descrição textual´.
Essa descrição e mesma que aparece no arquivo ´.DFM´ do formulário.

Então, o lado cliente envia essa descrição, e o lado servidor a transforma de volta em OBJETO e configura o ´TRichEdit´ com o texto, e com a fonte que recebeu.

O Delphi tem funções para converter Objeto->Texto e Texto->Objeto.

A função abaixo converte Objeto para Texto:
function ObjetoParaTexto(Obj: TMemo): string;
var Objeto: TMemoryStream;
    Texto : TStringStream;

begin
  Objeto := TMemoryStream.Create;
  Texto  := TStringStream.Create(Obj.Text);

  Objeto.WriteComponent(Obj);
  Objeto.Seek(0, 0);

  ObjectBinaryToText(Objeto, Texto);

  Texto.Seek(0, 0);
  Result := Texto.DataString;

  Objeto.Free;
  Texto.Free;
end;


O lado cliente ao invés de mandar o texto digitado no TMemo, envia o TMemo inteiro!

Essa outra função converte Texto->Objeto:

function TextoParaObjeto(Txt: string): TMemo;
var Objeto: TMemoryStream;
    Texto : TStringStream;

begin
  Objeto := TMemoryStream.Create;
  Texto  := TStringStream.Create(Txt);

  ObjectTextToBinary(Texto, Objeto);
  Objeto.Seek(0, 0);

  Result        := TMemo.Create(nil);
  Result.Parent := Form1;

  Objeto.ReadComponent(Result);
  Objeto.Seek(0, 0);

  Objeto.Free;
  Texto.Free;

  Result.Visible := False;
end;


Agora, quando o servidor receber a mensagem, converte-a para objeto, e em seguida atualiza o TRichEdit:

var Msg: TMemo;
begin
  ...
  Msg := TextoParaObjeto(Texto); // Texto = mensagem recebida pelo servidor
  
  // Considerando que a mensagem será mostrada num TRichEdit...
  RichEdit1.SelAttributes.Name  := Msg.Font.Name;
  RichEdit1.SelAttributes.Size  := Msg.Font.Size;
  RichEdit1.SelAttributes.Color := Msg.Font.Color;
  RichEdit1.Lines.Add(Msg.Text);

  Msg.Free;
  ... 
end;


Para entender melhor, segue a ´descrição textual´ de um componente:
  object Msg: TMemo
    Left = 10
    Top = 296
    Width = 303
    Height = 35
    Font.Charset = ANSI_CHARSET
    Font.Color = clMaroon
    Font.Height = -16
    Font.Name = ´Berlin Sans FB Demi´
    Font.Style = [fsBold, fsItalic]
    Lines.Strings = (
      ´Msg´)
    ParentFont = False
    TabOrder = 1
  end



GOSTEI 0
POSTAR