Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi kann bei OnConnect keine TStrings liste übergeben (https://www.delphipraxis.net/104993-kann-bei-onconnect-keine-tstrings-liste-uebergeben.html)

k4ni 13. Dez 2007 20:47


kann bei OnConnect keine TStrings liste übergeben
 
Hey leute,

Ich bin gerade dabei einen chat zu machen.
Und das mache ich mit ServerSocket und ClientSocket, und was klar ist wenn der Client connected braucht er eine liste mit den leuten die schon im chat sind. Und diese liste gibt es auf dem Server.

Also übergeb ich die list von einer ListBox in TStrings. Also ungefähr so:
Delphi-Quellcode:
Server:
Nachricht.More(Listbox1.Items); //More ist TStrings

Client:
Listbox1.Clear;
Listbox1.Items.AddItems(Nachricht.More); //Natürlich noch die nachricht davor empafangen
Also damit ihr das noch besser versteht, hier die source: Download

Ich versteh einfach nicht warum das nicht funktioniert.

Danke im voraus!!

mkinzler 13. Dez 2007 21:04

Re: kann bei OnConnect keine TStrings liste übergeben
 
Ist .More jetzt eine Eigenschaft oder Methode?

k4ni 13. Dez 2007 21:06

Re: kann bei OnConnect keine TStrings liste übergeben
 
Delphi-Quellcode:
type TChatNachricht = Record
        Nickname: string[255];
        Text:    string[255];
        Text2:   string[255];
        More:    TStrings
      end;

mkinzler 13. Dez 2007 21:07

Re: kann bei OnConnect keine TStrings liste übergeben
 
Delphi-Quellcode:
Nachricht.More.Assign(Listbox1.Items);

k4ni 13. Dez 2007 21:17

Re: kann bei OnConnect keine TStrings liste übergeben
 
Danke :-D
doch jetzt kommt eine Address Violation beim Server.

mkinzler 13. Dez 2007 21:18

Re: kann bei OnConnect keine TStrings liste übergeben
 
Und andersherum?

DeddyH 13. Dez 2007 21:19

Re: kann bei OnConnect keine TStrings liste übergeben
 
Da es sich um ein Objekt handelt, musst Du es zunächst erst instanziieren. Hast Du daran gedacht?

k4ni 13. Dez 2007 21:28

Re: kann bei OnConnect keine TStrings liste übergeben
 
Nein, und ich weis auch nicht was das heist.
Bitte um erklärung

DeddyH 13. Dez 2007 21:31

Re: kann bei OnConnect keine TStrings liste übergeben
 
Damit meine ich, dass Du bei TStrings erstmal irgendwo ein Create aufrufen musst.

k4ni 13. Dez 2007 21:51

Re: kann bei OnConnect keine TStrings liste übergeben
 
Ich hab das:
Delphi-Quellcode:
  Nachricht.Nickname := 'Hello';
  Nachricht.More.Create;
  Nachricht.More.Assign(Listbox1.Items);
  Socket.SendBuf (Nachricht, SizeOf(Nachricht));
und das:

Delphi-Quellcode:
  Nachricht.Nickname := 'Hello';
  Nachricht.More.Create. Assign(Listbox1.Items);
  Socket.SendBuf (Nachricht, SizeOf(Nachricht));
Jetzt kommen immernoch erors. Nur ich glaub das liegt daran das ich es beim Client auch noch Createn muss.

Aber ich weis nicht wie ich das machen muss. Ich habs jetzt mal so versucht:

Delphi-Quellcode:
Nachricht.More.Create;
  Socket.ReceiveBuf (Nachricht, SizeOf(Nachricht));

if Nachricht.Nickname = 'Hello' then begin
Listbox1.Clear;
Listbox1.Items.AddStrings(Nachricht.More);
Idee?

DeddyH 13. Dez 2007 21:57

Re: kann bei OnConnect keine TStrings liste übergeben
 
Delphi-Quellcode:
Nachricht.Nickname := 'Hello';
Nachricht.More := TStringList.Create;
try
  Nachricht.More.Assign(Listbox1.Items);
  Socket.SendBuf (Nachricht, SizeOf(Nachricht));
finally
  Nachricht.More.Free;
end;
Mal so versucht? Wobei ich jetzt nicht ganz sicher bin, ob nicht nur der Zeiger auf das Objekt übertragen wird. In dem Fall muss man sich etwas anderes überlegen.

k4ni 13. Dez 2007 22:03

Re: kann bei OnConnect keine TStrings liste übergeben
 
Danke, geht aber auch nicht :(

Normale strings zu senden und zu empfangen geht ganz einfach, aber das ist nicht so leicht.

DeddyH 13. Dez 2007 22:04

Re: kann bei OnConnect keine TStrings liste übergeben
 
Das hatte ich befürchtet. Du wirst wohl nur den Objektzeiger übergeben.

k4ni 13. Dez 2007 22:15

Re: kann bei OnConnect keine TStrings liste übergeben
 
Also ich hab das vorher falsch eingefügt sorry.

Jetzt geht es schon weiter und die adress violation kommt jetzt später wenn es das macht:
Delphi-Quellcode:
Listbox1.Items.AddStrings(Nachricht.More);
das geht auch nicht:
Delphi-Quellcode:
Listbox1.Items.Assigns(Nachricht.More);
obwohl ich oben before
Delphi-Quellcode:
  Socket.ReceiveBuf (Nachricht, SizeOf(Nachricht));
das gemacht hab
Delphi-Quellcode:
Nachricht.More := TStringList.Create;

Muetze1 13. Dez 2007 22:50

Re: kann bei OnConnect keine TStrings liste übergeben
 
In der Nachricht ist More eine Klassenreference. Dies ist nur die Adresse, wo die Klasse liegt aber nichtmal ansatzweise die Adresse wo die Strings liegen. Du versendest einfach nur die Adresse, wo in der Application vom Server die Klasseninstanz liegt. Das bringt dir rein gar nichts, weil ob beim Client eine gültige Instanz an der Stelle liegt ist mehr als fraglich (sirius letzte Aussage: 1 zu 4 Milliarden) und zum anderen würde die Instanz immernoch keine Strings haben - weil die gar nicht übertragen werden.

Versende die Userliste aus dem TStrings Objekt als String. Nutze dazu die Eigenschaft Text um es in die Nachricht als String abzulegen und weise es nach dem Empfang wieder der Text Eigenschaft zu, um wieder eine Liste zu erhalten.

k4ni 13. Dez 2007 23:18

Re: kann bei OnConnect keine TStrings liste übergeben
 
Ohh ya :) Vielen dank!

Also zum senden verwende ich jetzt
Delphi-Quellcode:
Nachricht.Nickname := 'Hello';
Nachricht.Text := Listbox1.Items.Text;
Socket.SendBuf (Nachricht, SizeOf(Nachricht));
und zum empfangen

Delphi-Quellcode:
if Nachricht.Nickname = 'Hello' then begin
Listbox1.Clear;
Listbox1.AddItem(Nachricht.Text, NIL);
Doch im client empfang ich alle namen in einer reihe wie kann ich das ändern?
Oder mach ich das alles überhaupt richtig?

EDIT: In einem Memo wurde es die zeilenumbrüche mitnehmen, aber nicht in einer Listbox.

k4ni 13. Dez 2007 23:46

Re: kann bei OnConnect keine TStrings liste übergeben
 
Gibt es wirklich keinen weg das als TStrings lsit zu senden?

Muetze1 14. Dez 2007 00:16

Re: kann bei OnConnect keine TStrings liste übergeben
 
1. Pushen ist erst nach 24 Stunden erlaubt, also lass uns doch erstmal Zeit, deine Beiträge zu lesen. Wir werden hier schliesslich nicht bezahlt für die Arbeit!

2. Du hast es nicht so umgesetzt, wie ich es geschrieben habe. Senden schon, aber beim empfangen weist du es nicht der Text Property zu.

k4ni 14. Dez 2007 00:47

Re: kann bei OnConnect keine TStrings liste übergeben
 
Oh, Sorry!
Ich mach daran jetzt schon lange herum.
Kannst du mir bitte sagen wie es geht?

SirThornberry 14. Dez 2007 06:55

Re: kann bei OnConnect keine TStrings liste übergeben
 
auch beim senden macht er es noch falsch. Er sendet weiterhin die Objectreferenz "Nachricht" und nicht den Text "Nachricht.Text".
Delphi-Quellcode:
var
  lText: String;
begin
  lText := ListBox1.Items.Text;
  Socket.SendText(lText, Length(lText));
auf der Gegenseite dann genau so wieder empfangen.

Allerdings machst du seit her wohl einen großen Fehler. Du sendest die Daten ohne irgend ein bestimmtes Format. Das heißt wenn 2 Nachrichten kurz hintereinander gesendet werden kann es schnell mal passieren das diese als eine große Nachricht ankommen. Du müsstest dir also noch ein protokoll oder eine maskierung überlegen.

Muetze1 14. Dez 2007 10:36

Re: kann bei OnConnect keine TStrings liste übergeben
 
Zitat:

Zitat von SirThornberry
auch beim senden macht er es noch falsch. Er sendet weiterhin die Objectreferenz "Nachricht" und nicht den Text "Nachricht.Text".

Wie schließt du darauf? Er benutzt nun beim Senden folgenden Code:
Delphi-Quellcode:
Nachricht.Nickname := 'Hello';
Nachricht.Text := Listbox1.Items.Text;
Socket.SendBuf (Nachricht, SizeOf(Nachricht));
Wenn Nachricht eine TStringList hätte, dann müsste unter dem Qualifizierer Nachricht erstmal der Name des TStrings Objektes folgen und dann dessen Eigenschaft Text. Das kann mit dem o.g. Code nicht sein. Einzige Möglichkeit wäre, wenn er von TStrings/TStringList abgeleitet hätte und dieser neuen Klasse eine Eigenschaft/öffentlichen Member Nickname verpaßt hätte. Davon gehe ich aber mal nicht aus. Somit scheint er es ordentlich auf einen String geändert zu haben, wie ich es geschrieben hatte.

k4ni 14. Dez 2007 10:47

Re: kann bei OnConnect keine TStrings liste übergeben
 
Also das hesit gesendet hab ich es richtig aber angenommen nicht?
Ich glaub mal schon ja weil wenn ich die empfangene nachricht in ein Memo setze dann geht es ja wunderbar, nur nicht in der ListBox da ich dort nicht weis wie ich es dort einfügen soll.

michagolf4 14. Dez 2007 11:04

Re: kann bei OnConnect keine TStrings liste übergeben
 
hallo alle zusammen,

ich denke mal wenn er die einzelnen strings in eine listbox einfügen will sollt er

Delphi-Quellcode:
  ListBox.Items.Add(dein_string)
benutzen

aber um eine ganze liste hinzuzufügen wiederum
Delphi-Quellcode:
  ListBox.Items := deine_StringList
ich hoffe ich konnte helfen

tschö michagolf4

Muetze1 14. Dez 2007 11:15

Re: kann bei OnConnect keine TStrings liste übergeben
 
Zitat:

Zitat von k4ni
Ich glaub mal schon ja weil wenn ich die empfangene nachricht in ein Memo setze dann geht es ja wunderbar, nur nicht in der ListBox da ich dort nicht weis wie ich es dort einfügen soll.

Was hatte ich denn geschrieben?
Delphi-Quellcode:
ListBox1.Items.Text := Nachricht.Text;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:32 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