Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz