2016-06-10 52 views
5

ho molto vecchio codice (da D3):utilizzando nuove/Smaltire con puntatore del record contenente WideString

TMyRecord = record 
    Index : Integer; 
    Header : String[70]; 
    Strings : Array[1..MAX_VALUES] of String[70]; 
end; 

TMyClass = class(TComponent) 
    FData : ^TMyRecord; 
    ... 
end; 

constructor TMyClass.Create(AOwner: TComponent); 
begin 
    inherited Create(AOwner); 
    New(FData);  
    ... 
end; 

destructor TMyClass.Destroy; 
begin 
    Dispose(FData); 
    inherited; 
end; 

D: E 'sicuro per sostituire String[70] con WideString; e Array[1..MAX_VALUES] of String[70] con Array[1..MAX_VALUES] of WideString? (Si prega di spiegare perché)

ho bisogno di questo per supportare Unicode in Delphi 7.

+0

Perché vuoi cambiarlo? –

+0

'Dispose' chiama la routine' _Finalize' che libera correttamente tutte le strutture interne. Come hai intenzione di usare questo tipo? – MBo

+4

La risposta semplice è si. Questo è un tipo gestito, e 'New' e' Dispose' inizializzano e finalizzano i tipi gestiti. –

risposta

7

In generale si dovrebbe mai usare WideString. È inteso solo per compatibilità con COM BSTR.

Tuttavia, si sta utilizzando una versione precedente al 2009, pertanto se si utilizza lo standard per l'Unicode non è possibile effettuare una scelta.
WideString viene assegnato dinamicamente, quando si usa il record new Delphi aggiungerà il codice per inizializzare le stringhe.
Non è necessario inizializzarli autonomamente.

Proprio come le stringhe WideStrings non sono conteggiate conteggio di riferimento, ma verranno distrutte quando si registra il record dispose.
Se si assegna il Widestring a un altro Widestring Delphi farà una copia, questo è leggermente meno efficiente del conteggio, ma per il resto non è un problema.

Ogniqualvolta un Widestring esce dal campo di applicazione viene distrutto.

Fare attenzione con PWideChar, questi saranno penzolanti quando una WideString viene distrutta.

VCL non può visualizzare WideString
Nota che, mentre Delphi 7 fa hanno il supporto per Unicode con WideString VCL non può visualizzare i tuoi Widestrings, è possibile visualizzare solo AnsiString.
Se si desidera visualizzare WideStrings utilizzare i componenti TNT, vedere questa risposta per ulteriori informazioni: Handling a Unicode String in Delphi Versions <= 2007

Se avete intenzione di assegnare a WideString (Ansi) stringa si potrebbe anche usare stringa di pianura, perché si perde tutto il tuo unicode
È possibile utilizzare UTF8, ma D7 non può visualizzare neanche UTF8.

Caveat: indicizzazione nei locali asiatiche
Un ulteriore avvertimento è che MyWidestring[i] non significa necessariamente che il carattere esimo perché Unicode non può essere pienamente espresso in 2 byte per char.
A meno che non si stia utilizzando una lingua asiatica, ciò non dovrebbe influenzare l'utente.

Q: È sicuro sostituire String [70] con WideString;

Sì, ma è più facile da sostituire con String[70]String (aka AnsiString). Perché D7 VCL supporta AnsiString ma non WideString.
Oltre a questo non hai davvero un problema.

Ulteriore lettura
https://grahamwideman.wikispaces.com/Delphi+String+Types

+0

Grazie. cosa intendi con * "Stai attento con PWideChar" *? dovrei essere preoccupato se io uso per es. 'Windows.ExtTextOutW (Handle, X, Y, TextFlags, nil, PWideChar (WideText) ...'? – zig

+0

No, va bene solo se si perpetuano P (Wide) Chars dopo che la stringa a cui puntano è già uscita dal campo di applicazione avrai un problema – Johan