AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Fehler E2250 Es gibt keine überladene Version von GetString ...
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler E2250 Es gibt keine überladene Version von GetString ...

Ein Thema von pici · begonnen am 6. Feb 2024 · letzter Beitrag vom 6. Feb 2024
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#1

AW: Fehler E2250 Es gibt keine überladene Version von GetString ...

  Alt 6. Feb 2024, 11:30
Wie aus der Deklaration ersichtlich, erwartet GetString ein TBytes, also ein dynamisches Byte-Array. Dagegen ist TReadBuffer ein statisches Byte-Array.

Dein Code lässt sich auf folgendes reduzieren:
Delphi-Quellcode:
function TCustomWSocket.SocketRead(Socket: TSocket; Flag: integer): string;
var
  Received: longint;
  i: integer;
  bytes: TBytes;
begin
  Result:= '';
  Received:=0;

  if Received = SOCKET_ERROR then
    begin
      if WSAGetLastError <> WSAEWOULDBLOCK then
        SocketError(WSAGetLastError);
    end
  else
    if Received>0 then begin //05.11.10: Fix bei .SocketRead: bei Länge 0 gab es RangeError beim Zugriff auf Result[1]
      SetLength(bytes, Received);
      for i := 1 to Received do
        bytes[i-1] := FReadBuffer[i];
      Result := TEncoding.Default.GetString(bytes);
    end;
end;
Ich gehe mal davon aus, dass der eigentliche Receive-Code, der Received und FReadBuffer setzt, bewusst entfernt wurde.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
pici

Registriert seit: 6. Feb 2024
2 Beiträge
 
#2

AW: Fehler E2250 Es gibt keine überladene Version von GetString ...

  Alt 6. Feb 2024, 12:14
Hallo Uwe,

vielen Dank für Deine schnelle und kompetente Antwort. Mit Deiner Version lässt es sich einwandfrei kompilieren ... zum Testen der Funktion muss ich noch einen Aufbau der Umgebung machen.

Die anderen Funktionen habe ich nicht absichtlich entfernt, ich wollte den Beitrag nur nicht durch ellenlangen Code überladen.

Hier wird FReadBuffer meiner Meinung nach beschrieben:

Code:
RC:= recv(Socket, FReadBuffer, SizeOf(TReadBuffer), 0);
... oder hier passiert auch was damit:

Code:
function TCustomWSocket.SocketReadV2(Socket: TSocket; Flag: integer): String;
var
  Received, tRecvcount: longint;
  i: integer;
  tmpStr : String;
  tmpFReadBuffer: TReadBuffer;
begin
  Result:= '';
  tRecvcount:=0;
  Received:=0;
  //Received:= recv(Socket, FReadBuffer, SizeOf(TReadBuffer), Flag);
  repeat
  begin
    tRecvcount := recv(Socket, tmpFReadBuffer, SizeOf(TReadBuffer), Flag);

    for i := 1 to tRecvcount do
        FReadBuffer[Received + i] := tmpFReadBuffer[i];

    Received := tRecvcount +   Received;
  end;
  until (tRecvcount <> SOCKET_ERROR);

  if Received = SOCKET_ERROR then
    begin
      if WSAGetLastError <> WSAEWOULDBLOCK then
        SocketError(WSAGetLastError);
    end
  else
    if Received>0 then begin //05.11.10: Fix bei .SocketRead: bei Länge 0 gab es RangeError beim Zugriff auf Result[1]
      SetLength(Result, Received);
      //Result := TEncoding.Default.GetString(FReadBuffer);

      tmpStr := StringOfChar('-', Length(FReadBuffer));
      for i := 1 to Received do
        tmpStr[i] := Char(FReadBuffer[i]);

      //for i := 1 to $ff do
      //     testBuf[i] := i;
      //for i := i to $ff do
      //     testStr[i] := Char(testBuf[i]);

      Result := tmpStr;

      SetLength(Result, Received);
      //Move(FReadBuffer, &Result[1], Received);
    end;
end;

Welchen Sinn macht es denn, das Array als statisches Array zu definieren? Würde das nicht auch funktionieren, wenn es ein dynamisches Array wäre? Nur um den Gedanken des Programmierers zu verstehen ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.553 Beiträge
 
Delphi 12 Athens
 
#3

AW: Fehler E2250 Es gibt keine überladene Version von GetString ...

  Alt 6. Feb 2024, 17:26
Der Parameter als "OpenArray", also function GetString(const Bytes: array of Byte): string; würde alle Arten von Byte-Arrays entgegennehmen, seien es dynamische Arrays, unterschiedlich große statische Arrays oder gar eine direkte Konstante/Variable ala [1, 2, 3, 4, 5, EineByteVariable, OderEineKonstante, 6, 7, 8] .

TBytes, so wie es früher mal deklariert war, und wie es im INDY auch immernoch Eines gibt, ala TBytes = array of byte; nimmt nur genau diesen Typen entgegen.
Aber TBytes = TArray<Byte>; dagegen nimmt alles an, was irgendwie von TArray<Byte> abgeleitet ist. (generische Deklaration verhalten sich da anders, als "normale" Deklarationen)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 6. Feb 2024 um 17:28 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:57 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