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

Chat em Visual Basic


Darknnez

Pergunta

Foi mal, não consegui pensar em um título adequado pra minha dúvida.

O negócio é o seguinte.

Eu fiz uma chat no VB6.

Em um TextBox, o usuário escreve a mensagem que é salva em um arquivo.txt:

Private Sub Command1_Click()
Set txt = FSO.OpenTextFile("\\Lucas\C\ChatLog.txt", ForAppending)
If Destinatário.Caption = "Todos" Then
    txt.WriteLine (Nick + " diz: " + Mensagem.Text + vbCr)
    txt.Close
Else
    txt.WriteLine (Nick + " fala para " + Destinatário.Caption + " " + Mensagem.Text + vbCr)
    txt.Close
End If
Mensagem.Text = ""
End Sub
Um segundo TextBox lê todo o conteúdo desse arquivo.txt, e é atualizado por um Timer:
Private Sub Timer1_Timer()
Set txt = FSO.OpenTextFile("\\Lucas\C\ChatLog.txt", ForReading)
Caixa.Text = txt.ReadAll
txt.Close

Caixa.SelStart = Len(Caixa.Text)
Destinatário.Caption = Usuários.Text
End Sub

O que eu queria fazer é que nesse segundo TextBox o nick do usuário aparecesse colorido, de acordo com a cor selecionada pelo usuário. Mas tem como fazer isso, ou seja, alterar a cor de apenas uma parte do texto?

Link para o comentário
Compartilhar em outros sites

  • Respostas 54
  • Created
  • Última resposta

Top Posters For This Question

Posts Recomendados

  • 0

opa aqui no trampo teve um cara q fez um chat tipo o seu. só q ele fez com banco de dados hahahah

ai eu tava tentando fazer o mesmo com winsock. já ta mandando mensagem e tudo, só falta dexar mais bunitinho e etc.

pra mudar só parte do texto, em vez de TextBox, use o RichTextBox (tem q adicioanr o componente). faz uma busca por ai. no site do macoratti ensina bastante coisa tb.

Link para o comentário
Compartilhar em outros sites

  • 0

Esse chat que eu fiz na verdade só funciona em rede compartilhada.

O log das mensagens fica salvo no meu PC, e o programa acessa ele do outro computador aqui de casa.

Eu vi que o winsock seria a melhor opção pra fazer o programa em rede, só que tem que trabalhar com BD, e eu não sei fazer isso, então estou tentando descobrir uma maneira de fazer igual só que com arquivo.txt.

Pelo menos as mensagens já são enviadas corretamente.

huahahaha

E achei esse RichTextBox muito complicado.

Dei uma pesquisada, e fiz uns testes aqui, mas não consegui fazer exatamente aquilo que queria fazer.

Não consegui selecionar uma parte específica do texto e mudar a cor somente dela.

O mais perto que eu consegui chegar foi:

RichTextBox1.SelText = Nick

RichTextBox1.SelColor = vbBlue

Mas não ficou legal.

Link para o comentário
Compartilhar em outros sites

  • 0

é o seu programa ta igual ao do cara q trabalho comigo.

mas no seu caso, acho q pode dar pau se tiver mta gente usando. tipo, se dois caras abrirem o txt pra salvar ao mesmo tempo, só vai chegar uma das mensagens. com banco de dados não teria esse problema

mas com o winsock não precisa de banco de dados não. mas você precisaria de dois programas, um servidor e o outro cliente (q é o q os usuarios iriam usar). ai o do servidor fica esperando as mensagens e quando receber, repassa pra todas as conexoes.

você pode usar banco de dados pra gravar log da conversa e outras coisas q você pode querer fazer. mas não é necessario pra comunicacao.

mas explica melhor esse codigo q você pos ai. o q é a variavel Nick??

e não ficou legal como??

a e desistiu da formula 1??

EDITADO:

o meu do winsock tb parei na parte do richtextbox. eu tava fazendo pro cara poder editar fonte, cor, tamanho, etc mas ta dando mo trampo e fiquei com preguica de terminar. um dia eu continuo la.

Link para o comentário
Compartilhar em outros sites

  • 0
é o seu programa ta igual ao do cara q trabalho comigo.

mas no seu caso, acho q pode dar pau se tiver mta gente usando. tipo, se dois caras abrirem o txt pra salvar ao mesmo tempo, só vai chegar uma das mensagens. com banco de dados não teria esse problema

Hmm... realmente.

Eu atualizando o chat com um Timer, com interval = 1, pode resolver o problema, ou dificultar que ele aconteça?

mas com o winsock não precisa de banco de dados não. mas você precisaria de dois programas, um servidor e o outro cliente (q é o q os usuarios iriam usar). ai o do servidor fica esperando as mensagens e quando receber, repassa pra todas as conexoes.

você pode usar banco de dados pra gravar log da conversa e outras coisas q você pode querer fazer. mas não é necessario pra comunicacao

Eu achei um tutorial do macoratti explicando bem isso.

Quando puder vou dar uma lida.

mas explica melhor esse codigo q você pos ai. o q é a variavel Nick??

e não ficou legal como??

Quando um usuário escreve e envia a mensagem, ela fica salva em um arquivo.txt da seguinte forma:

Nick do Usuário + " diz: " + mensagem

E depois uma TextBox lê todo o conteúdo do arquivo.txt e mostra ele.

Eu queria que apenas o nick que apareceu ficasse colorido, enquanto o resto permanecesse igual.

Aí eu fiz isso que falei no post passado.

Mandei o RichTextBox selecionar a parte em que o nick estivesse escrito, e mudei a cor do texto selecionado para azul.

Mas nem eu entendi muito bem o que aconteceu de errado.

Na primeira vez que testei deu quase certo, o nick chegou a ficar azul, mas algumas vezes ficava colorido outras não.

E depois eu fiz igual tinha feito da primeira vez que testei, e não ficou colorido nenhuma vez.

a e desistiu da formula 1??

Não desisti não, mas realmente tá há muito tempo parado.

Como nas férias eu viajei muito, e não parei em casa, não tive muito tempo pra mecher no projeto.

Agora começaram as aulas e logo eu voltarei a mecher nele.

Inclusive eu parei com um problema que não consegui resolver de jeito nenhum, vou ter que te passar o projeto.

huahahahaha

As vezes eu acho um tópico que me chama a atenção.

Eu vi em uma comunidade do orkut um cara que fez um chat pra conversar com os colegas de uma universidade durante as aulas. Ele deixou um log em arquivo.txt no HD da máquina, que é compartilhado entre todos os outros computadores da sala dele, por que as redes da universidade são bloqueadas.

Aí eu me interesse e resolvi tentar fazer um parecido.

E consegui. Funcionou direitinho entre o meu computador e um outro computador aqui de casa.

o meu do winsock tb parei na parte do richtextbox. eu tava fazendo pro cara poder editar fonte, cor, tamanho, etc mas ta dando mo trampo e fiquei com preguica de terminar. um dia eu continuo la.

Eu vi lá no macoratti um tutorial que explica bem como mudar esse tipo de coisa, como a cor, tamanho, fonte, etc.

Só não explica como selecionar uma parte específica do texto.

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

  • 0
é o seu programa ta igual ao do cara q trabalho comigo.

mas no seu caso, acho q pode dar pau se tiver mta gente usando. tipo, se dois caras abrirem o txt pra salvar ao mesmo tempo, só vai chegar uma das mensagens. com banco de dados não teria esse problema

Hmm... realmente.

Eu atualizando o chat com um Timer, com interval = 1, pode resolver o problema, ou dificultar que ele aconteça?

pode dificultar sim, ate resolver. mas imagina depois de uma hora de conversa, o txt com 15000 linhas, e o programa abrindo e lendo ele inteiro a cada milesimo de segundo. pode ficar pesado.

o txt tem um problema muito gde q é q cada vez q você for achar uma mensagem você tem q ler ele intero. e isso leva tempo. com o append você so pode escrever a mensagem no final do arquivo, não pode ser no comeco. o banco de dados seria bom porque não teria esse problema. e ai com banco de dados você poderia ir diretamente pra mensagem q quer. ai você poderia enumerar as mensagem. ai por exemplo, o programa saberia q tava na mensagem nº 500, então ele ignoraria o q tivesse antes.

é... com txt fica dificil achar um modo q funcione legal.

mas tipo, acho q ficaria melhor mesmo você enumerar as mensagens. e ai você procura a mensagem certa pra mostrar. em vez de sempre jogar todo o txt no textbox. porque isso tb resolveria a parte de mudar a cor. porque ai você só mudaria a cor da mensagem a partir do selstart. não precisaria procurar no texto todo.

porque tipo, o seltext, serve pra pegar (ou setar) o texto da selecao atual. pra achar todos os nicks do cara, você teria q setar o selstart na posicao onde esta cada um dos nicks e setar o sellength com o tamanho do nick e depois mudar a cor.

exemplo, na text box esta escrito:

eu sou o kuroi.

ai eu quero mudar a cor da palavra kuroi.

veja q a palavra kuroi comeca na posicoa numero 9 do texto e tem 5 caracteres. ai o codigo seria esse:

t.SelStart = 9
t.SelLength = 5
t.SelColor = vbBlue[/code]

entendue?? ai pra mudar a cor de todos os nicks do texto, você teria q procurar um por um com InStr e setar o SelStart e SelLenght de um por um e etc. ai o cara escreve o nick na mensagem e vai mudar a cor tb e ai não pode e etc, vai dar ainda mais trabalho e vai levar mais tempo pra fazer certinho.

ai se no caso você, em vez de sempre por o txt todo na caixa, adicionar uma mensagem por vez, você já vai saber q o nick ta exatamente na posicao do SelStart e fica mais facil.

Link para o comentário
Compartilhar em outros sites

  • 0

Tem como me dar um exemplo de como usar a função InStr?

Por que olha só:

Eu fiz da seguinte forma:

Posição = InStr(txtCaixa.Text, Tabela("Nick"))
txtCaixa.SelStart = Posição
txtCaixa.SelLength = Len(Tabela("Nick"))
txtCaixa.SelColor = vbBlue

para procurar o nick, selecioná-lo e mudar sua cor para azul.

E deu certo.

Mas como que mando continuar procurando o nick por todo o texto, e mudar a cor dele toda vez que achá-lo?

Link para o comentário
Compartilhar em outros sites

  • 0

de um mid() a partir da posicao onde estava o nick pela ultima vez. tipo assim:

Posição = InStr(txtCaixa.Text, Tabela("Nick"))
txtCaixa.SelStart = Posição
txtCaixa.SelLength = Len(Tabela("Nick"))
txtCaixa.SelColor = vbBlue
Do While Posição <> 0
    Posição = InStr(Mid(txtCaixa.Text, Posição + Len(Tabela("Nick"))), Tabela("Nick"))
    If Posição <> 0 Then
        txtCaixa.SelStart = Posição
        txtCaixa.SelLength = Len(Tabela("Nick"))
        txtCaixa.SelColor = vbBlue
    End If
Loop[/code]

deve funcionar mais o menos assim, tenta ai.

só de curiosidade... o q é Tabela?? um RecordSet??

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

  • 0
de um mid() a partir da posicao onde estava o nick pela ultima vez. tipo assim:

Posição = InStr(txtCaixa.Text, Tabela("Nick"))
txtCaixa.SelStart = Posição
txtCaixa.SelLength = Len(Tabela("Nick"))
txtCaixa.SelColor = vbBlue
Do While Posição <> 0
    Posição = InStr(Mid(txtCaixa.Text, Posição + Len(Tabela("Nick"))), Tabela("Nick"))
    If Posição <> 0 Then
        txtCaixa.SelStart = Posição
        txtCaixa.SelLength = Len(Tabela("Nick"))
        txtCaixa.SelColor = vbBlue
    End If
Loop

deve funcionar mais o menos assim, tenta ai.

Vou tentar.

Valeu.

só de curiosidade... o q é Tabela?? um RecordSet??

Sim.

Edit:

Eu tentei aqui, aí fiz o seguinte:

Escrevi a primeira mensagem, o nick apareceu azul e o resto permaneu igual.

Ou seja, tudo certo.

Aí na segunda mensagem que eu escrevi, travou tudo!

O programa e o VB travaram,

Eu esperei um tempo pra ver o que acontecia, e quando mandei fechar o programa, o VB fechou junto.

Por que isso aconteceu?

Link para o comentário
Compartilhar em outros sites

  • 0

hahah é só um loop infinito, a primera vez q você ve um assusta mesmo hahaha.

o q acontece é q eu fiz o código pra ele ficar em loop enquanto a posicao for diferente de 0. so q eu fiz o codigo errado e ele não ser diferente de 0 nunca. ou seja, ele vai ficar dentro do loop pra sempre.

hahah antigamente quando acontecia isso, eu tb fechava o visual basic todo e perdia tudo q eu não tinha salvo. mas quando isso acontecer de novo é só apertar Ctrl + Break q ele para.

corrigi o codigo aqui, o problema é q no codigo q eu fiz esqueci de fazer o posicao considerar o texto todo. tipo, a partir do segundo InStr, ele conta a posicao apenas a partir do inicio do Mid(), não conta o texto todo.

a solucao é por uma variavel (no caso pus nela o nome de soma) pra ir somando as posicoes. tipo assim:

Posição = InStr(txtCaixa.Text, Tabela("Nick"))
soma = soma + Posição - 1
txtCaixa.SelStart = Posição
txtCaixa.SelLength = Len(Tabela("Nick"))
txtCaixa.SelColor = vbBlue
soma = soma + Len(Tabela("Nick"))
Do While Posição <> 0
    Posição = InStr(Mid(txtCaixa.Text, soma + 1), Tabela("Nick"))
    If Posição <> 0 Then
        soma = soma + Posição - 1
        txtCaixa.SelStart = Posição
        txtCaixa.SelLength = Len(Tabela("Nick"))
        txtCaixa.SelColor = vbBlue
        soma = soma + Len(Tabela("Nick"))
    End If
Loop[/code]

veja se funciona ae.

Link para o comentário
Compartilhar em outros sites

  • 0

huahaha

Pelo menos tava tudo salvo aqui (grande coisa...).

Só que não deu certo não.

Agora o programa rodou normal (loop finito haha).

Só que não coloriu adequadamente.

Eu mandei a primeira mensagem, e deu tudo certo.

Na segunda, o nick já não vinha colorido.

A partir da terceira mensagem despirocou geral.

O texto no TextBox ficou mais ou menos assim:

Lucas diz: oi

Lucas diz: teste

Lucas diz: alô

Lucas diz: e aí, bom?

Código completo:


Option Explicit

Dim Banco As Database
Dim Tabela As Recordset
Dim Posição As Variant
Dim Início As Variant
Dim Soma As Integer

Private Sub Form_Load()

Set Banco = OpenDatabase("C:\Documents and Settings\PA\Meus documentos\teste.mdb")
Set Tabela = Banco.OpenRecordset("user", dbOpenTable)

End Sub

Private Sub Command1_Click()

Tabela.AddNew
Tabela("Nick") = txtNick.Text
Tabela("Msg") = txtMsg.Text
Tabela.Update

Tabela.MoveLast
txtCaixa.Text = txtCaixa.Text & Tabela("Nick") & " diz: " & Tabela("Msg") & vbCrLf

Posição = InStr(txtCaixa.Text, Tabela("Nick"))
Soma = Soma + Posição - 1
txtCaixa.SelStart = Posição
txtCaixa.SelLength = Len(Tabela("Nick"))
txtCaixa.SelColor = vbBlue
Soma = Soma + Len(Tabela("Nick"))
Do While Posição <> 0
Posição = InStr(Mid(txtCaixa.Text, Soma + 1), Tabela("Nick"))
If Posição <> 0 Then
Soma = Soma + Posição - 1
txtCaixa.SelStart = Posição
txtCaixa.SelLength = Len(Tabela("Nick"))
txtCaixa.SelColor = vbBlue
Soma = Soma + Len(Tabela("Nick"))
End If
Loop

End Sub
[/codebox]

Link para o comentário
Compartilhar em outros sites

  • 0

veja q as duas linhas q estao txtCaixa.SelStart = Posição eram pra ser txtCaixa.SelStart = soma

porque a posicao vai pegar a posicao a partir do mid. exemplo, se o mid vai comecar na posicao 10, e o nick ta na posicao 12, a variavel posicao vai retornar 2, mas o selstart tem q ser 12. a variavel soma vai guardar a posicao exata relativa ao txtCaixa.Text, enquanto q a Posição vai guardar a posicao em relacao à ultima ocorrencia do nick.

EDITADO:

é, foi mal, olhei meu post e vi fui eu q passei errado. antes de postar testei aqui e tinha feito certo, mas meus nomes de variaveis tavam diferentes e na hora de postar acabei trocando errado.

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

  • 0

Agora ficou tudo azul.

huahahahauahuahuaha

EDITADO:

é, foi mal, olhei meu post e vi fui eu q passei errado. antes de postar testei aqui e tinha feito certo, mas meus nomes de variaveis tavam diferentes e na hora de postar acabei trocando errado.

Foi culpa do 'Ctrl+C Ctrl+V' aqui.

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

  • 0


Option Explicit

Dim Banco As Database
Dim Tabela As Recordset
Dim Posição As Variant
Dim Início As Variant
Dim Soma As Integer

Private Sub Form_Load()

Set Banco = OpenDatabase("C:\Documents and Settings\PA\Meus documentos\teste.mdb")
Set Tabela = Banco.OpenRecordset("user", dbOpenTable)

End Sub

Private Sub Command1_Click()

Tabela.AddNew
Tabela("Nick") = txtNick.Text
Tabela("Msg") = txtMsg.Text
Tabela.Update

Tabela.MoveLast
txtCaixa.Text = txtCaixa.Text & Tabela("Nick") & " diz: " & Tabela("Msg") & vbCrLf

Posição = InStr(txtCaixa.Text, Tabela("Nick"))
Soma = Soma + Posição - 1
txtCaixa.SelStart = Soma
txtCaixa.SelLength = Len(Tabela("Nick"))
txtCaixa.SelColor = vbBlue
Soma = Soma + Len(Tabela("Nick"))
Do While Posição <> 0
Posição = InStr(Mid(txtCaixa.Text, Soma + 1), Tabela("Nick"))
If Posição <> 0 Then
Soma = Soma + Posição - 1
txtCaixa.SelStart = Soma
txtCaixa.SelLength = Len(Tabela("Nick"))
txtCaixa.SelColor = vbBlue
Soma = Soma + Len(Tabela("Nick"))
End If
Loop

End Sub
[/codebox]

Eu só troquei txtCaixa.SelStart = Posição por txtCaixa.SelStart = Soma

Link para o comentário
Compartilhar em outros sites

  • 0

hum, você criou a Soma no Declarations. ai ela guarda sempre o ultimo valor. a primera coisa no clique do botao, poe pra zerar ela e veja se não funciona.

mas mano, você ta usando DAO pra acessar os bancos?? para com isso, esse negocio é da época da minha vó ahahahha. use ADO q é mais novo e melhor veja aqui:

http://www.macoratti.net/ado.htm

e esse tb:

http://www.macoratti.net/dao_ado.htm

Link para o comentário
Compartilhar em outros sites

  • 0

cobol ensina na minha faculdade. é optativo, talvez eu faca.

hum achei aqui agora. é o crlf q faz isso, ele muda o texto todo pra azul assim q você digita, antes ainda de entrar no loop.

por enquanto, uma gambiarra q vai resolver, é adicionar o seguinte codigo:

txtCaixa.SelStart = 0
txtCaixa.SelLength = Len(txtCaixa.Text)
txtCaixa.SelColor = vbBlack[/code] depois de
[code]txtCaixa.Text = txtCaixa.Text & Tabela("Nick") & " diz: " & Tabela("Msg") & vbCrLf

mas ainda quero descobrir porque ele dexa azul, se eu descobrir posto aqui.

Link para o comentário
Compartilhar em outros sites

  • 0

Ow então, se não for pedir demais, tem como me passar seu MSN?

Eu juro que não vou te encher o saco toda vez que estiver online.

É por que se eu for ficar perguntando aqui no fórum, vou encher o tópico de perguntinhas, por que toda vez que eu descubro como resolver um problema, em troca ganho uma nova dúvida.

E também por que do jeito que a coisa tá andando aqui (aqui em casa, não no fórum), se eu depender do fórum pra tirar minhas dúvidas, não vou acabar esse chat nunca.

Mas se tiver problema, nem esquenta, não precisa passar não.

Só se não for incômodo mesmo.

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

  • 0

Bem, não te encontrei online.

Então vou soltar um tanto problema que eu estou tendo aqui no tópico mesmo.

Eu fiz o seguinte para enviar os dados do cliente para o servidor:

Private Sub cmdCriar_Click()
wskAdmin.RemoteHostIP = "Meu IP"
wskAdmin.RemotePort = 100
wskAdmin.Connect

wskAdmin.SendData txtNome.Text
wskAdmin.SendData txtNick.Text
wskAdmin.SendData txtSenha.Text
wskAdmin.SendData wskAdmin.LocalIP
wskAdmin.SendData wskAdmin.LocalPort
End Sub

O primeiro erro é na linha wskAdmin.RemotHostIP = "Meu IP".

Quando eu rodo o programa aparece a mensagem de erro:

Wrong number of arguments or invalid property assignment

Então eu tentei me conectar pelo nome do computador em vez do IP, e deu certo.

O segundo erro foi na linha wskAdmin.Connect.

Apareceu a mensagem de erro:

Adress in use

Aí eu mudei a porta do servidor e do cliente para 200.

Parece que deu certo.

O terceiro e último problema, foi na linha wskAdmin.SendData txtNome.Text.

Apareceu a mensagem:

Wrong protocol or connection state for the requested transaction or request

Qual é o erro afinal?

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,2k
    • Posts
      651,9k
×
×
  • Criar Novo...