Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Chat mit TURBO DELPHI (https://www.delphipraxis.net/117566-chat-mit-turbo-delphi.html)

user47511 21. Jul 2008 00:49


Chat mit TURBO DELPHI
 
Heyho ich bin neu hier wie man ja sieht und habe schon ein Problem...
Ich hab versucht mit dem TCPClient und Server Sockeln einen Chat hin zu bekommen!

So sieht mein Source aus:
Delphi-Quellcode:
unit Chat_unit;

interface

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

type
  TForm2 = class(TForm)
    MemoRecive: TMemo;
    EdNick: TEdit;
    EdIp: TEdit;
    EdPort: TEdit;
    BtnSend: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    MemoSend: TMemo;
    BtnConnect: TButton;
    ClientSocket: TTcpClient;
    procedure BtnConnectClick(Sender: TObject);
    procedure ClientSocketReceive(Sender: TObject; Buf: PAnsiChar;
      var DataLen: Integer);
    procedure BtnSendClick(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;
  EdPort : string   ;

implementation

{$R *.dfm}

procedure TForm2.BtnConnectClick(Sender: TObject);
begin
begin
ClientSocket.RemoteHost:=EdIP.Text; //Die IP wird festgelegt
ClientSocket.RemotePort:= EdPort.text; //Der Port wird festgelegt
ClientSocket.Open; //Verbindung zum Server wird hergestellt
end;
end;

procedure TForm2.BtnSendClick(Sender: TObject);
begin
 ClientSocket.Sendln(BTNSEND.caption);
end;

procedure TForm2.ClientSocketReceive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
begin;
end;
var
msg: String;
clientsocket : ttcpclient;
memorecive : Tmemo;
begin;
  msg := Clientsocket.Receiveln(MsG);
  memorecive.Lines.Add(MSG);
end.
Ich weiss... sehr unaufgeräumt
Ist aber auch egal...

Wenn ich das jetzt teste bekomme ich eine Fehlermeldung über eine
Zugriffsverletzung!!

Ich weiss nicht wie ich das wegbekomme und wie ich nun weitermachen soll!

:wiejetzt:

Flips 21. Jul 2008 01:14

Re: Chat mit TURBO DELPHI
 
Hi,

hier scheint mir irgendwas merkwürdig :wink:
Delphi-Quellcode:
procedure TForm2.ClientSocketReceive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
begin;
end;
var
msg: String;
clientsocket : ttcpclient;
memorecive : Tmemo;
begin;
  msg := Clientsocket.Receiveln(MsG);
  memorecive.Lines.Add(MSG);
end.

PaddyL 21. Jul 2008 05:57

Re: Chat mit TURBO DELPHI
 
Zitat:

Zitat von .Bartipapi
Ich weiss... sehr unaufgeräumt
Ist aber auch egal...

Nein, ist es nicht, sonst waere so ein Fehler gar nicht erst aufgetaucht.

Delphi-Quellcode:
procedure TForm2.ClientSocketReceive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
var
  msg: String;
  clientsocket : ttcpclient;
  memorecive : Tmemo;
begin
  msg := Clientsocket.Receiveln(MsG);
  memorecive.Lines.Add(MSG);
end;

end.
Ach und nur so: Der Code wird auch so nicht gehen, da memorecive nicht initialisiert ist, geschweigedenn das es irgendwie sichtbar ist.

angos 21. Jul 2008 07:28

Re: Chat mit TURBO DELPHI
 
Zitat:

Zitat von PaddyL
Nein, ist es nicht, sonst waere so ein Fehler gar nicht erst aufgetaucht.

Jupp, das kann ich auch nur nochmal bestätigen. Programmiert man von vornherein sauber hat man viele schwierigkeiten weniger

Zitat:

Ach und nur so: Der Code wird auch so nicht gehen, da memorecive nicht initialisiert ist, geschweigedenn das es irgendwie sichtbar ist.
Ich tippe mal, dass das in der DFM initilisiert ist und daher sehr wohl zur Verfügung steht ;)

Sherlock 21. Jul 2008 10:17

Re: Chat mit TURBO DELPHI
 
Neee, das glaube ich nicht denn:

Delphi-Quellcode:
unit Chat_unit;

....

type
  TForm2 = class(TForm)
    MemoRecive: TMemo; // <- Das ist auf dem Form

...

procedure TForm2.ClientSocketReceive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
begin;
end;
var
msg: String;
clientsocket : ttcpclient;
memorecive : Tmemo;  // <- Das nicht. Und....
begin;
  msg := Clientsocket.Receiveln(MsG);
  memorecive.Lines.Add(MSG); // <- ...hier wird es verwendet :(
end.
Was mich eigentlich am meisten wundert ist, daß es kompiliert. :)

Sherlock

Diamondback2007 21. Jul 2008 10:23

Re: Chat mit TURBO DELPHI
 
Lokale Variablen überdenken globale und deswegen wir es wohl auch keinen Fehler geben.

Richtig wäre es entweder die lokale Variable zu löschen oder richtig zu initialisieren mit
Delphi-Quellcode:
MyMemo := TMemo.Create(self);
Und dann noch dafür zu sorgen dass es eine Position und größe und so hat.

angos 21. Jul 2008 10:30

Re: Chat mit TURBO DELPHI
 
oh,

hatte nur das auf der form gesehen... na ich glaube da ist jetzt vielleicht doch mal ein dezenter Hinweis auf Grundlagentutorials angemessen, da in dem Bereich ja doch ein paar fehler im Source zu sehen sind :) : http://www.delphi-treff.de/tutorials/

Ansonsten noch ein Tipp um Fehler durch unformatierten Code zu vermeiden: Es gibt schöne Codeformatter die dir genau diese Arbeit abnehmen. http://www.google.de/search?hl=de&rl...nG=Suche&meta=

Gruß

user47511 21. Jul 2008 10:57

Re: Chat mit TURBO DELPHI
 
Danke für die ganzen schnellen Antworten!
Ich denke ich fang damit nochmal von vorne an und les die Grundlagen!
Danke nochmal

user47511 21. Jul 2008 12:13

Re: Chat mit TURBO DELPHI
 
So ich hab jetzt ein bisschen rumprobiert und erstmal alles was nicht geht rausgestrichen.
Dann habe ich versucht das ganze noch per Hand aufzuhübschen!
So sieht jetzt der Source vom Client aus:
Delphi-Quellcode:
unit Chat_unit;

interface

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

type
  TForm2 = class(TForm)
    MemoRecive: TMemo;
    EdNick: TEdit;
    EdIp: TEdit;
    EdPort: TEdit;
    BtnSend: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    MemoSend: TMemo;
    BtnConnect: TButton;
    ClientSocket: TTcpClient;
    procedure BtnConnectClick(Sender: TObject);
    procedure ClientSocketReceive(Sender: TObject; Buf: PAnsiChar;
      var DataLen: Integer);
    procedure FormCreate(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;
  EdPort : string   ;

implementation

{$R *.dfm}

procedure TForm2.BtnConnectClick(Sender: TObject);
begin
begin
ClientSocket.RemoteHost:=EdIP.Text; //Die IP wird festgelegt
ClientSocket.RemotePort:= EdPort.text; //Der Port wird festgelegt
ClientSocket.Open; //Verbindung zum Server wird hergestellt
if ClientSocket.Active = true then
    BtnSend.Enabled := true;

end;
end;

procedure TForm2.ClientSocketReceive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
begin;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
BtnSend.Enabled := false;
end;

end.
Und dann habe ich noch den Server:
Delphi-Quellcode:
interface

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

type
  TForm2 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Serversocket: TTcpServer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
Serversocket.Active := False;
Application.Terminate;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
ServerSocket.LocalPort := '23';
  ServerSocket.Active := True;
end;
end.
Ist alles soweit in Ordnung?
Wenn ja, wie soll ich da jetzt weitermachen?!

:gruebel:

Diamondback2007 21. Jul 2008 12:51

Re: Chat mit TURBO DELPHI
 
Du kannst dir ja mal das Tutorial von Narses aus dem DF ansehen: Klick!

user47511 21. Jul 2008 13:39

Re: Chat mit TURBO DELPHI
 
Danke aber bei mir geht nu gor nix mehr!!
Wenn ich was tippe überschreibt der immer die anderen geschriebenen Zeilen!

Ausserdem hauen Sachen wie:
Delphi-Quellcode:
ServerSocket1.[b]Socket[/b].[b]ActiveConnections[/b]
bei mir nicht hin
selbst wenn ich "Socket" wegnehme motzt er bei "ActiveConnections"

Sherlock 21. Jul 2008 14:04

Re: Chat mit TURBO DELPHI
 
Nur am Rande: Der Port 23 ist eigentlich für Telnet definiert. Freie Ports sind in der Regel jenseits von 1023 zu finden.

Ansonsten schau Dir wirklich mal das eine oder andere Tutorial an...auch zum Thema "aufhübschen" von Quellcode. ;)

Sherlock

Diamondback2007 21. Jul 2008 14:06

Re: Chat mit TURBO DELPHI
 
Ja, drücke mal auf "Einfügen" dann sollte es wieder gehen ;)

user47511 21. Jul 2008 16:29

Re: Chat mit TURBO DELPHI
 
So alles ist wieder normal und ich hab mal weiter gemacht bis jetzt habe ich auch nur einen Fehler den ich nicht ganz verstehe...
Sonst glaube ich bin ich auf dem richtigen Weg...

Mein Fehler ist dieser:
Delphi-Quellcode:
ServerSocket.LocalPort := Myport;
Und für Myport habe ich
Delphi-Quellcode:
const
Myport = 12345;
festgelegt!
Doch dann kommt ein Fehler wegen inkompatibler Typen (String und Integer)
Ich weiss nicht wieso das so sein soll?
Selbst wenn ich einfach 12345 dahin schreibe kommt dasselbe raus!
:cyclops:

Phoenix 21. Jul 2008 16:39

Re: Chat mit TURBO DELPHI
 
Was ist 12345? Genau: Eine Zahl. Ein Integer.
Und was ist der Typ von LocalPort? Genau der gleiche wie der RemotePort vom ClientSocket. Dem hast Du ja schon einen String zugewiesen und das hatte geklappt.

Was ist denn jetzt so schwer an der Fehlermeldung zu verstehen, dass Du einem Wert, der einen String erwartet, keinen Integer zuweisen kannst? Du musst aus der Zahl 12345 eben einen String / Text machen.

user47511 21. Jul 2008 16:46

Re: Chat mit TURBO DELPHI
 
Ok ich hatte nur gedacht das das dann nicht mehr funktioniert

user47511 21. Jul 2008 18:12

Re: Chat mit TURBO DELPHI
 
ICh weiss das ich nerve aber ich muss nochmal um nen Denkanstoß oder eine Lösung bitten!

Chat Source
Delphi-Quellcode:
unit Chat_unit;

interface

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

type
  TForm2 = class(TForm)
    MemoRecive: TMemo;
    EdNick: TEdit;
    EdIp: TEdit;
    EdPort: TEdit;
    BtnSend: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    BtnConnect: TButton;
    ClientSocket: TTcpClient;
    Memosend: TEdit;
    Button1: TButton;
    procedure BtnConnectClick(Sender: TObject);
    procedure ClientSocketReceive(Sender: TObject; Buf: PAnsiChar;
      var DataLen: Integer);
    procedure FormCreate(Sender: TObject);
    procedure BtnSendClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public

  end;

var
  Form2: TForm2;
  EdPort : string   ;

implementation

{$R *.dfm}

procedure TForm2.BtnConnectClick(Sender: TObject);
begin
begin
ClientSocket.RemoteHost:=EdIP.Text; //Die IP wird festgelegt
ClientSocket.RemotePort:= EdPort.text; //Der Port wird festgelegt
ClientSocket.Open; //Verbindung zum Server wird hergestellt
//if ClientSocket.connected = true then
begin
    BtnSend.Enabled := true;
    MemoRecive.Lines.Add('Verbunden')
end
//    else
//   Memorecive.Lines.Add('Verbindung konnte nicht hergestellt werden.');

end;
end;
procedure TForm2.BtnSendClick(Sender: TObject);
begin
if ClientSocket.ACTIVE = true then
ClientSocket.Sendln(Memosend.Text)
else
Memorecive.Lines.Add('Nicht verbunden')
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
Clientsocket.Sendln(Memosend.Text)
end;

procedure TForm2.ClientSocketReceive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
begin;
MemoRecive.Lines.Add(clientsocket.Receiveln());
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
BtnSend.Enabled := false;
end;

end.
Server Source
Delphi-Quellcode:
unit chsrv;

interface

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

  const
  Myport = 12345;

type
  TForm2 = class(TForm)
    MemoRecive: TMemo;
    Exit: TButton;
    Serversocket: TTcpServer;
    procedure FormCreate(Sender: TObject);
    procedure ExitClick(Sender: TObject);


  private
    { Private-Deklarationen }
  public

  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.ExitClick(Sender: TObject);
begin
Application.Terminate
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
ServerSocket.LocalPort := '12345'; // den Port eintragen
ServerSocket.Open; // Server aktivieren
Memorecive.Lines.Add('Server online.');
end;

procedure Serversocketaccept(Sender: TObject;
      ClientSocket: TCustomIpClient; MemoRecive: TMemo;
      Serversocket :TTCpserver;
      memosend: TEdit);
  var
  msg: String;
//  i: integer;
begin
msg := serversocket.Receiveln(memosend.text);
Memorecive.lines.Add(msg);
serversocket.Sendln(msg)
end;


end.
Der server hat eben als ich irgendwas mit On Accept gemacht habe eine Nachricht empfangen aber mehr bekomme ich nicht hin!

Sherlock 22. Jul 2008 07:58

Re: Chat mit TURBO DELPHI
 
Was soll denn der Server machen, wenn sich mehrere Clients anmelden? Zu einem Chat gehören ja nunmal mehr als einer.

Du musst Dir überlegen, wie Du die Massen von Clients verwaltest. Die Serverkomponente gibt Dir ja was zur Hilfe, den ClientSocket. Aber wie Du das auswertest, organisierst und verwendest...das ist das Ergebnis von...sagen wir mal einer Woche durcharbeiten von Delphi-Grundlagen. Also tu Dir was gutes und lies ein wenig in den Links, Die Dir gegeben wurden.

Dann denk mal drüber nach, was auf der Clientseite eigentlich Button1 und BtnSend unterscheidet, oder besser noch, wofür Du beide brauchst.
Weiterhin solltest Du Dir Gedanken über Codeformatierung und dem inflationären Gebrauch von begin und end machen.


Natürlich möchte man als Anfänger gleich den großen Wurf landen, und die ultimative Killerapplikation schreiben. Das Forum hier ist voll von solchen ambitionierten Projekten. Aber die wenigsten haben es bis zum Ende geschafft, und schon gar nicht ohne sich dabei doch noch mit den Grundlagen zu beschäftigen.

Ich würde Dich gerne unterstützen bei Deinem Vorhaben, aber ein bisschen was muss auch von Deiner Seite kommen. Lies ein paar Kapitel aus den Anfängertutorials. Dann kannst Du deutlich genauer das Problem erfassen und auch mitteilen.

Aber nicht den Mut verlieren. Delphi ist gut, tausendmal besser als sein Ruf. Damit bekommst Du alles hin, was Du dir vornimmst, wenn Du Dir die Grundlagen angeeignet hast.

Sherlock

user47511 22. Jul 2008 11:43

Re: Chat mit TURBO DELPHI
 
Oh danke für die wirklich gute Antwort...
Ich werd dann ja wohl noch ein bisschen lernen müssen...
Kann mir jemand vllt. mal ein paar Buchtips geben?
Dann kann ich immer zwischendurch mal lesen!


P.S.: Button1 sollte eig.mal eine andere Funktion haben..

angos 22. Jul 2008 11:58

Re: Chat mit TURBO DELPHI
 
Hi,

also Buchtips... hmmm: Am Anfang hatte ich mal "Delphi in 21 Tagen". Das war nicht schlecht um schnell einzusteigen, wenn ich mich recht erinnere. Aber was mir ganz klar am meisten geholfen hat, waren die schon geposteten Tutorials. Ansonten habe ich Bücher eigentlich nur als weitere Nachschlagewerke genutzt, nachdem die Grundlagen saßen.
Ich kann dir nur empfehlen, mal bei Terrashop vorbeizuschauen. Da findest oft Bücher ziemlich günstig. Und gleich noch ein Tipp: Du brauchst nicht immer die Bücher zur aktuellen Delphiversion. Gerade als Anfänger zahlste lieber mal 40 EUR weniger und kaufst dir ein Buch für 5 - 20 EUR.

Gruß
Ansgar

user47511 22. Jul 2008 12:14

Re: Chat mit TURBO DELPHI
 
Ich hab mal eben schnell drüber geschaut
und ein Buch was mir sofort gefallen hat ist:
Jetzt lerne ich Delphi!
Ich weiss nur nicht ob das jetzt wirklich was bringt oder nicht! Ich guck mal eben bei Ciao!
nach


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz