Newsgroup: it.comp.lang.delphi
Titolo: RecordSize con string

Salve.
Como posso calcolare correttamente la dimensione di un Record contenente una
stringa (non shortstring)?
type TMyRecord = record
       Number: integer;
       Logical  : boolean;
       Text      : string;
       end;
var MyRecord: TMyRecord;
SizeOf(MyRecord) pone sempre a 4 la dimensione della parte string (essendo
un puntatore "nascosato").
Non voglio fissare a priori la dimensione della stringa perché a runtime
varia grandemente.
Ovviamente con Length(MyRecord.Text) ho la dimensione esatta, ma vorrei
usare un unica funzione di calcolo per tutto il record!
Grazie.
  BedBaol


Presumo che questa tua richiesta sia legata al precedente messaggio che
hai mandato dove dicevi di dover calcolare la dimensione di record dalla
struttura diversa gli uni dagli altri.
Ti ribadiscono, per quello che so io, che non esiste una funzione generica
per fare
quello che chiedi ma ti devi implementare tu una funzione specifica simile
a quella che
ti posto piu' sotto (devi solo completarla dove serve).
Per compilarla, metti un memo su una form vuota.
<inizio codice>
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
function CalcolaDimensione(
  const ListaArgomenti : array of const ) : integer;
var
  TipoListaArgomenti :
    array[0..$FFF0 div SizeOf(TVarRec)]
      of TVarRec absolute ListaArgomenti;
  intCont         : integer;
begin
  Result := 0;
  for intCont := Low( ListaArgomenti ) to
           High( ListaArgomenti ) do
  begin
    with TipoListaArgomenti[ intCont ] do
    begin
      case VType of
        vtInteger   : begin
          Result := Result + SizeOf(VInteger)
        end;
        vtBoolean   : begin
          Result := Result + SizeOf(VBoolean)
        end;
        vtChar      : begin
          Result := Result + SizeOf(VChar)
        end;
        vtExtended  : begin
          Result := Result + SizeOf(VExtended)
        end;
        vtString    : begin
          Result := Result + Length(VString^);
        end;
        vtPointer   : begin
          {gestire la var VPointer qui}      end;
        vtPChar     : begin
          {gestire la var VPChar qui}        end;
        vtObject    : begin
          {gestire la var VObject qui}       end;
        vtClass     : begin
          {gestire la var VClass qui}        end;
        vtWideChar  : begin
          {gestire la var VWideChar qui}     end;
        vtPWideChar : begin
          {gestire la var VPWideChar qui}    end;
        vtAnsiString: begin
          Result := Result + Length(string(VString))
        end;
        vtCurrency  : begin
          {gestire la var VCurrency qui}     end;
        vtVariant   : begin
          {gestire la var VVariant qui}      end;
        else          begin
          {gestire la variabile di tipo sconosciuto qui} end;
      end;
    end;
  end;
end;
procedure TForm1.FormCreate(Sender: TObject);
const
 strDich = 'Dimensione record: ';
type TMyRecord = record
       Number : integer;
       Logical: boolean;
       Text   : string;
      end;
      TRecordBase = record
       realNumero : Real;
       chCarattere: char;
       strTesto: string[50];
       strAnsiTesto: string;
      end;
var MyRecord: TMyRecord;
     varRecordBase : tRecordBase;
begin
// inizializzazione variabile
 with MyRecord do
 begin
  Number := 0;
  Logical := True;
  Text := '';
 end;
 with varRecordBase do
 begin
  realNumero := 0.0;
  chCarattere := ' ';
  strTesto:= '';
  strAnsiTesto := '';
 end;
// inserisco la dimensione del record nel memo
with MyRecord do
 memo1.Lines.Add(strDich + '- MyRecord - '
   + IntToStr(CalcolaDimensione([Number, Text, Logical])));
with VarRecordBase do
 memo1.Lines.Add(strDich + '- TRecordBase - '+
   IntToStr(CalcolaDimensione([realNumero, chCarattere, strTesto,
strAnsiTesto])));
// modifico la variabile
 with MyRecord do
 begin
  Number := 0;
  Logical := True;
  Text := '1234567890123456789012345';
 end;
 with varRecordBase do
 begin
  realNumero := -100.0;
  chCarattere := 'A';
  strTesto:= '12345';
  strAnsiTesto := '1234512345';
 end;
 // inserisco la dimensione del record
with MyRecord do
 memo1.Lines.Add(strDich + '- MyRecord - '
    + IntToStr(CalcolaDimensione([Number, Text, Logical])));
with VarRecordBase do
 memo1.Lines.Add(strDich + '- TRecordBase - '+
   IntToStr(CalcolaDimensione([realNumero, chCarattere, strTesto,
strAnsiTesto])));
end;
end.
<fine codice>
Attenzione: non e' testata a sufficienza, provala piu' volte prima di
renderla definitiva!
Ciao.
--
ACSH
[D4]
---------------------------
Chi fa da se'
fatica il doppio