![]() |
Problem mit INDY TCP
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe ein neues Delphi projekt vor und habe versucht es LAN-fähig zu bekommen...
allerdings kommen mir immer fehler unter. Kann mir einer sagen warum diese Unit nicht funktioniert? Vll auch noch Lösungsvorschläge machen?
Delphi-Quellcode:
Thx!
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdTCPServer, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls, IdThreadMgr, IdThreadMgrDefault; type TNachricht = record Benutzer,Msg:string[100]; end; type ZClient = ^Client; Client = record Name : String[20]; Verbunden,Aktion : TDateTime; Thread : Pointer; end; type TForm1 = class(TForm) IdTCPClient1: TIdTCPClient; IdTCPServer1: TIdTCPServer; ListBox1: TListBox; Button1: TButton; Edit1: TEdit; Button2: TButton; ListBox2: TListBox; IdThreadMgrDefault1: TIdThreadMgrDefault; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure IdTCPServer1Connect(AThread: TIdPeerThread); procedure IdTCPServer1Execute(AThread: TIdPeerThread); procedure IdTCPServer1Disconnect(AThread: TIdPeerThread); procedure IdTCPClient1Connected(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end; type Leser = class(TThread) private Nachricht:TNachricht; protected procedure execute;override; end; var Form1: TForm1; Clienten : TThreadlist; implementation {$R *.dfm} procedure Leser.execute; begin while not Terminated do begin if not Form1.IdTCPClient1.Connected then Terminate else try Form1.IdTCPClient1.ReadBuffer(Nachricht,sizeof(Nachricht)); Form1.ListBox1.Items.Add(Nachricht.Benutzer+' : '+Nachricht.Msg); except end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin IDTCPServer1.Active:=True; IDTCPClient1.Connect(5000); end; procedure TForm1.Button2Click(Sender: TObject); var NeueNachricht : TNachricht; begin NeueNachricht.Benutzer:=IDTCPClient1.Localname; NeueNachricht.Msg:=Edit1.Text; IDTCPCLient1.WriteBuffer(NeueNachricht,Sizeof(NeueNachricht),True); end; procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); var NeuerClient : ZClient; begin Getmem(NeuerClient,sizeof(Client)); NeuerClient.Name:=Athread.Connection.LocalName; NeuerClient.Verbunden:=Now; NeuerClient.Aktion:=NeuerClient.Verbunden; NeuerClient.Thread:=Athread; Athread.Data:=TObject(NeuerClient); try Clienten.LockList.Add(NeuerClient); finally Clienten.UnlockList; end; ListBox2.Items.Add(timetostr(Time)+' '+(NeuerClient.Name)+' hat sich verbunden.'); end; procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var AktClient, Empfaenger:ZClient; Nachricht:TNachricht; ZielThread:TIdPeerThread; i:integer; begin If not aThread.Terminated and AThread.Connection.Connected then begin Athread.Connection.ReadBuffer(Nachricht,sizeof(Nachricht)); AktClient:= Zclient(athread.Data); AktClient.Aktion:=Now; with Clienten.LockList do try for i:=0 to count-1 do begin Empfaenger:=Items[i]; Zielthread:=Empfaenger.Thread; Zielthread.Connection.WriteBuffer(Nachricht,sizeof(Nachricht),True); end; finally clienten.UnlockList; end; end; end; procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread); var aktClient: ZClient; begin AktClient:=ZClient(AThread.Data); try Clienten.LockList.Remove(AktClient); finally Clienten.UnlockList; end; FreeMem(aktClient); Athread.Data:=nil; end; procedure TForm1.IdTCPClient1Connected(Sender: TObject); begin Leser.Create(True); Button2.Enabled:=True; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin IDTCPClient1.Disconnect; end; end. Anbei das ganze Projekt. MfG Abraxas |
Re: Problem mit INDY TCP
Hallo!
Habe nur grob drüber gekuckt:
Delphi-Quellcode:
Das ist schon mal nicht so gut. Du erstellst eine Instanz einer Klasse (deren Name übrigens immer mit "T" beginnen sollte), ohne dir dann die Objektreferenz der Instanz in einer Variable festzuhalten. Wie willst du den Thread jemals starten, wenn du jegliche Referenz dazu verloren hast?
Leser.Create(True);
Wo wird die Instanz der Variablen "Clienten" erstellt? Da habe ich nichts dergleichen gesehen. Desweiteren solltest du Client und Server in einer separaten Anwendung halten. Cu, Udontknow |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz