Zo stringom by sa to dalo tak:
Kód: Vybrať všetko
var S : String
BufferPointer :=^S+1;
BufferLength :=Ord(S[0]);
Ale stale nechapem, preco nepouzivas Array, alebo blok pamate, ale PChar.
Na priklade co ti DXR pisal, zmenis ulozisko dat na:
Kód: Vybrať všetko
WriteFile(hCommFile,
Buffer, { alebo BufferPointer^}
BufferLength, { <- Ak to je pocet odoslanych bytov }
NumberWritten,
nil);
Su dva sposoby, ako si alokujes pamat. Bud napevno, alebo pocas programu:
Na pevno:
Kód: Vybrať všetko
Var: Buffer : Array [0..1023] of char; {mas 1K pamate k dispozicii}
BufferLength : Word; { alebo Integer. Tu je premena na kolko je je nacitany buffer}
Pocas programu:
Kód: Vybrať všetko
Var:
BufferPointer : ^Buffer; {adresa nasho buffra}
Buffer : Array of char;
BufferLength : Word; { alebo Integer. Tu je premena na kolko je je nacitany buffer}
; Alokovanie pamate pocas jazdy
GetMem (BufferPointer, 1024); {alebo BufferPointer:=GetMem (1024) pre 1Kbyte}
if BufferPointer=0 Then WriteLn('Volna pamat uz nieje k dispozicii');
; Uvolnenie pamate
FreeMem (BufferPointer); {alebo Dispose (BufferPointer) }
Vlkadane znaku do Bufra a nulovanie:
Kód: Vybrať všetko
; Vlozit Byte
Procedure PushBuf (B : Byte); Overload;
Begin
Buffer [BufferLength] := Chr (B); {pre prvu alternativu}
BufferPointer^[BufferLength] := Chr (B); {pre druhu alternanivu}
Inc (BufferLength);
End;
; Vlozit Znak
Procedure PushBuf (Ch : Char); Overload;
Begin
Buffer [BufferLength] := Ch; {pre prvu alternativu}
BufferPointer^[BufferLength] := Ch; {pre druhu alternanivu}
Inc (BufferLength);
End;
; Vynulovanie
Procedure ClrBuf;
Begin
BufferLength:=0;
End;
Na konci procedury je OVERLOAD; co znamena, ze bude este jedna procedura s tym istym menom, len iny parameter. Pascal a Delphi pouziva metodu presuvu parametrov v procedurach pomocov registrov. Windows v knizniciach pouziva Zasobnik (Stack). Preto, ked vola Delphi nejaku windowsacku kniznicu, musi byt metoda zmenena z registrovej na zasobnikovu. Preto sa pise za procedurov StdCall. Su aj ine metody volania procedury, ale to niekedy inokedy..
Musis mat nacitanu kniznicu SYSTEM. Co predpokladam, ze uz je tam automaticky. Podrobnosti najdes napr. tu:
http://docs.embarcadero.com/products/ra ... etMem.html