Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Neuer type in (Data.)DB.pas (https://www.delphipraxis.net/163985-neuer-type-data-db-pas.html)

Mavarik 24. Okt 2011 16:48

Datenbank: egal • Version: 1 • Zugriff über: 1

Neuer type in (Data.)DB.pas
 
Hallo Zusammen!

Es haben sich seit Unicode ja die Type in der (Data.)DB geändert.
Früher wurden die Buffer ja als PChar gespeichert.
Jetzt jedoch als TRecordBuffer = PByte;

Daher meine Frage:

"Normalerweise" hat mal

Delphi-Quellcode:
var
   Buffer : PChar;
begin
  Buffer := StrAlloc(Datensatzlaenge);
  // bla bla bla
  StrDispose(Buffer);
end;
Mal abgesehen davon, das StrAlloc veraltet ist und das

Warnung: Wandeln Sie den Typ von Nicht-Zeichen-Zeigertypen nicht in PAnsiChar für die Zeigerarithmetik um. Verwenden Sie stattdessen den Zeigertyp PByte, der mit der Compiler-Direktive {$POINTERMATH ON} deklariert wird.

Wie reserviere ich Speicher für ein PByte und gebe Ihn wieder frei? Getmem? Leider fehlt dann beim Free die Länge?

Grüsse Mavarik :coder:

PS.: Ich verzweifel noch an der Unicodeumstellung!

DeddyH 24. Okt 2011 16:56

AW: Neuer type in (Data.)DB.pas
 
Ich habe zwar noch nichts mit PByte zu tun gehabt, aber ich denke, mit GetMem/FreeMem bzw. GetMemory/FreeMemory sollte das zu machen sein.

Mavarik 24. Okt 2011 17:01

AW: Neuer type in (Data.)DB.pas
 
Zitat:

Zitat von DeddyH (Beitrag 1132280)
Ich habe zwar noch nichts mit PByte zu tun gehabt, aber ich denke, mit GetMem/FreeMem bzw. GetMemory/FreeMemory sollte das zu machen sein.

Klar aber für den Free fehlt mir dann die Größe!

Bei PChar ist das ja am offset-4 gespeichert... bei PByte dann mit Getmem aber nicht...

Mavaik

Bummi 24. Okt 2011 17:01

AW: Neuer type in (Data.)DB.pas
 
AllocMem und FreeMem

eine Beispielimplementierung findest Du in ADODB

Delphi-Quellcode:
>> TCustomADODataSet.AllocRecordBuffer
>> TCustomADODataSet.FreeRecordBuffer

himitsu 24. Okt 2011 17:06

AW: Neuer type in (Data.)DB.pas
 
Zitat:

Klar aber für den Free fehlt mir dann die Größe!
Da kannst du auch einfach 0 angeben ... es wird ja sowieso der ganze Block freigegeben, egal wie groß.

Du könntest auch Delphi-Referenz durchsuchenTBytes verwenden (mit SetLength den Speicher reservieren) und als
Delphi-Quellcode:
@MyBuffer[Low(MyBuffer)]
, bzw.
Delphi-Quellcode:
@MyBuffer[0]
oder
Delphi-Quellcode:
PByte(MyBuffer)
übergeben.
(dynamische Arrays sind ja auch "nur" Pointer)
Oder direkt dataset.FieldByName('field').AsBytes (Delphi-Referenz durchsuchenTField.AsBytes).



Das Problem war ja, daß PChar total falsch gewählt wurde und bevor man dieses auf PAnsiChar umstellte, entschied man sich dann aber doch für das richtigere PByte. :stupid:

DeddyH 24. Okt 2011 17:37

AW: Neuer type in (Data.)DB.pas
 
Und ein Blick in die Hilfe wirkt manchmal Wunder. Der Size-Parameter beim FreeMem ist optional, bei FreeMemory gibt es den erst gar nicht ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 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 by Thomas Breitkreuz