Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Problem beim Senden mit SendBuf (TFont, TColor) (https://www.delphipraxis.net/114794-problem-beim-senden-mit-sendbuf-tfont-tcolor.html)

faeX 31. Mai 2008 17:28


Problem beim Senden mit SendBuf (TFont, TColor)
 
Delphi-Quellcode:

TBefehl = record
  TagFont   : TFont;
  TagString : String;
  TagColor  : TColor;
  TagInteger : Integer
end;
Delphi-Quellcode:
procedure senden;
var
  Befehl : TBefehl;
begin
  Befehl.TagFont := Form1.font;
  Befehl.TagString := '';
  Befehl.TagColor := clBlack;
  Befehl.TagInteger := 0;
  Form1.Client.Socket.SendBuf(Befehl,sizeOf(Befehl));
end;
Dann kommt eine Fehlermeldung.
Wie kann ich dieses Problem lösen?

Fussball-Robby 31. Mai 2008 17:30

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Welche Fehlermeldung kommt und wo tritt sie auf (Beim Senden oder vorher)?

faeX 31. Mai 2008 17:30

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Delphi-Quellcode:
type
TBefehl = record
  TagFont   : TFont;
  TagString : String;
  TagColor  : TColor;
  TagInteger : Integer
end;
Das ist der richtige Quellcode.

faeX 31. Mai 2008 17:31

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Beim Senden.

faeX 31. Mai 2008 17:31

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Fehler beim Schreiben von Addresse 0000004 oder so ähnlich...

faeX 31. Mai 2008 17:35

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Mist, schon wieder ein Fehler... Der String ist auf 255 Zeiten begrenzt.

Delphi-Quellcode:
TagString : String[255];

marabu 31. Mai 2008 17:41

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Hi,

hinter TFont und string verbergen sich eigentlich Zeiger. Legst du sie in einem Record ab und verschiffst sie, dann geht die Bedeutung dieser Zeiger verloren. Im schlimmsten Fall kommt es zu den von dir beobachteten Fehlern.

Grüße vom marabu

faeX 31. Mai 2008 17:43

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Wie kann ich dieses Problem den umgehen? Und was sind Zeiger? (Cursor sind wohl kaum gemeint)

MSSSSM 31. Mai 2008 17:49

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
zeiger sind sowas wie ein integer wert, der anzeigt wo im speicher z.b. der string liegt.


zum anderen...

Delphi-Quellcode:
  TColor = -$7FFFFFFF-1..$7FFFFFFF;

heisst, tColor=integerwert (?)

mfg


edit:
mit TColor(Wert) kannst du sie wieder zum TColor machen

und andersrum... TypeCast?

marabu 31. Mai 2008 17:52

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Zeiger heißen auch Pointer. TFont ist eine Klasse und string ist ein spezieller Delphi Datentyp. Es sind diese beiden Eigenschaften, die eine direkte Übertragung zu einem Empfänger unmöglich machen.

Um einen unbegrenzt langen string zu übertragen, benötigst du ein Protokoll - z.B. kannst du zuerst die Anzahl der Zeichen avisieren und anschließend die Zeichen des Strings übermitteln. Das funktioniert mit kurzen und langen Strings gleichermaßen gut.

Beim Font solltest du besser den Namen und die Schriftgröße verschicken, das sind Zeichen und Zahlen, da gibt es kaum Probleme.

rollstuhlfahrer 31. Mai 2008 17:59

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
HI,

ich würd dir empfehlen, alles in einen Stream zu schreiben und diesen dann zu verschicken. Hierbei treten auch keine Probleme mit zu langen Strings auf, vorrausgesetzt, du hast ein Trennungszeichen (z.B. #) was in den Strings etc. nicht vorkommen darf.

Strings speicherst du am einfachsten mit Stream.Write(Str[1], Length(Str)). Die 1 ist wichtig, da alles in einem Stream in einem Pointer abgelegt wird. Schreibst du den String direkt mit Stream.Write(Str, Length(Str)), wird was ganz komisches geschrieben, aber nicht der String.

Streams werden mit SendStream verschifft.

Bernhard

faeX 31. Mai 2008 18:04

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Liste der Anhänge anzeigen (Anzahl: 1)
:?: :?: :?:

Okay, damit bin ich etwas überfordert...
Ich habe einen Chat programmiert, wo alles Super funktioniert hat...

MSSSSM 31. Mai 2008 18:08

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
http://www.delphipraxis.net/download.php?id=33542


habe auch mal einen kleinen chat gescrieben...


[OT]bist ja nur 2 Jahre älter als ich...[/OT]


klar mit streams gehts imho besser..., aber das sollte man erst einsetzen wenn man es verstanden *g*

mhm

@rollstuhlfahrer
meinst du das man einfach den str in einem stream ablegt und den also z.b. Irgendwas: TStream

macht?


mfg

faeX 31. Mai 2008 18:09

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Was sind Pointer, wie programmiert man diesen Stream, wie setzt man Trennungszeichen, wie senden man Streams?

faeX 31. Mai 2008 18:09

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Mir fällt grade auf, dass die meisten kaum älter, gar jünger sind als ich...

faeX 31. Mai 2008 18:11

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Bei deinem Chat schlägt mein Scanner Alarm, obwohl ich nicht glaube, dass er berechtigt ist...

MSSSSM 31. Mai 2008 18:14

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
beim server?

ist normal...

mfg

Fussball-Robby 31. Mai 2008 18:14

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
@faeX: Könntest du bitte in Zukunft deine Beiträge editieren (Edit-Button rechts über deinem Beitag) und nicht mehrere Beiträge unmittelbar nacheinander schreiben? Das nennt man "pushen" und ist hier nicht gern gesehen :wink:

faeX 31. Mai 2008 18:17

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
@Fussball-Robby: Danke für den Tipp, bin noch nicht lange dabei...

und wie programmiere ich diese Streams nun?

nunja meine Mutter möchte dass ich essen komme, werde mir eure antworten später durchlesen

rollstuhlfahrer 31. Mai 2008 19:33

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Streams gehen ganz einfach. In der Unit Classes sind Delphi-Referenz durchsuchenTStream, Delphi-Referenz durchsuchenTMemoryStream, Delphi-Referenz durchsuchenTFileStream und Delphi-Referenz durchsuchenTStringStream. Für die Verwendung guck bitte in die Delphi-Hilfe (Stichwort: Stream(s)).

Streams gehen so:
Delphi-Quellcode:
var Stream: TMemoryStream // mein Liebling unter den Streams
begin
Stream := TMemoryStream.Create; // Erstellen
Stream.Write(Edit1.Text[1], Length(Edit1.Text)); // Reinschreiben
Stream.Position := 0; // Auf den Anfang setzen
Form1.Client.Socket.SendStream(Stream); // Verschicken
// Ein .Free ist hier nicht notwendig, da das die Prozedur SendStream übernimmt
end;
Pointer sind Zeiger auf bestimmte Speichertypen. Übergibst du einer Funktion/Prozedur ein Objekt, so wird nur der Zeiger übergeben (nicht da Objekt seblst). Greifst du dann darauf zu, änderst du in allen Variablen dieses Objektes, das du übergeben hast, die Eigenschaft. (Hier ist jetzt aber nicht gemeint, dass man von jeder Klasse nur 1 Instanz erzeugen kann. Es wird eben das von der aktuellen Instanz geändert.)
Zitat:

Zitat von faeX
Mist, schon wieder ein Fehler... Der String ist auf 255 Zeiten begrenzt.

Delphi-Quellcode:
TagString : String[255];

Für längere Strings verwende WideString

Zitat:

Zitat von faeX
Bei deinem Chat schlägt mein Scanner Alarm, obwohl ich nicht glaube, dass er berechtigt ist...

Zitat:

Zitat von MSSSSM
beim server?

ist normal...

mfg

Seh ich anders. Ein Programm sollte ganz ohne Virenwarnung laufen (und erst recht dann, wenn es selbstgeschrieben ist).
Prüfe mal deine EXE z.b. bei Virustotal und kontaktiere mal den Virenscanner-Hersteller, was der dazu sagt. Bei mir traten auch mal Viren auf, wenn ich direkt auf WinSockets zugegriffen hatte.

Bernhard

faeX 1. Jun 2008 11:55

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Okay das klappt schon ganz gut, aber wie empfange ich das ganze jetzt wieder?
Soetwas wie Client.Socket.ReceiveStream kennt er nicht.

rollstuhlfahrer 1. Jun 2008 12:36

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Zitat:

Zitat von faeX
Okay das klappt schon ganz gut, aber wie empfange ich das ganze jetzt wieder?
Soetwas wie Client.Socket.ReceiveStream kennt er nicht.

Ich denke mal, du wirst die maximale Paketgröße bei jedem Senden überschreiten. Desshalb: Nutze die Indy-Secer/Client-Komponenten. Die kennen ein ReadStream.

Ansonsten musst du irgendwie (weiß ich grad selbst nicht genau) mit ReciveBuf und ReciveLength arbeiten. Kann ich aber nicht mehr so genau nachvollziehen, da bei mir die SocketKomponenten grad net so laufen, wie sie sollen (Antwort kommt nicht an).

Bernhard

EDIT: maximale Paketgröße: 4096 Byte (=4KB)
ClientRead/Write wird mehrmals aufgerufen

faeX 1. Jun 2008 12:48

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Ach du Schande, 4KB reichen nimmer.
Sollte ich da nicht auf TFileStream umsteigen?

EDIT: Oder der Stream, der bei den Messagern (ICQ, Skype etc.) verwendet wird.

rollstuhlfahrer 1. Jun 2008 16:38

Re: Problem beim Senden mit SendBuf (TFont, TColor)
 
Zitat:

Zitat von faeX
Ach du Schande, 4KB reichen nimmer.
Sollte ich da nicht auf TFileStream umsteigen?

EDIT: Oder der Stream, der bei den Messagern (ICQ, Skype etc.) verwendet wird.

FileStream ist auch nur ein Stream und die 4KB Paketgröße bleiben bestehen. Die Paketgröße ist nicht abhöngig von den verwendeten Paketen, nein, sie ist eine Konstante, die du nicht verändern kannst. Ich hatte schon geraten auf Indy-TCPServer und IndyTCP-Client umzusteinen, da diese programierfreundlicher sind.

rollstuhlfahrer


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