2010-08-13 11 views
8

Estoy usando un registro compuesto de cadenas, booleanos, enteros, monedas y matrices de otros registros dentro de un método de una clase. Me gustaría inicializar de forma recursiva todos los campos de un tipo primitivo a vacío/falso/cero. Delphi no parece hacer esto por defecto. ¿Hay una manera directa de lograr esto que no implique acceder a cada campo por nombre y configurarlo manualmente?¿Cómo puedo inicializar un registro declarado como una variable local?

+0

Tenga en cuenta que Delphi inicializa los tipos administrados de por vida (cadenas, matrices dinámicas, interfaces). – kludg

+4

En Delphi-2009 y más tarde, un registro puede ser inicializado por 'Foo: = Default (TFoo);'. Consulte [Respuesta de David] (http://stackoverflow.com/a/11066205/576719) a la pregunta [¿Cómo liberar correctamente los registros que contienen varios tipos en Delphi a la vez?] (Http://stackoverflow.com/q/ 11065821/576719). –

+2

también vea: [¿Qué variables se inicializan cuando está en Delphi?] (Http://stackoverflow.com/questions/861045/which-variables-are-initialized-when-in-delphi) – Ampere

Respuesta

10

Puede usar ya sea uno de siguientes construcciones (donde Foo es un registro).

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

ZeroMemory(@Foo, SizeOf(Foo)); 

Desde un puesto de Allen Bauer

Mientras observa los usos más comunes para FillChar con el fin de determinar si la mayoría de la gente utiliza FillChar a realidad llenar la memoria con carácter de datos o simplemente utilizar para inicializar la memoria con un determinado valor de bytes, descubrimos que era el último caso que dominaba su uso en lugar del anterior. Con eso decidimos mantener FillChar byte-centric.

+4

O el mismo código con (probablemente) mejor legibilidad: ZeroMemory (@Foo, SizeOf (Foo)); – Im0rtality

+0

@ ImOrtality: He actualizado la respuesta para incluir su solución ZeroMemory. –

+0

Tenga en cuenta que ZeroMemory es un contenedor para FillChar en * algunas * versiones de Delphi (d6 y 7 al menos). –

Cuestiones relacionadas