![]() |
Alternative für String Assign
Obwohl möglich funktioniert das so nicht.
Delphi-Quellcode:
var
BufferSize: dword; sBuffer: string; //.... sBuffer.assign(BufferSize, 0); Zitat:
gruss |
AW: Alternative für String Assign
Korrekt, ein
Delphi-Quellcode:
gibt es nicht. Was willst du denn damit erreichen? Eventuell das hier?
string.Assign
Delphi-Quellcode:
sBuffer := string.Create(#0, BufferSize);
|
AW: Alternative für String Assign
Zitat:
Zitat:
Wenn das so funktioniert ? EDIT: Ich denke mal das ist ein einfaches
Delphi-Quellcode:
sBuffer := IntToStr(BufferSize);
gruss |
AW: Alternative für String Assign
Zitat:
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
|
AW: Alternative für String Assign
Zitat:
Ich werde es mal testen denn ich sehe schon meine Annahme geht so nicht. gruss |
AW: Alternative für String Assign
Was hast du denn überhaupt vor?
|
AW: Alternative für String Assign
Zitat:
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:
Muss das nochmal prüfen.
MoveMemory(pGlobalBuffer, @sBuffer, BufferSize);
gruss |
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:
gruss
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; |
AW: Alternative für String Assign
Wieso benutzt du als Buffer einen string? Das kann doch nur schief gehen.
|
AW: Alternative für String Assign
Zitat:
gruss |
AW: Alternative für String Assign
Man nimmt einen Pointer mit GetMem oder ggf. auch ein Byte Array.
|
AW: Alternative für String Assign
Zitat:
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; |
AW: Alternative für String Assign
Zitat:
Belassen? ok sollte gehn ist ja ein Array gruss |
AW: Alternative für String Assign
Zitat:
Delphi-Quellcode:
var
s: string; b: TBytes; begin SetLength(s, 10); // 20 Bytes SetLength(b, 10); // 10 Bytes; |
AW: Alternative für String Assign
Zitat:
gruss |
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 |
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:
muss aber nun darauf zurückgreifen.
var
li: LARGE_INTEGER; begin li.LowPart := PosByte;
Delphi-Quellcode:
gruss
var
li: LongInt; begin li := PosByte; |
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. |
AW: Alternative für String Assign
Delphi-Quellcode:
ist ein Record. Versuch doch
LARGE_INTEGER
Delphi-Quellcode:
, das entspriche
TLargeInteger
Delphi-Quellcode:
.
Int64
|
AW: Alternative für String Assign
Zitat:
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} |
AW: Alternative für String Assign
Zitat:
LARGE_INTEGER kann ich definieren aber nicht SetFilePointerEx gruss |
AW: Alternative für String Assign
Warum kannst du SetFilePointerEx nicht definieren?
|
AW: Alternative für String Assign
|
AW: Alternative für String Assign
Zitat:
Delphi-Quellcode:
Einmal wird ein
function SetFilePointerEx(hFile: THandle; liDistanceToMove: TLargeInteger;
const lpNewFilePointer: PLargeInteger; dwMoveMethod: DWORD): BOOL; stdcall;
Delphi-Quellcode:
erwartet (=
TLargeInteger
Delphi-Quellcode:
s.o.) und das andere Mal ein
Int64
Delphi-Quellcode:
. Ein
PLargeInteger
Delphi-Quellcode:
kommt dort überhaupt nicht vor (
LARGE_INTEGER
Delphi-Quellcode:
übrigens auch nicht).
Integer
Wenn du also mit
Delphi-Quellcode:
bzw. mit Pointern darauf arbeitest sollte das funktionieren.
TLargeInteger
|
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:
TLargeInteger geht.
var
li: TLargeInteger; begin li:= PosByte; gruss |
AW: Alternative für String Assign
Deswegen musst du ja SetFilePointerEx benutzen.
|
AW: Alternative für String Assign
Zitat:
gruss |
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 |
AW: Alternative für String Assign
Funktioniert das nicht (erste Antwort):
![]()
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'; |
AW: Alternative für String Assign
Dann mach doch bitte für das neue Problem auch einen neuen Thread auf.
|
AW: Alternative für String Assign
Zitat:
gruss |
AW: Alternative für String Assign
Zitat:
Danke werde das mal gegen prüfen. gruss |
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.
|
AW: Alternative für String Assign
Zitat:
gruss |
AW: Alternative für String Assign
Zitat:
|
AW: Alternative für String Assign
Zitat:
gruss |
AW: Alternative für String Assign
Nicht Funktion. Sondern Deklaration. Aber bitte dieses Problem im neuen Thread
![]() |
AW: Alternative für String Assign
Zitat:
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