![]() |
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:
Also damit ihr das noch besser versteht, hier die source:
Server:
Nachricht.More(Listbox1.Items); //More ist TStrings Client: Listbox1.Clear; Listbox1.Items.AddItems(Nachricht.More); //Natürlich noch die nachricht davor empafangen ![]() Ich versteh einfach nicht warum das nicht funktioniert. Danke im voraus!! |
Re: kann bei OnConnect keine TStrings liste übergeben
Ist .More jetzt eine Eigenschaft oder Methode?
|
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; |
Re: kann bei OnConnect keine TStrings liste übergeben
Delphi-Quellcode:
Nachricht.More.Assign(Listbox1.Items);
|
Re: kann bei OnConnect keine TStrings liste übergeben
Danke :-D
doch jetzt kommt eine Address Violation beim Server. |
Re: kann bei OnConnect keine TStrings liste übergeben
Und andersherum?
|
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?
|
Re: kann bei OnConnect keine TStrings liste übergeben
Nein, und ich weis auch nicht was das heist.
Bitte um erklärung |
Re: kann bei OnConnect keine TStrings liste übergeben
Damit meine ich, dass Du bei TStrings erstmal irgendwo ein Create aufrufen musst.
|
Re: kann bei OnConnect keine TStrings liste übergeben
Ich hab das:
Delphi-Quellcode:
und das:
Nachricht.Nickname := 'Hello';
Nachricht.More.Create; Nachricht.More.Assign(Listbox1.Items); Socket.SendBuf (Nachricht, SizeOf(Nachricht));
Delphi-Quellcode:
Jetzt kommen immernoch erors. Nur ich glaub das liegt daran das ich es beim Client auch noch Createn muss.
Nachricht.Nickname := 'Hello';
Nachricht.More.Create. Assign(Listbox1.Items); Socket.SendBuf (Nachricht, SizeOf(Nachricht)); Aber ich weis nicht wie ich das machen muss. Ich habs jetzt mal so versucht:
Delphi-Quellcode:
Idee?
Nachricht.More.Create;
Socket.ReceiveBuf (Nachricht, SizeOf(Nachricht)); if Nachricht.Nickname = 'Hello' then begin Listbox1.Clear; Listbox1.Items.AddStrings(Nachricht.More); |
Re: kann bei OnConnect keine TStrings liste übergeben
Delphi-Quellcode:
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.
Nachricht.Nickname := 'Hello';
Nachricht.More := TStringList.Create; try Nachricht.More.Assign(Listbox1.Items); Socket.SendBuf (Nachricht, SizeOf(Nachricht)); finally Nachricht.More.Free; end; |
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. |
Re: kann bei OnConnect keine TStrings liste übergeben
Das hatte ich befürchtet. Du wirst wohl nur den Objektzeiger übergeben.
|
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:
das geht auch nicht:
Listbox1.Items.AddStrings(Nachricht.More);
Delphi-Quellcode:
obwohl ich oben before
Listbox1.Items.Assigns(Nachricht.More);
Delphi-Quellcode:
das gemacht hab
Socket.ReceiveBuf (Nachricht, SizeOf(Nachricht));
Delphi-Quellcode:
Nachricht.More := TStringList.Create;
|
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. |
Re: kann bei OnConnect keine TStrings liste übergeben
Ohh ya :) Vielen dank!
Also zum senden verwende ich jetzt
Delphi-Quellcode:
und zum empfangen
Nachricht.Nickname := 'Hello';
Nachricht.Text := Listbox1.Items.Text; Socket.SendBuf (Nachricht, SizeOf(Nachricht));
Delphi-Quellcode:
Doch im client empfang ich alle namen in einer reihe wie kann ich das ändern?
if Nachricht.Nickname = 'Hello' then begin
Listbox1.Clear; Listbox1.AddItem(Nachricht.Text, NIL); Oder mach ich das alles überhaupt richtig? EDIT: In einem Memo wurde es die zeilenumbrüche mitnehmen, aber nicht in einer Listbox. |
Re: kann bei OnConnect keine TStrings liste übergeben
Gibt es wirklich keinen weg das als TStrings lsit zu senden?
|
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. |
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? |
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:
auf der Gegenseite dann genau so wieder empfangen.
var
lText: String; begin lText := ListBox1.Items.Text; Socket.SendText(lText, Length(lText)); 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. |
Re: kann bei OnConnect keine TStrings liste übergeben
Zitat:
Delphi-Quellcode:
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.
Nachricht.Nickname := 'Hello';
Nachricht.Text := Listbox1.Items.Text; Socket.SendBuf (Nachricht, SizeOf(Nachricht)); |
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. |
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:
benutzen
ListBox.Items.Add(dein_string)
aber um eine ganze liste hinzuzufügen wiederum
Delphi-Quellcode:
ich hoffe ich konnte helfen
ListBox.Items := deine_StringList
tschö michagolf4 |
Re: kann bei OnConnect keine TStrings liste übergeben
Zitat:
Delphi-Quellcode:
ListBox1.Items.Text := Nachricht.Text;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 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 by Thomas Breitkreuz