Denne tråd er inspireret af Michael's 'bøvl' med C libraries.
Jeg har tidligere omtalt et 'fedtemadsprogram' til at teste/illustrere
forhold omkring Strings,Chars,WideStrings,PWidechars osv.
Jeg har kommenteret hver linie så godt jeg kan, og vedlægger unit filen.
Formen består bare af nogle få standard komponenter, så den kan man lave som
man vil.
Meningen er, at hvis man 'stopper' ved den sidste linie:
Label1.Caption := P ;
kan man holde musen over de forskellige variable.
Prøv eksempelvis at holde den over T.W og T.WC, det er 2 repræsentationer af
de samme data.
På et tidspunkt vil jeg nok lave nogle demoer, der afspejler de forskellige
calling conventions.
Her er unit filen:
unit WidetestU;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
(*
Her definerer vi en record, der kan opfattes som enten
101 16 bits tal, eller 101 Widechar's.
Samtidig kan WC 'bruges' som en streng på 100 + terminating 0
*)
tTestRec = PACKED RECORD
CASE Boolean OF
false : ( W : ARRAY [0..100] OF Word );
true : ( WC : ARRAY [0..100] OF Widechar );
END ;
var
Form1: TForm1;
T : tTestRec ;
S : WideString ; // En streng
P : PWidechar ; // En pointer
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
// Vi tester om vi kan lægge en snsistreng direkte over i WideString
S := Edit1.Text ;
// Her udvider vi strengen, så vi er sikre på, at der ikke er 0'er
efterfølgende.
S := S + '
Z';
// Her sætter vi længden ned igen, hvilket kun er længdeangivelsen,
// så de 4 Z'er er intakt i hukommelsen.
SetLength(S,Length(S)-4);
// Her tjekker vi om vi kan lægge en widestring direkte over i ansistreng.
Memo1.Lines.Add(S);
// Her fylder vi bufferen op, så vi er sikre på, der ikke er 9'er i.
Fillchar(T,202,64);
// Her laver vi en rå memoryflytning + lidt ekstra, så vi får afslutningen
med.
Move(S[1],T.W, Length(S)*2 + 10 ) ;
// Her sætter vi korset's tegn i unicode.
T.W[0] := 32*256+32 ;
// Her udnytter vi at Delphi kan opfatte array [0.. som en 0 termnineret
streng
S := T.WC ;
// Her tjekker vi hvad der sker med korset's tegn i VCL'et
Memo1.Lines.Add(S);
// Her sætter vi pointeren P op til at pege på strengen S
P := PWidechar(S);
// Her tjekker vi om vi kan lægge en PWideChar i en ansistregn.
Memo1.Lines.Add(P);
// Her lægger vi en PwideChar over i en Widestring.
S := P ;
// Viser resultatet.
Memo1.Lines.Add(S);
// Samme som før, men vi tjekker lige .Caption
Label1.Caption := P ;
end;
end.
--
Med venlig hilsen/Best regards
Stig Johansen