2010-08-13 16 views
8

Używam rekordu złożonego z ciągów, booleans, liczb całkowitych, walut i tablic innych rekordów wewnątrz metody klasy. Chciałbym rekursywnie zainicjować wszystkie pola typu pierwotnego na puste/fałszywe/zero. Delphi domyślnie nie wydaje się tego robić. Czy istnieje prosty sposób osiągnięcia tego, który nie wymaga dostępu do każdego pola po nazwie i ręcznego ustawiania go?Jak mogę zainicjować rekord zadeklarowany jako zmienna lokalna?

+0

Należy pamiętać, że Delphi inicjuje typy zarządzane przez cały okres eksploatacji (ciągi, dynamiczne tablice, interfejsy). – kludg

+4

W Delphi-2009 i nowszym rekord można zainicjować za pomocą 'Foo: = Default (TFoo);'. Zobacz [odpowiedź Dawida] (http://stackoverflow.com/a/11066205/576719) na pytanie [Jak poprawnie uwolnić rekordy zawierające różne typy w Delphi naraz?] (Http://stackoverflow.com/q/ 11065821/576719). –

+2

Zobacz także: [Które zmienne są inicjowane w Delphi?] (Http://stackoverflow.com/questions/861045/which-variables-are-initialized-when-in-delphi) – Ampere

Odpowiedz

10

Możesz użyć albo jednego następujących konstrukcji (gdzie Foo jest rekordem).

FillChar(Foo, SizeOf(Foo), 0); 

ZeroMemory(@Foo, SizeOf(Foo)); 

z postu z Allen Bauer

Patrząc na najczęstszych zastosowań dla FillChar w celu ustalenia czy większość ludzi użyć FillChar do faktycznie wypełnić pamięć z charakterem danych lub po prostu użyć Aby zainicjować pamięć z pewną podaną wartością bajtu, my ustaliliśmy, że w tym ostatnim przypadku zdeklasowało się raczej jego użycie niż , a nie poprzednik . Z tym zdecydowaliśmy się zachować FillChar bajtocentryczne.

+4

Albo ten sam kod z (prawdopodobnie) lepszym czytelność: ZeroMemory (@Foo, SizeOf (Foo)); – Im0rtality

+0

@ Im0rtality: Zaktualizowałem odpowiedź, aby uwzględnić Twoje rozwiązanie ZeroMemory. –

+0

Zauważ, że ZeroMemory jest opakowaniem dla FillChar w * niektórych * wersjach Delphi (przynajmniej d6 i 7). –

Powiązane problemy