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

Access Violation


Fuzileir0

Pergunta

12 respostass a esta questão

Posts Recomendados

  • 0
Estou mexendo com socket e preciso gravar um nome no tipo que eu criei, mas está dando access violation, qual é o problema?? Valeu galera

A maneira correta de usar seria assim:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ScktComp;

type
   PUser = ^TUser;

   TUser = record
   id: integer;
   nick: string;
end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    S: TServerSocket;

    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Ponteiro : PUser;
  end;

var
   Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
    Ponteiro := New( PUser );
    Ponteiro^.nick := 'Teste';
end;

end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Nossa, Jhonas como sempre rezando a reza e fazendo milagre. Uma última (ou não) dúvida... pra encerrar a conexão com o usuário é só dar um Dispose(Ponteiro) no OnDisconnect do serversocket?

Outra coisa... se um usuario quer enviar para outro, como que posso fazer uma jogada pros IDS não serem confundidos caso determinado ID saia do chat?

Exemplo:

Servidor = ID 0

Cliente1 = ID 1

Cliente2 = ID 2

Cliente3 = ID 3

Cliente3 envia para Cliente1 mas o Cliente1 caiu antes de receber a mensagem, dae o Cliente2 passou a ser o 1... o cliente2 que vai receber...

como que posso tratar isso?

Link para o comentário
Compartilhar em outros sites

  • 0

Exatamente, Jhonas!

Primeiro eu tentei náo reinventar a roda, baixei vaaarios scripts que tem... mas todos que estao livres só funcionam com determinado componente que não funciona no delphi 2007 (o meu)... então preferi aprender socket e tentnar entender como se comunicam e motnar o meu proprio...

Link para o comentário
Compartilhar em outros sites

  • 0
Exatamente, Jhonas!

Primeiro eu tentei náo reinventar a roda, baixei vaaarios scripts que tem... mas todos que estao livres só funcionam com determinado componente que não funciona no delphi 2007 (o meu)... então preferi aprender socket e tentnar entender como se comunicam e motnar o meu proprio...

OK ... No primeiro endereço tem um Messenger pronto ... muito bom funciona em rede para todos os usuarios conectados ao programa

http://www.fprass.hpg.com.br/

OBS: Verifiquei que o endereço foi retirado do ar ....o componente usado é o TMessenger ... se não achar nada nos outros, me dá o seu email que te envio o projeto.

=================================================

Esses outros são Chats usando sockets

http://thiago.oxente.org/2006/08/16/delphi_chat

http://www.activedelphi.com.br/print.php?sid=249

http://www.invasao.com.br/2009/01/29/tutor...at-no-delphi-7/

http://www.bigspeed.net/bssocklib/bssockli...lphi7sample.htm

http://www.webcheats.com.br/forum/delphi-v...t-servidor.html

Veja se é isto que esta querendo

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Esses programas não fazem controle de usuário pra poder enviar mensagem só pra determinada pessoa ao invés de dar um broadcast... fazer chat de broadcast eu sei, agora to com duvida de como fazer cada usuario ter uma identificação especifica e essa identificacao não ser trocada quando um usuario cai (fazendo com que a mensagem vá para outra pessoa)

Link para o comentário
Compartilhar em outros sites

  • 0
Esses programas não fazem controle de usuário pra poder enviar mensagem só pra determinada pessoa

O componente que te falei ( TMessenger ) faz isso...

unit fmMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ImgList, Messenger, Menus,  Buttons,
  ComCtrls, ToolWin, ActnList, RXShell;

type
  TfrmMain = class(TForm)
    ICQFmsg: TMessenger;
    ToolBar1: TToolBar;
    btnClose: TToolButton;
    btnHide: TToolButton;
    ActionList1: TActionList;
    actClose: TAction;
    PopupMenuLista: TPopupMenu;
    Enviarmensagem1: TMenuItem;
    Minimizar1: TMenuItem;
    Sair2: TMenuItem;
    actHide: TAction;
    actSend: TAction;
    N1: TMenuItem;
    Enviarmensagemparaogrupo1: TMenuItem;
    actGroup: TAction;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ICQFimg: TImageList;
    Adicionarlista1: TMenuItem;
    actAddList: TAction;
    lbxUser: TListBox;
    TrayIcon1: TRxTrayIcon;
    procedure ICQFmsgUserListChange(Sender: TObject; UserList: TStrings);
    procedure actCloseExecute(Sender: TObject);
    procedure ICQFmsgNewMemo(Sender: TObject; Origin, Time: String;
      MsgLines: TStrings);
    procedure ICQFmsgError(Sender: TObject; ErrorMsg: String);
    procedure TrayClick(Sender: TObject);
    procedure actHideExecute(Sender: TObject);
    procedure PopupMenuListaPopup(Sender: TObject);
    procedure actGroupExecute(Sender: TObject);
    procedure ICQFmsgNewLine(Sender: TObject; Origin, Time, Line: String);
    procedure FormActivate(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure actSendExecute(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

uses fmReceive, fmSend;

{$R *.DFM}

//procedure GetComputers(Workgroup : String;Retorno:TStrings);
procedure GetComputers;
var
  hEnum, dwResult, dwResultEnum : DWORD;
  lpnrLocal : array
        [0..16384 div SizeOf(TNetResource)] of TNetResource; // ponteiro para as estruturas enumeradas
  i : integer;
  cEntries : Longint;
  cbBuffer: DWORD;
begin
  centries := -1;    // enumera todas as entradas possíveis
  cbBuffer := 16384; // 16K

  // chama a função WNetOpenEnum para inciar a enumeração.
  dwResult := WNetOpenEnum(
                          RESOURCE_CONTEXT,  // Enumera o recursos atualmente conectados.
                          RESOURCETYPE_DISK, // todos os recursos
                          0,                 // enumera todos os recursos
                          nil,               // NULL
                          hEnum              // handle para os recursos 
                          );

  if (dwResult <> NO_ERROR) then 
  begin
    // poderia processar os erros com um manipulador de erros 
    // definido na aplicação. 
    Exit;
  end; 

  // inicializa o buffer.
  FillChar( lpnrLocal, cbBuffer, 0 ); 

  // chama a função WNetEnumResource para continuar a enumeração
  dwResultEnum := WNetEnumResource(hEnum,           // manipulador 
                                  DWORD(cEntries),  // definido localmente como -1 
                                  @lpnrLocal,       // LPNETRESOURCE
                                  cbBuffer);        // tamanho do buffer 

  frmMain.lbxUser.Clear;
  // preencho uma listbox 
  for i := 0 to cEntries - 1 do 
  begin
    // lê cada estrutura para pegar o nome do 
    // recurso remoto (lpnrLocal[i].lpRemoteName)
    frmMain.lbxUser.Items.Add( lpnrLocal[i].lpRemoteName );
  end;

  // chama WNetCloseEnum para finalizar a enumeração.
  dwResult := WNetCloseEnum(hEnum);
end;


//.............................................................

procedure TfrmMain.ICQFmsgUserListChange(Sender: TObject; UserList: TStrings);
begin
  lbxUser.Items := UserList; //captura todos os usuários onLine
  //GetComputers('MSHOME',lbxUser.Items);
end;

procedure TfrmMain.actCloseExecute(Sender: TObject);
begin
  Close;
end;

procedure TfrmMain.ICQFmsgNewMemo(Sender: TObject; Origin, Time: String;
  MsgLines: TStrings);
begin
  frmReceive := TfrmReceive.Create(Application);
  frmReceive.lblReceive.Caption := Origin;
  frmReceive.mmoReceive.Lines := MsgLines;
  Beep;
  frmReceive.ShowModal;
  frmReceive.Free;
end;

procedure TfrmMain.ICQFmsgError(Sender: TObject; ErrorMsg: String);
begin
 // ShowMessage('Erro, Tentativa de Abrir mais de uma vez!!!');
end;


procedure TfrmMain.TrayClick(Sender: TObject);
begin
  if frmMain.Visible = False then
    frmMain.Visible := True;
end;

procedure TfrmMain.actHideExecute(Sender: TObject);
begin
  Hide;
end;

procedure TfrmMain.PopupMenuListaPopup(Sender: TObject);
begin
  if lbxUser.ItemIndex = -1 then
    Enviarmensagem1.Enabled := False
  else
    Enviarmensagem1.Enabled := True;
end;

procedure TfrmMain.actGroupExecute(Sender: TObject);
begin
  frmSend := TfrmSend.Create(Application);
  frmSend.lblSend.Caption := 'Mensagem para o grupo!';
  frmSend.ShowModal;
  frmSend.Free;
end;


procedure TfrmMain.ICQFmsgNewLine(Sender: TObject; Origin, Time,
  Line: String);
begin
  frmReceive := TfrmReceive.Create(Application);
  frmReceive.lblReceive.Caption := Origin;
  frmReceive.mmoReceive.Text := Line;
  frmReceive.ShowModal;
  frmReceive.Free;
end;

procedure TfrmMain.FormActivate(Sender: TObject);
begin
  ICQFmsg.Activate;
  Caption := Caption + ' -> ' + ICQFmsg.User;
  //lbxUser.Items := UserList; //captura todos os usuários onLine
  GetComputers;
end;

procedure TfrmMain.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #27 then actHideExecute(Sender);
end;

procedure TfrmMain.actSendExecute(Sender: TObject);
begin
  if lbxUser.ItemIndex = -1 then
    begin
      ShowMessage('Selecione um usuário!');
      exit;
    end;

  frmSend := TfrmSend.Create(Application);
  frmSend.lblSend.Caption := lbxUser.Items.Strings[lbxUser.ItemIndex];
  frmSend.ShowModal;
  frmSend.Free;
end;

end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

é que eu estou querendo aprender mesmo :D

Agora estou com outra dúvida...

No meu chat tenho um listbox que vai listar todos os usuários que estão online, mas como que eu faço para que o usuário que entrar no Mensageiro naquele momento receba todos os nomes/dados dos usuários que já estão conectados? Tentei fazer um loop e não consegui...

No meu servidor eu uso esse record pra gravar os dados de cada um..

type

PUser = ^TUser;

TUser = record

login: string;

id: integer;

end;

Quando o usuário se conecta:

Socket.Data := New(PUser);

TUser(Socket.Data^).login := argumento[1]; // cadastrando login

TUser(Socket.Data^).id := StrToInt(argumento[2]); // cadastrando id

...

Só que no cliente, cada usuário também precisa ter uma identificação idêntica a que tá servidor, pois quando o cara clicar duas vezes sobre o nick na ListBox vai abrir um novo form pra comunicação entre somente aqueles dois usuários.

Como que eu faço pra que os dados de todos os usuários tanto no servidor quanto nos clientes conectados sejam iguais?

Link para o comentário
Compartilhar em outros sites

  • 0

Pessoal, como vocês podem perceber estou montando um sistema de chat no estilo do MSN...

Consegui fazer a comunicação entre os integrantes.

Só que agora estou com uma dúvida.

Cada cliente tem uma listbox com a lista de usuários on-line, se eu quiser conversar com o "João", clico duas vezes para abrir a janela.

Mas aí começam minhas dúvidas:

1. Como que faço para criar uma janela quando clicar duas vezes no nick da pessoa? Lembrando que não posso criar uma janela caso já exista uma, ou seja, como verifico antes se já tem uma janela criada para aquele usuário?

2. Quando o cliente receber um socket, como que eu faço para que a mensagem seja adicionada no Memo1 daquele formulário específico, que está interligando entre aquele usuário?

Obrigado!

Link para o comentário
Compartilhar em outros sites

  • 0
Mas aí começam minhas dúvidas:

1. Como que faço para criar uma janela quando clicar duas vezes no nick da pessoa? Lembrando que não posso criar uma janela caso já exista uma, ou seja, como verifico antes se já tem uma janela criada para aquele usuário?

2. Quando o cliente receber um socket, como que eu faço para que a mensagem seja adicionada no Memo1 daquele formulário específico, que está interligando entre aquele usuário?

Vai encontrar um exemplo com essas funcionalidades neste endereço

http://www.invasao.com.br/2009/01/29/tutor...at-no-delphi-7/

abraço

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