Ir para conteúdo
Fórum Script Brasil
  • 0

(ReAberto)Receber mensagem no memo correto!


Douglas Soares

Pergunta

Bom dia pessoal, eu crio memos no runtime, e tenho um page control, eu crio uma tab e um memo na hora... é um chat! cada aba tem o nome da pessoa que to conversando, por exemplo, Douglas, o memo se chamara o nome da aba + _memo, exemplo: Douglas_memo, no entanto, tem uma procedure que recebe a mensagem no memo que eu gostaria de aprimorar para receber no memo que estou caso seja recebida em reservado... assim ó...

procedure TfrmPrincipal.Escrevemensagem(Memo : TMemo);
begin
Memo.lines.add(ReceiveMsg(cmd.text));
end;

procedure TfrmPrincipal.ShowReceiveMsg;
var
i : integer;
nome : string;
begin

for i := 0 to Self.ComponentCount - 1 do
begin
nome := PageControl1.ActivePage.Name;

with Components[i] as TMemo do
begin
if ExistePalavra(nome, 'memo') then
Escrevemensagem(Components[i]);
end;

end;

end;
O erro acontece ali no Escrevemensagem(Components);
[Error] UClient.pas(205): Incompatible types: 'TMemo' and 'TComponent'

Se tivesse um StrToMemo seria mais facil... mais não tem ehehehehe...

alguém pode me ajudar?

Editado por Douglas_Soares
Link para o comentário
Compartilhar em outros sites

15 respostass a esta questão

Posts Recomendados

  • 0

Douglas, a mensagem é bem clara.

Seu procedimento espera receber como parâmetro um componente da classe TMemo, enquanto você o chama passando o valor em Components[..] que é a classe ancestral TComponent.

Assim, supondo que você esteja certo de que o componente apontado por Components[..] é mesmo da classe TMemo, você pode fazer o type-cast sem medo de ser feliz. ;)

Sugestão:

...
if ExistePalavra(nome, 'memo') then
  if Components[i] is TMemo then
    Escrevemensagem(TMemo(Components[i]));
...

Link para o comentário
Compartilhar em outros sites

  • 0

Cara você é um gênio, eu nem sabia que existia esse treco de TypeCast... huahuauha, vai da pra mim fazer Muuuuuuuuitas coisas que eu sempre quis fazer. huhuhuhuh, só tem um probleminha nesse código... acho que o componentcount não conta os componente que eu criei em runtime... e isso é um problema... quando eu abro o chat e escrevo uma mensagem pra outro usuario, ele vai normal no Memo padrão, que se chama Geral_memo, mas quando clico em reservado, ele cria um outro tabsheet e um novo memo... porem eu envio a mensagem e não vai nem pro Geral_memo e nem pro memo novo.... quando eu voltei pra guia Geral... no local que está o Geral_memo, e digitei a mensagem dai ele veio no memo.... ele não funciona em outros memos criados em runtime... entendeu???

Obrigado pela ajuda até aqui!!!!!

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, eu não quiz entrar no mérito do assunto antes porque não tenho a menor idéia do que você já tinha implementado...

... mas já que você encontrou este "problema", parece-me que ao criar os memos, em run-time, você não está inicializando a propriedade Name deles. Esta propriedade deve ter valor único em todo o form (você já deve saber disto) e, baseado no pouco que você postou, você pode definir o nome como sendo o id do usuário em questão (se há apenas um memo para cada usuário) ou fazer uma concatenação para gerar o tal nome.

Como benefício, você poderá fazer a busca imediata pelo nome do componente, ustilizando o método FindComponent(<nome_componente>) (do Form). Dê uma avaliada neste link - post#3, onde tento explicar um pouco do que foi implementado no exemplo em anexo. Olhe ele se for o caso (se não me engano, há comentários).

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Agora eu crio o componente assim:

with TMemo(AddComponent(TMemo, Point(0, 0))) do
begin
Name := Trim(de + '_memo');
Align := alClient;
Parent := tab;
Visible := true;
Scrollbars := ssVertical;
Font.Size := 8;
Font.Name := 'MS Sans Serif';
Lines.Clear;
OnClick := cliquei;
end;
a função AddComponent é essa:
function AddComponent(BaseClass: TComponentClass; p: TPoint): TComponent;
begin
  result := BaseClass.Create(frmPrincipal);

  if result.InheritsFrom(TWinControl) then
    begin
    with TWinControl(result) do
      begin
      Parent  := tab;
      Left    := p.X;
      Top     := p.Y;
      Visible := True;
      Hint    := result.Name;
      ShowHint:= true;
      end;
    end
  else if result.InheritsFrom(TGraphicControl) then
    begin
    with TGraphicControl(result) do
      begin
      Parent  := frmPrincipal.PageControl1;
      Left    := p.X;
      Top     := p.Y;
      Visible := True;
      Hint    := result.Name;
      ShowHint:= true;
      end;
    end;
end;

porem está dando erro no OnClick:

OnClick := cliquei;

ele fala o seguinte:

[Error] Chat_Tools.pas(161): Incompatible types: 'method pointer and regular procedure'

eu acho que é porque a minha procedure OnClick só está na Unit... não tem form... tipo frmPrincipal.Cliquei.... num sei... não tenho mt experiencia com isso.... o que eu devo fazer?

Obrigado... de resto funcionou tudo!

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus, se você tivesse um tempo hj dps da uma e meia... gostaria que me desse um helpzito xD, aqui tem as fontes do programa para analise...

http://www.4shared.com/file/153210966/7ad6...hat_client.html

e já vem com um atalho pra logar com usuario micheus, queria só mostrar pra você como está...

caso você compile e não consiga conectar, é só criar um atalho do executavel e passa um parametro no final que é o usuario, exemplo:

"C:\Chat.exe" Micheus

beleza!

caso outra pessoa puder me ajudar fico grato tambem!

Obrigado!

Link para o comentário
Compartilhar em outros sites

  • 0
porem está dando erro no OnClick:

OnClick := cliquei;

ele fala o seguinte:

[Error] Chat_Tools.pas(161): Incompatible types: 'method pointer and regular procedure'

eu acho que é porque a minha procedure OnClick só está na Unit... não tem form... tipo frmPrincipal.Cliquei.... num sei... não tenho mt experiencia com isso.... o que eu devo fazer?

Novamente a mensagem de erro é clara.

Uma coisa é a declaração de uma procedure e outra é a de um método. Apesar de similares, não são a mesma coisa.

Para que você possa atribuir um "procedimento" à um evento de qualquer componente, você tem que declará-lo com todos os parâmetros definidos para aquele evento e ele tem que estar declarado dentro de uma classe - neste caso você pode fazer isto no seu form.

Algo assim:

TForm1 = Class(TForm)
  ...
  procedure Cliquei(Sender :TObject);
end;

...

Micheus, se você tivesse um tempo hj dps da uma e meia... gostaria que me desse um helpzito xD, aqui tem as fontes do programa para analise...
Não tenho como fazê-lo não. Aqui na empresa não tenho acesso ao 4share e em casa, esta semana, vai ser difícil de eu conseguir sentar na frente do micro para este tipo de avaliação. Desculpe.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

certo... se quiser dar uma olhada... toma aqui o link do meu proprio site:

http://www.comandodigital.com.br/chat_client.rar

porem está dando erro no OnClick:

OnClick := cliquei;

ele fala o seguinte:

[Error] Chat_Tools.pas(161): Incompatible types: 'method pointer and regular procedure'

eu acho que é porque a minha procedure OnClick só está na Unit... não tem form... tipo frmPrincipal.Cliquei.... num sei... não tenho mt experiencia com isso.... o que eu devo fazer?

Novamente a mensagem de erro é clara.

Uma coisa é a declaração de uma procedure e outra é a de um método. Apesar de similares, não são a mesma coisa.

Para que você possa atribuir um "procedimento" à um evento de qualquer componente, você tem que declará-lo com todos os parâmetros definidos para aquele evento e ele tem que estar declarado dentro de uma classe - neste caso você pode fazer isto no seu form.

Algo assim:

TForm1 = Class(TForm)

...

procedure Cliquei(Sender :TObject);

end;

Então... o problema é que não estou usando um form... o local que estou é apenas uma unit com funções... não da pra eu fazer esse tipo de declaração, pelo menos eu acho que não...

Obrigado!

Link para o comentário
Compartilhar em outros sites

  • 0
Então... o problema é que não estou usando um form... o local que estou é apenas uma unit com funções... não da pra eu fazer esse tipo de declaração, pelo menos eu acho que não...
Não vejo qualquer problema em você criar um procedimento para o OnClick no seu form (onde estão as guias) e no código do seu procedimento chamar a sua procedure para o click que está na tal unit.

obs: do executável, só dá para ver a tela principal - não mostra nada sobre o código.

Link para o comentário
Compartilhar em outros sites

  • 0
Clica em View Unit e dps vai em Chat_Tools, é ai que eu to mechendo agora ehehehe...
Eu pensei que saberia faze isto, considerando que tivesse os fontes inclusos, mas como apenas existe o .exe, onde é que eu vou achar View unit nesta tela: :wacko:

douglasn.th.png

Aff desisto, deixei tudo numa mesma tela, não vai ter problemas...
homem de pouca fé... Não desista tão rápido. :)

agora preciso mudar a cor de fonte de certas palavras... isso já é pra outro post!,
Ok. mas adianto que você terá que trocar seu TMemo por um TRichEdit, e já algo a respeito no forum.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

já resolvi a questão do richedit facilmente... obrigado pela ajuda... qualquer hora eu tento fazer desse jeito dinovo, ehehehe...

E otra eu to mt véio pra isso... (16), num tenho cabeça... perdi tudo que sabia (nunca soube nada, ahah), esqueci dos cursos que fiz (não fiz nenhum)...

preciso me aperfeiçoar(verdade!), eheheheheh

Abraços....

Link para o comentário
Compartilhar em outros sites

  • 0

Acho que vo tenta novamente... nem sei mais como começar, to estressado...

segue as fontes:

http://www.comandodigital.com.br/Client_Fontes.rar

Infelizmente agora terei que pedir uma ajuda bem completa ehehehe...

Gostaria de uma coisa simples... quando alguém converse e marque a caixa reservado... ele crie uma tab num page control... e as mensagens com essa pessoa venham pra essa janela com um outro richtext... não precisa ser necessariamente um pagecontrol... pode ser forms individuais :rolleyes: .... então tá lançado o desafio... se alguém tiver com tempo eu fico muito grato!

Obrigado!

p.s: para conectar no servidor que está aqui no serviço ligado para testes, faça um atalho do executavel, vá nas propriedades e no final da linha destino coloque o nome do seu usuário, exemplo:

Destino: "C:\Client_Fontes\Chat_Client.exe" Douglas

dai é só aplicar e entrar nele!

Vlw

Link para o comentário
Compartilhar em outros sites

  • 0
Gostaria de uma coisa simples... quando alguém converse e marque a caixa reservado... ele crie uma tab num page control... e as mensagens com essa pessoa venham pra essa janela com um outro richtext... não precisa ser necessariamente um pagecontrol... pode ser forms individuais :rolleyes: .... então tá lançado o desafio... se alguém tiver com tempo eu fico muito grato!

Faz o seguinte, dá uma olhada neste post, analisa e brinca com o exemplo que eu cito lá (vai precisar de dois PC's na rede local). ;)

Editado por Micheus
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...