![]() |
Array versendbar?
Nabend und frohes neues liebe Delphi-Praxis-Community und -Admins,
im Zuge einer Facharbeit an unserer Schule schreibe ich an einem kleinen Programm mit Delphi, welches ich dann für die Facharbeit analysiere und den Weg zum Endprodukt hin beschreibe. Mein Ziel ist, dass ich Daten erzeuge, welche ich an meinen gegenüber im Netzwerk schicke, welcher sie dann (mittels des Programms) interpretiert. Es sind etwa 8 Werte. Eingefallen sind mir 2 Wege: 1) ich speichere die Daten in einem Array und verschicke diesen an meinen gegenüber 2) ich limitere die Stellenanzahl die die Werte annehmen können, was dann in etwa aussieht wie "1,259,032,259,033" Zu 1) hab ich (leider) rein gar nix, weder in der Community hier noch bei google gefunden, genauso wie bei 2) ich keien Möglichkeit gefunde habe, vor den String mehrere Nullen zu Adden. Jemand eine anregende Idee? :) |
Re: Array versendbar?
Mahlzeit!
Delphi-Quellcode:
Ich glaube ein Array kannst du nicht einfach so verschicken. Aber keine Angst, es gibt wirklich genug Wege, die nicht besonders kompliziert sind. Du hast es im Prinzip schon selbst hingeschrieben: "1,259,032,259,033" - Das wäre ein String, und die länge der Daten musst du dabei auch nicht festlegen, wenn du zum Beispiel ein "," als Trennzeichen verwendest, mit dessen Hilfe das Gegenüber die Daten wieder auseinandernimmt. Das wäre glaube ich die einfachste Möglichkeit, und wie es sich für mich anhört, muss die Sache nicht extrem professionell sein.
1) ich speichere die Daten in einem Array und verschicke diesen an meinen gegenüber
Delphi-Quellcode:
Falls dir die Grundlagen fehlen, empfehle ich dir mal ein Tutorial zu Delphi allgemein, davon rückt Google einige raus. Das soll nicht provozieren, aber könnte glaube ich helfen. Für Socket-Geschichten sind glaube ich Komponenten bei Delphi dabei, ich persönlich bevorzuge die ICS von
Zu 1) hab ich (leider) rein gar nix, weder in der Community hier noch bei google gefunden, genauso wie bei 2) ich keien Möglichkeit gefunde habe, vor den String mehrere Nullen zu Adden.
![]() HTH :) |
Re: Array versendbar?
Zitat:
Du kannst beliebige Daten in einem Stream speichern und diesen Stream dann übertragen. Auf der anderen Seite ließt Du den Streaminhalt wieder in deine beliebigen Daten. Ich glaube, bei den Delphi-Demos ist ein Beispiel mit Sockets, be denen das gezeigt wird. Wenn nicht, würde ich die Indy-Komponenten nehmen, da diese einfacher zu handhaben sind. Dafür sind sie nicht optimal, aber das ist hier egal. Es spielt nur dann eine Rolle, wenn man sehr viele Daten gleichzeitig verschickt und empfängt (Stichwort: Asynchrone Übertragung). Weiterhin kannst du Daten auch in einen String packen, verschicken und auf der anderen Seite wieder entpacken. Hier würde ich die Formate 'XML' oder 'JSON' empfehlen. Alles Andere ist Frickelei, denn man sollte sich schon weitestgehend an Standards halten. Und XML bzw. JSON sind Standards. |
Re: Array versendbar?
:wink: *grr*.. Sage ich mal so: Ich kenne keine Klasse, die einem eine Funktion wie TClient.Send(array of string) zur Verfügung stellt :-D Naja ääh.. wie gesagt.
|
Re: Array versendbar?
öhm wenn du die IndyTco's nutzt kannst du auch den befehl WriteBuffer benutzen
und zwar so
Delphi-Quellcode:
Das ganze ist recht einfach, mit SizeOf bestimmst du die binäre größe des arrays und dann wird einfach das array binär geschikt.
Client.WriteBuffer(Array, SizeOf(Array));
Wenn du jetzt das array wieder empfangen willst benutzt du einfach
Delphi-Quellcode:
Hier ists was kniffliger, da du ja die größe von dem array nicht kennst, aber alles kein problem, denn wir wissen wie das array aussieht. und zwar sind es acht integer von 0 - 7. also 8 mal SizeOf(integer)...
type
TDasArray = array [0..7] of integer; var DestArray : TDasArray; Server.ReadBuffer(DestArray, SizeOf(TDasArray)); So nun lesen wir also diesen wert ein und zwar in die Variable DestArray, die vom tüp her unserem gesendeten array enspricht.. und fetisch sind wir ;-) |
Re: Array versendbar?
Bei dynamischen Arrays geht das so nicht. Da muss das dann heißen :
Delphi-Quellcode:
Bei mehrdimensionalen, dynamischen Arrays ist das wieder anders. Ein solches Array ist nämlich eigentlich ein Array von Pointern, die (je nach Dimension) wieder auf weitere Arrays zeigen. Erst die Arrays der letzten Dimension enthalten dann die eigentlichen Array-Elemente. Da muss man dann mithilfe von for-Schleifen das ganze auftrennen. Also bei einem array mit den Längen a und b sähe das so aus:
Client.WriteBuffer(Array[0], length(Array)*sizeof(<Array-Elementtyp>);
Delphi-Quellcode:
Client.WriteInteger(length(Array)); //Damit der Emfpänger weiß, wie viele Werte durchkommen
for I:=0 to high(Array) do Client.WriteBuffer(Array[I][0], length(Array[I])*size(<Array-Elementtyp>)); |
Re: Array versendbar?
Erstmal danke für die Hilfe! :)
Bin nun in der Lage den Array zu versenden, allerdings stehe ich nun vor einem neuen Problem: Der Array bekommt die ersten Werte zudefiniert und verschickt diese, alles wunderbar. Aber nach dem ersten Senden werden die Werte nicht überschrieben, sondern die alten Werte bleiben erhalten (sry für meien Dummheit :mrgreen: ). Wie kann ich die Array-Werte (nicht die Array-Länge) dynamisch machen? :pale: |
Re: Array versendbar?
Ein Array-Wert ist immer dynamisch.
|
Re: Array versendbar?
Zitat:
|
Re: Array versendbar?
Zitat:
Zitat:
Delphi-Quellcode:
Ändere Eintrag Nummer 2 - ist ja schliesslich immer dynamisch...
const
arr: array[0..4] of integer = ( 1, 2, 3, 4, 5 ); Und dies ohne die (standardmäßig) deaktivierte Option für änderbare Konstanten zu verändern. Sprich: auch keine Zeigerarithmetik... |
Re: Array versendbar?
Delphi-Quellcode:
Hab ja definiert dass der bei jeder Mausbewegung die Arraywerte aktualisert und gesendet werden sollen. Aber er tut es nicht. Hat jemand ne Idee oder einen rettenden Hinweis für mich?:)
type
CustomRec = record Code:Array[0..6] of Integer; end; var Brett: TBrett; PosX,PosY,PosXX,PosYY,PosXXX,PosYYY,Modus:Integer; Rec: CustomRec; implementation procedure TBrett.BrettFlaecheMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Variablen neu definieren; Aktualiseren; Senden; end; procedure TZeichenbrett.Aktualisieren; begin Rec.Code[0]:=Modus; Rec.Code[1]:=PosX; Rec.Code[2]:=PosY; Rec.Code[3]:=PosXX; Rec.Code[4]:=PosYY; Rec.Code[5]:=PosXXX; Rec.Code[6]:=PosYYY; end; procedure TZeichenBrett.Senden; begin ClientSocket1.Socket.SendBuf(Rec,sizeof(Rec)); |
Re: Array versendbar?
Ja, du aktualisiert das Array, in dem du dem Array die Inhalte der Variablen PosX, PosY, PosXX, PosYY, PosXXX und PosYYY zuweist. Aber wo bitte aktualisiert du diese Variablen? Wenn die niemals neue Werte bekommen, wieso sollten sie dann auch neue beinhalten? Die denken sich das ja nicht aus und es gibt keine Automatismen dass bestimmte Variablennamen immer automatisch bestimmte Werte bekommen.
|
Re: Array versendbar?
Delphi-Quellcode:
Sry hab den Abschnitt vercheckt zu posten.
procedure TBrett.ZeichenFlaecheMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer); begin If RbNormal.Checked=True Then Modus:=1 else If RbWürfel.Checked=True Then Modus:=2 else If RbKreis.Checked=True Then Modus:=3 else Zeichenmodus:=1; PosXX:=PosX; PosYY:=PosY; PosX:=X; PosY:=Y; Aktualisieren; Senden; end; |
Re: Array versendbar?
Ok, du hast zwei Klassen. Einmal ein TBrett und dann eine TZeichenflaeche. Dann hast du dazu globale Variablen PosX,PosY,PosXX,PosYY,PosXXX,PosYYY. Diese Variablen sind auch definitiv nirgendwo anders nochmal definiert? Also z.B. im TBrett oder in TZeichenflaeche?
Und warum nutzt du überhaupt globale Variablen? Es ist (wie du jetzt vllt. schon merkst) schwer zu durchschauen und somit auch schlecht debugbar. Vor allem wenn eine Klasse die Variablen befüllen soll und eine ganz andere die wieder auslesen soll. Schon allein, da noch alle anderen genauso diese ändern können. Was sagt dir eigentlich der Debugger? Schonmal einen Haltepunkt gesetzt wo du die Variablen zuweist und genauso auch mal dort wo du die Variablen wieder ausliest? |
Re: Array versendbar?
Jo ist bisle unübersichtlich, ich weiß. ^^
Hab den Fehler gefunden. Bei der ClientRead-Methode fehlte mir vor dem
Delphi-Quellcode:
das Socket.
ReceiveBuf(Rec,SizeOf(Rec));
/Close Plz :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:13 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