Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Alternative für String Assign (https://www.delphipraxis.net/192152-alternative-fuer-string-assign.html)

Neutral General 23. Mär 2017 11:24

AW: Alternative für String Assign
 
Man nimmt einen Pointer mit GetMem oder ggf. auch ein Byte Array.

Uwe Raabe 23. Mär 2017 11:27

AW: Alternative für String Assign
 
Zitat:

Zitat von EWeiss (Beitrag 1365248)
Dann nehme ich nen PWideChar.. oder besser PWideString?

Auf keinen Fall! Wenn du eine Reihe von Bytes lesen willst, dann nimm TBytes - dafür ist das da.

Delphi-Quellcode:
function TAnimatePng.FGet(hFile: THandle; var sBuffer: TBytes): LongInt; // <===
var
  ByttesReaded: DWORD;
  LenBuf: DWORD;
begin

  Result := 0;
  if hFile <> 0 then
  begin
    ByttesReaded := 0;
    LenBuf := Length(sBuffer);
    if LenBuf <> 0 then
    begin
      if ReadFile(hFile, sBuffer[0], LenBuf, ByttesReaded, 0) = false then  // <===
        Result := GetLastError();
    end;
  end;
end;

EWeiss 23. Mär 2017 11:32

AW: Alternative für String Assign
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1365250)
Zitat:

Zitat von EWeiss (Beitrag 1365248)
Dann nehme ich nen PWideChar.. oder besser PWideString?

Auf keinen Fall! Wenn du eine Reihe von Bytes lesen willst, dann nimm TBytes - dafür ist das da.

Delphi-Quellcode:
function TAnimatePng.FGet(hFile: THandle; var sBuffer: TBytes): LongInt; // <===
var
  ByttesReaded: DWORD;
  LenBuf: DWORD;
begin

  Result := 0;
  if hFile <> 0 then
  begin
    ByttesReaded := 0;
    LenBuf := Length(sBuffer);
    if LenBuf <> 0 then
    begin
      if ReadFile(hFile, sBuffer[0], LenBuf, ByttesReaded, 0) = false then  // <===
        Result := GetLastError();
    end;
  end;
end;

Wie bleibt das denn mit dem setzen des Buffer SetLength bei TBytes?
Belassen?

ok sollte gehn ist ja ein Array

gruss

Uwe Raabe 23. Mär 2017 11:34

AW: Alternative für String Assign
 
Zitat:

Zitat von EWeiss (Beitrag 1365252)
Wie bleibt das denn mit dem setzen des Buffer SetLength bei TBytes?
Belassen?

Ja, denn dann bekommst du auch wirklich einen Buffer mit N Bytes. Bei einem String wären das nämlich doppelt so viele.

Delphi-Quellcode:
var
  s: string;
  b: TBytes;
begin
  SetLength(s, 10); // 20 Bytes
  SetLength(b, 10); // 10 Bytes;

EWeiss 23. Mär 2017 11:35

AW: Alternative für String Assign
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1365253)
Zitat:

Zitat von EWeiss (Beitrag 1365252)
Wie bleibt das denn mit dem setzen des Buffer SetLength bei TBytes?
Belassen?

Ja, denn dann bekommst du auch wirklich einen Buffer mit N Bytes. Bei einem String wären das nämlich doppelt so viele.

Delphi-Quellcode:
var
  s: string;
  b: TBytes;
begin
  SetLength(s, 10); // 20 Bytes
  SetLength(b, 10); // 10 Bytes;

Danke Uwe hoffe das bringt mich weiter :)

gruss

EWeiss 23. Mär 2017 11:40

AW: Alternative für String Assign
 
yep jetzt klappt das gut mit MoveMemory war gar nichts vorher.

Delphi-Quellcode:
MoveMemory(pGlobalBuffer, @sBuffer[0], BufferSize);


gruss

EWeiss 23. Mär 2017 12:45

AW: Alternative für String Assign
 
Ich hoffe mal das mir das keine neuen Probleme einhandelt.
Eigentlich wollte ich mit SetFilePointerEx und LARGE_INTEGER arbeiten aber das Delphi
verbietet mir das weil diese Funktion nicht existiert.

Jetzt musste ich deshalb auf LongInt ausweichen.
Ob das später Problem bereitet ?

Das wollte ich versuchen
Delphi-Quellcode:
var
  li: LARGE_INTEGER;
begin

  li.LowPart := PosByte;
muss aber nun darauf zurückgreifen.

Delphi-Quellcode:
var
  li: LongInt;
begin

  li := PosByte;
gruss

Neutral General 23. Mär 2017 13:20

AW: Alternative für String Assign
 
Du kannst die LARGE_INTEGER ja selbst definieren.
Es macht halt Probleme wenn irgendeine API einen 64-Bit-Wert erwartet und nur 32-Bit ankommen.
Ansonsten sollte es keine Probleme machen solange du keine PNGs lädst die > 4GB sind.

Gibt es einen Grund für SetFilePointer etc?
Du könntest einfach nen TFileStream benutzen. Ist ein ganzes Stück angenehmer als direkt die API Funktionen zu benutzen.

Uwe Raabe 23. Mär 2017 13:22

AW: Alternative für String Assign
 
Delphi-Quellcode:
LARGE_INTEGER
ist ein Record. Versuch doch
Delphi-Quellcode:
TLargeInteger
, das entspriche
Delphi-Quellcode:
Int64
.

Uwe Raabe 23. Mär 2017 13:23

AW: Alternative für String Assign
 
Zitat:

Zitat von Neutral General (Beitrag 1365273)
Du kannst die LARGE_INTEGER ja selbst definieren.

Ist gar nicht nötig (aus Winapi.Windows):

Delphi-Quellcode:
  PLargeInteger = ^TLargeInteger;
  _LARGE_INTEGER = record
    case Integer of
    0: (
      LowPart: DWORD;
      HighPart: Longint);
    1: (
      QuadPart: LONGLONG);
  end;
  {$EXTERNALSYM _LARGE_INTEGER}
  {$NODEFINE TLargeInteger}
  TLargeInteger = Int64;
  LARGE_INTEGER = _LARGE_INTEGER;
  {$EXTERNALSYM LARGE_INTEGER}


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:22 Uhr.
Seite 2 von 4     12 34      

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