Delphi-PRAXiS

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)

EWeiss 23. Mär 2017 08:53

Alternative für String Assign
 
Obwohl möglich funktioniert das so nicht.

Delphi-Quellcode:
var
  BufferSize: dword;
  sBuffer: string;
//....
sBuffer.assign(BufferSize, 0);
Zitat:

[DCC Fehler] uMain.pas(1197): E2018 Record, Objekt oder Klassentyp erforderlich
Boahh ehhh ;)

gruss

Uwe Raabe 23. Mär 2017 09:01

AW: Alternative für String Assign
 
Korrekt, ein
Delphi-Quellcode:
string.Assign
gibt es nicht. Was willst du denn damit erreichen? Eventuell das hier?

Delphi-Quellcode:
sBuffer := string.Create(#0, BufferSize);

EWeiss 23. Mär 2017 09:02

AW: Alternative für String Assign
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1365227)
Korrekt, ein
Delphi-Quellcode:
string.Assign
gibt es nicht. Was willst du denn damit erreichen? Eventuell das hier?

Delphi-Quellcode:
sBuffer := string.Create(#0, BufferSize);

Zitat:

sBuffer.assign(BufferSize, 0);
Kommt von C++ ;)

Wenn das so funktioniert ?

EDIT:
Ich denke mal das ist ein einfaches
Delphi-Quellcode:
sBuffer := IntToStr(BufferSize);


gruss

Uwe Raabe 23. Mär 2017 09:28

AW: Alternative für String Assign
 
Zitat:

Zitat von EWeiss (Beitrag 1365229)
Kommt von C++ ;)

Wenn das so funktioniert ?

Wie gesagt, kommt drauf an, was du erreichen willst. Einen String der Länge BufferSize gefüllt mit #0-Zeichen?

Für ältere Delphi-Versionen geht auch

Delphi-Quellcode:
sBuffer := StringOfChar(#0, BufferSize);


oder gleich ein simples

Delphi-Quellcode:
SetLength(sBuffer, BufferSize); // die Nullen kommen dann von ganz allein

EWeiss 23. Mär 2017 09:44

AW: Alternative für String Assign
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1365236)
Zitat:

Zitat von EWeiss (Beitrag 1365229)
Kommt von C++ ;)

Wenn das so funktioniert ?

Wie gesagt, kommt drauf an, was du erreichen willst. Einen String der Länge BufferSize gefüllt mit #0-Zeichen?

Für ältere Delphi-Versionen geht auch

Delphi-Quellcode:
sBuffer := StringOfChar(#0, BufferSize);


oder gleich ein simples

Delphi-Quellcode:
SetLength(sBuffer, BufferSize); // die Nullen kommen dann von ganz allein

Danke ;)
Ich werde es mal testen denn ich sehe schon meine Annahme geht so nicht.

gruss

Neutral General 23. Mär 2017 09:47

AW: Alternative für String Assign
 
Was hast du denn überhaupt vor?

EWeiss 23. Mär 2017 09:49

AW: Alternative für String Assign
 
Zitat:

Zitat von Neutral General (Beitrag 1365239)
Was hast du denn überhaupt vor?

Tja diese Zeile von C++ nach Delphi zu übersetzen mehr nicht ;)

Setlength funktioniert nicht oder aber ich habe schon vorher ein Problem.
Error Code 998.
Wenn ich versuche den Speicher mit MoveMemory zu verschieben.

Delphi-Quellcode:
MoveMemory(pGlobalBuffer, @sBuffer, BufferSize);
Muss das nochmal prüfen.

gruss

EWeiss 23. Mär 2017 10:01

AW: Alternative für String Assign
 
Hier mal mein Code
Ich versuche die PNG Datei Binär zu lesen.

Delphi-Quellcode:
function TAnimatePng.FLof(hFile: THandle): DWORD;
var
  dwFileSize: DWORD;
begin
  dwFileSize := 0;

  if hFile <> 0 then
  begin
    if GetFileType(hFile) = FILE_TYPE_DISK then
    begin
      dwFileSize := GetFileSize(hFile, nil);
      if dwFileSize = INVALID_FILE_SIZE then
        dwFileSize := 0;
    end;
  end;
  result := dwFileSize;
end;
Delphi-Quellcode:
function TAnimatePng.FSeek(hFile: THandle; PosByte: DWord): LongInt;
var
  li: integer;
begin

  li := PosByte;
  Result := 0;
  if SetFilePointer(hFile, li, nil, FILE_BEGIN) < 0 then
    Result := GetLastError();
end;
Delphi-Quellcode:
function TAnimatePng.FGet(hFile: THandle; var sBuffer: string): 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, LenBuf, ByttesReaded, 0) = false then
        Result := GetLastError();
    end;
  end;
end;
Delphi-Quellcode:
function TAnimatePng.FGetAt(hFile: THandle; PosByte: DWORD; var sBuffer: string): LongInt;
var
  ErrCode: LongInt;
begin

  ErrCode := 0;

  ErrCode := FSeek(hFile, PosByte);
  if ErrCode = 0 then
    ErrCode := FGet(hFile, sBuffer);
  result := ErrCode;
end;
Delphi-Quellcode:
BufferSize := FLof(hFileIn) - anih.offset - sizeof(anih) + 1;
SetLength(sBuffer, BufferSize); // ########### Der Anfang
if FGetAt(hFileIn, anih.offset - 1, sBuffer) = S_OK then
begin
  // sBuffer 2 laden
  Global := GlobalAlloc(GMEM_MOVEABLE or GMEM_NODISCARD, BufferSize);
  if Global <> 0 then
  begin
    pGlobalBuffer := GlobalLock(Global);
    if Assigned(pGlobalBuffer) then
    begin
      MoveMemory(pGlobalBuffer, @sBuffer, BufferSize);
      if CreateStreamOnHGlobal(Global, False, pImageStream) = S_OK then
      begin
        if GDIP_CreateBitmapFromStream(pImageStream, hImage) = S_OK then
        begin
          GDIP_DrawImageRectI(Graphics, hImage, anih.Width, 0,
            anih.Width * anih.Frame - anih.Width, anih.Height);
          GDIP_DisposeImage(cardinal(hImage));
        end;
        pImageStream := nil;
      end;
      GlobalUnlock(Cardinal(pGlobalBuffer));
    end;
    GlobalFree(Global);
  end;
end;
gruss

Uwe Raabe 23. Mär 2017 10:14

AW: Alternative für String Assign
 
Wieso benutzt du als Buffer einen string? Das kann doch nur schief gehen.

EWeiss 23. Mär 2017 10:23

AW: Alternative für String Assign
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1365245)
Wieso benutzt du als Buffer einen string? Das kann doch nur schief gehen.

Dann nehme ich nen PWideChar.. oder besser PWideString?

gruss

Neutral General 23. Mär 2017 10: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 10: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 10: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 10: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 10: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 10: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 11: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 12: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 12: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 12: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}

EWeiss 23. Mär 2017 16:03

AW: Alternative für String Assign
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1365275)
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}

Das Problem ist das SetFilePointer keinen LARGE_INTEGER mag es will Integer.
LARGE_INTEGER kann ich definieren aber nicht SetFilePointerEx

gruss

Neutral General 23. Mär 2017 16:04

AW: Alternative für String Assign
 
Warum kannst du SetFilePointerEx nicht definieren?

hoika 23. Mär 2017 16:10

AW: Alternative für String Assign
 
Hallo,
SetFilePointerEx definieren

http://stackoverflow.com/questions/4...physical-media

Uwe Raabe 23. Mär 2017 16:15

AW: Alternative für String Assign
 
Zitat:

Zitat von EWeiss (Beitrag 1365298)
Das Problem ist das SetFilePointer keinen LARGE_INTEGER mag es will Integer.

Das stimmt nicht!
Delphi-Quellcode:
function SetFilePointerEx(hFile: THandle; liDistanceToMove: TLargeInteger;
  const lpNewFilePointer: PLargeInteger; dwMoveMethod: DWORD): BOOL; stdcall;
Einmal wird ein
Delphi-Quellcode:
TLargeInteger
erwartet (=
Delphi-Quellcode:
Int64
s.o.) und das andere Mal ein
Delphi-Quellcode:
PLargeInteger
. Ein
Delphi-Quellcode:
LARGE_INTEGER
kommt dort überhaupt nicht vor (
Delphi-Quellcode:
Integer
übrigens auch nicht).

Wenn du also mit
Delphi-Quellcode:
TLargeInteger
bzw. mit Pointern darauf arbeitest sollte das funktionieren.

EWeiss 23. Mär 2017 16:28

AW: Alternative für String Assign
 
Hmm nun ja.
Ich habe es so definiert wie gezeigt.

Delphi-Quellcode:
var
   li: LARGE_INTEGER;
begin

   li.LowPart := PosByte;
Delphi-Quellcode:
var
   li: TLargeInteger;
begin

   li:= PosByte;
TLargeInteger geht.

gruss

Neutral General 23. Mär 2017 16:32

AW: Alternative für String Assign
 
Deswegen musst du ja SetFilePointerEx benutzen.

EWeiss 23. Mär 2017 17:05

AW: Alternative für String Assign
 
Zitat:

Zitat von Neutral General (Beitrag 1365305)
Deswegen musst du ja SetFilePointerEx benutzen.

ja.. Werde ich dann wohl selbst definieren müssen.

gruss

EWeiss 23. Mär 2017 17:19

AW: Alternative für String Assign
 
Sorry der Kram will wieder mal nicht.
Fehler 183.

Habe versucht SetFilePointerEx zu definieren aber es kommen nur Kompatibilitäts Probleme.
Ok muss mich nochmal schlau machen.

gruss

bra 23. Mär 2017 17:24

AW: Alternative für String Assign
 
Funktioniert das nicht (erste Antwort):

http://stackoverflow.com/questions/4...physical-media

Delphi-Quellcode:
function GetFileSizeEx(hFile: THandle; var lpFileSize: Int64): BOOL;
    stdcall; external 'kernel32.dll';
function SetFilePointerEx(hFile: THandle; liDistanceToMove: Int64;
    lpNewFilePointer: PInt64; dwMoveMethod: DWORD): BOOL;
    stdcall; external 'kernel32.dll';

Luckie 23. Mär 2017 17:24

AW: Alternative für String Assign
 
Dann mach doch bitte für das neue Problem auch einen neuen Thread auf.

EWeiss 23. Mär 2017 17:29

AW: Alternative für String Assign
 
Zitat:

Zitat von Luckie (Beitrag 1365312)
Dann mach doch bitte für das neue Problem auch einen neuen Thread auf.

Es dreht sich immer noch um das gleiche Thema ist eine folge dessen.

gruss

EWeiss 23. Mär 2017 17:31

AW: Alternative für String Assign
 
Zitat:

Zitat von bra (Beitrag 1365310)
Funktioniert das nicht (erste Antwort):

http://stackoverflow.com/questions/4...physical-media

Delphi-Quellcode:
function GetFileSizeEx(hFile: THandle; var lpFileSize: Int64): BOOL;
    stdcall; external 'kernel32.dll';
function SetFilePointerEx(hFile: THandle; liDistanceToMove: Int64;
    lpNewFilePointer: PInt64; dwMoveMethod: DWORD): BOOL;
    stdcall; external 'kernel32.dll';

Es könnte sein das ein Mix von GetFileSize und SetFilePointerEx sich nicht verträgt.
Danke werde das mal gegen prüfen.

gruss

Luckie 23. Mär 2017 17:33

AW: Alternative für String Assign
 
Ja, aber unter den Titel "Alternative für String Assign" würde ich jetzt nicht nach einer Lösung für dein FilePointer Problem und dem Large_Integer gucken. Also mach bitte einen neuen Thread mit einem passenden Titel auf.

EWeiss 23. Mär 2017 17:37

AW: Alternative für String Assign
 
Zitat:

Zitat von Luckie (Beitrag 1365315)
Ja, aber unter den Titel "Alternative für String Assign" würde ich jetzt nicht nach einer Lösung für dein FilePointer Problem und dem Large_Integer gucken. Also mach bitte einen neuen Thread mit einem passenden Titel auf.

Wenn du es unbedingt für nötig hältst und mich so nett bittest.. OK

gruss

Uwe Raabe 23. Mär 2017 18:38

AW: Alternative für String Assign
 
Zitat:

Zitat von EWeiss (Beitrag 1365306)
ja.. Werde ich dann wohl selbst definieren müssen.

Das ist doch bereits in Winapi.Windows.pas deklariert. Woher glaubst du habe ich die Deklaration kopiert?

EWeiss 23. Mär 2017 18:45

AW: Alternative für String Assign
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1365328)
Zitat:

Zitat von EWeiss (Beitrag 1365306)
ja.. Werde ich dann wohl selbst definieren müssen.

Das ist doch bereits in Winapi.Windows.pas deklariert. Woher glaubst du habe ich die Deklaration kopiert?

Sorry nicht in D2010 dort finde ich die Funktion nicht.

gruss

Luckie 23. Mär 2017 18:47

AW: Alternative für String Assign
 
Nicht Funktion. Sondern Deklaration. Aber bitte dieses Problem im neuen Thread http://www.delphipraxis.net/192158-l...ml#post1365327 weiter diskutieren.

EWeiss 23. Mär 2017 18:48

AW: Alternative für String Assign
 
Zitat:

Zitat von Luckie (Beitrag 1365331)
Nicht Funktion. Sondern Deklaration. Aber bitte dieses Problem im neuen Thread http://www.delphipraxis.net/192158-l...ml#post1365327 weiter diskutieren.

OK mach zu ;)

gruss


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