Clase wxVariant
La clase wxVariant representa un contenedor para cualquier tipo.
Jerarquía:
El valor de una variante se puede cambiar en tiempo de ejecución, posiblemente a un tipo de valor diferente.
Nota: A partir de wxWidgets 2.9.1, wxAny se ha convertido en la clase variante preferida. Aunque la mayoría de los controles siguen utilizando wxVariant en su interfaz, se puede empezar a utilizar wxAny en el código gracias a una capa de conversión implícita. Consultar a continuación para obtener más información.
De forma estándar, wxVariant puede almacenar valores de tipo bool, wxChar, double, long, string, string list, time, date, void pointer, list of strings y list of variants. Sin embargo, una aplicación puede ampliar las capacidades de wxVariant derivando de la clase wxVariantData y utilizando la forma wxVariantData del constructor wxVariant o el operador de asignación para asignar estos datos a una variante. Los valores reales de los tipos definidos por el usuario deberán accederse a través del objeto wxVariantData, a diferencia de lo que ocurre con los tipos de datos básicos, en los que se pueden utilizar funciones de conveniencia como GetLong().
En Microsoft Windows, hay tres clases adicionales derivadas de wxVariantData (wxVariantDataCurrency, wxVariantDataErrorCode y wxVariantDataSafeArray) disponibles para la interoperabilidad con OLE VARIANT cuando se utiliza wxAutomationObject.
Los punteros a cualquier clase derivada de wxObject también se pueden almacenar fácilmente en un wxVariant. wxVariant utilizará entonces el sistema RTTI integrado en wxWidgets para establecer el nombre del tipo (devuelto por GetType()) y realizar comprobaciones de seguridad de tipos en tiempo de ejecución.
Esta clase es útil para reducir la programación de ciertas tareas, como un editor para diferentes tipos de datos o un protocolo de llamada a procedimientos remotos.
Un miembro opcional de nombre está asociado con un wxVariant. Esto podría utilizarse, por ejemplo, en clases de automatización CORBA u OLE, donde se requieren parámetros con nombre.
Hay que tener en cuenta que, a partir de wxWidgets 2.7.1, wxVariant cuenta con referencias.
Las macros de conveniencia wxDECLARE_VARIANT_OBJECT() y wxIMPLEMENT_VARIANT_OBJECT() permiten añadir fácilmente soporte para la conversión entre wxVariant y clases personalizadas. La primera de estas macros debe utilizarse dentro de la declaración de la clase y la segunda fuera de ella, en el archivo de implementación, por ejemplo:
// en el fichero de cabecera
class MyClass : public wxObject {
...
wxDECLARE_VARIANT_OBJECT(MyClass);
};
// en el fichero de implementación
wxIMPLEMENT_VARIANT_OBJECT(MyClass);
// y entonces los objetos de MyClass se pueden usar con wxVariant de esta manera:
wxVariant variant;
MyClass value;
variant << value;
// o
value << variant;
Para que esto funcione, MyClass debe derivarse de wxObject, implementar el sistema RTTI de wxWidgets y admitir el operador de asignación y el operador de igualdad para sí mismo. Lo ideal sería que también se contara la referencia para que las operaciones de copia fueran económicas y rápidas. Esto se puede implementar más fácilmente utilizando la compatibilidad con el recuento de referencias que ofrece el propio wxObject. De forma predeterminada, wxWidgets ya implementa la conversión del operador de desplazamiento para algunas de sus clases relacionadas con el dibujo:
Nota: También hay versiones heredadas de las macros anteriores sin el prefijo wx, que funcionan de forma ligeramente diferente. Utilizar las nuevas versiones en el nuevo código y considerar sustituir cualquier uso existente de las macros heredadas por las nuevas.
Hay que tener en cuenta que, a partir de wxWidgets 2.9.0, wxVariantData ya no hereda de wxObject y wxVariant ya no utiliza la clase wxList, insegura en cuanto al tipo, para las operaciones de lista, sino la clase wxVariantList, segura en cuanto al tipo. Además, wxVariantData ahora admite la función wxVariantData::Clone() para implementar la función Unshare(). wxVariantData::Clone() se implementa automáticamente mediante IMPLEMENT_VARIANT_OBJECT().
Dado que wxVariantData ya no deriva de wxObject, cualquier código que compruebe el tipo de datos utilizando wxDynamicCast() requerirá un ajuste. Se puede utilizar la macro wxDynamicCastVariantData() con los mismos argumentos que wxDynamicCast(), para utilizar la información de tipo RTTI de C++ en lugar de la RTTI de wxWidgets.
Capa de conversión de wxVariant a wxAny
wxAny es una clase variante más moderna basada en plantillas. No es directamente compatible con wxVariant, pero existe una capa de conversión transparente.
A continuación se muestra un ejemplo de cómo utilizar estas conversiones con la clase de propiedad wxPGProperty de wxPropertyGrid (que actualmente utiliza wxVariants tanto internamente como en la API pública):
// Obtener el valor de la propiedad como wxAny en lugar de wxVariant. wxAny value = property->GetValue(); // Haz algo con ello. DoSomethingWithString(value.As<wxString>()); // Escribir nuevo valor en la propiedad value = "New Value"; property->SetValue(value);
Algunas advertencias:
- En wxAny, no hay tipos separados para manejar enteros de diferentes tamaños, por lo que convertir wxAny con un valor "long long" producirá un wxVariant de tipo "long" cuando el valor sea lo suficientemente pequeño como para caber sin desbordamiento. De lo contrario, se utiliza el tipo variante "longlong". También hay que tener en cuenta que wxAny que contiene enteros sin signo siempre se convertirá al tipo wxVariant "ulonglong".
- A diferencia de wxVariant, wxAny no almacena una cadena de nombre (que rara vez se necesita).
- Debido a la conversión implícita de wxVariant a wxAny, wxAny no suele contener valores de tipo wxVariant. En otras palabras, any.CheckType<wxVariant>() nunca puede devolver verdadero.
Las funciones de conversión proporcionadas funcionarán automáticamente con todos los tipos wxVariant integrados, así como con todos los tipos especificados por el usuario generados mediante IMPLEMENT_VARIANT_OBJECT(). Para las clases wxVariantData creadas manualmente, deberá utilizar las macros proporcionadas de la siguiente manera:
// Declarar wxVariantData para el tipo de datos Foo
class wxVariantDataFoo: public wxVariantData
{
public:
// interfaz
// ...
DECLARE_WXANY_CONVERSION()
protected:
// almacenamiento de datos, etc.
// ...
};
IMPLEMENT_TRIVIAL_WXANY_CONVERSION(Foo, wxVariantDataFoo)
Funciones miembro
wxVariant()
wxVariant::wxVariant()
Constructor predeterminado.
wxVariant()
wxVariant::wxVariant( wxVariantData * data, const wxString & name = wxEmptyString )
Construye una variante directamente con un objeto wxVariantData.
wxVariant tomará posesión del wxVariantData y no aumentará su recuento de referencias.
wxVariant()
wxVariant::wxVariant(const wxVariant & variant)
Construye una variante a partir de otra variante aumentando el recuento de referencias.
wxVariant()
wxVariant()
Construye una variante a partir de una cadena literal amplia.
wxVariant()
Construye una variante a partir de una cadena.
wxVariant()
Construye una variante a partir de un carácter ancho.
wxVariant()
wxVariant::wxVariant( long value, const wxString & name = wxEmptyString )
Construye una variante a partir de un long.
wxVariant()
wxVariant::wxVariant( bool value, const wxString & name = wxEmptyString )
Construye una variante a partir de un valor booleano.
wxVariant()
wxVariant::wxVariant( double value, const wxString & name = wxEmptyString )
Construye una variante a partir de un doble.
wxVariant()
wxVariant::wxVariant( wxLongLong value, const wxString & name = wxEmptyString )
Construye una variante a partir de un wxLongLong.
wxVariant()
xVariant::wxVariant( wxULongLong value, const wxString & name = wxEmptyString )
Construye una variante a partir de un wxULongLong.
wxVariant()
wxVariant::wxVariant( const wxVariantList & value, const wxString & name = wxEmptyString )
Construye una variante a partir de una lista de variantes.
wxVariant()
wxVariant::wxVariant( void * value, const wxString & name = wxEmptyString )
Construye una variante a partir de un puntero nulo.
wxVariant()
Construye una variante a partir de un puntero a una clase derivada de wxObject.
wxVariant()
wxVariant::wxVariant( const wxDateTime & val, const wxString & name = wxEmptyString )
Construye una variante a partir de un wxDateTime.
wxVariant()
wxVariant::wxVariant( const wxArrayString & val, const wxString & name = wxEmptyString )
Construye una variante a partir de un wxArrayString.
~wxVariant()
virtual wxVariant::~wxVariant()
Destructor.
Nota: El destructor de wxVariantData está protegido, por lo que normalmente no se puede eliminar wxVariantData. En su lugar, se debe llamar a wxVariantData::DecRef(). Para obtener más información, consulte Destrucción de objetos con recuento de referencias.
Append()
void wxVariant::Append(const wxVariant & value)
Añade un valor a la lista.
Clear()
void wxVariant::Clear()
Establece la variante en nula eliminando los datos internos y asignándole el nombre wxEmptyString.
ClearList()
void wxVariant::ClearList()
Elimina el contenido de la lista.
Convert()
bool wxVariant::Convert(bool * value) const
Recupera y convierte el valor de esta variante al tipo al que pertenece dicho valor.
Convert()
bool wxVariant::Convert(double * value) const
Recupera y convierte el valor de esta variante al tipo al que pertenece dicho valor.
Convert()
bool wxVariant::Convert(long * value) const
Recupera y convierte el valor de esta variante al tipo al que pertenece dicho valor.
Convert()
bool wxVariant::Convert(wxChar * value) const
Recupera y convierte el valor de esta variante al tipo al que pertenece dicho valor.
Convert()
bool wxVariant::Convert(wxDateTime * value) const
Recupera y convierte el valor de esta variante al tipo al que pertenece dicho valor.
Convert()
bool wxVariant::Convert(wxLongLong * value) const
Recupera y convierte el valor de esta variante al tipo al que pertenece dicho valor.
Convert()
bool wxVariant::Convert(wxString * value) const
Recupera y convierte el valor de esta variante al tipo al que pertenece dicho valor.
Convert()
bool wxVariant::Convert(wxULongLong * value) const
Recupera y convierte el valor de esta variante al tipo al que pertenece dicho valor.
Delete()
bool wxVariant::Delete(size_t item)
Elimina el elemento con índice cero de la lista.
GetAny()
GetArrayString()
wxArrayString wxVariant::GetArrayString() const
Devuelve el valor de la matriz de cadenas.
GetBool()
bool wxVariant::GetBool() const
Devuelve el valor booleano.
GetChar()
wxUniChar wxVariant::GetChar() const
Devuelve el valor del carácter.
GetCount()
size_t wxVariant::GetCount() const
Devuelve el número de elementos de la lista.
GetData()
wxVariantData* wxVariant::GetData() const
Devuelve un puntero a los datos internos de la variante.
Para tomar posesión de estos datos, se debe llamar a su método wxVariantData::IncRef(). Cuando deje de utilizarlos, también debe llamar a wxVariantData::DecRef().
GetDateTime()
wxDateTime wxVariant::GetDateTime() const
Devuelve el valor de la fecha.
GetDouble()
double wxVariant::GetDouble() const
Devuelve el valor de punto flotante.
GetList()
wxVariantList& wxVariant::GetList() const
Devuelve una referencia a la clase wxVariantList utilizada por wxVariant si esta wxVariant es actualmente una lista de variantes.
GetLong()
long wxVariant::GetLong() const
Devuelve el valor entero.
GetLongLong()
wxLongLong wxVariant::GetLongLong() const
Devuelve el valor entero de 64 bits con signo.
GetName()
const wxString& wxVariant::GetName() const
Devuelve una referencia constante al nombre de la variante.
GetString()
wxString wxVariant::GetString() const
Obtiene el valor de la cadena.
GetType()
wxString wxVariant::GetType() const
Devuelve el tipo de valor como una cadena.
Los tipos integrados son:
- "bool"
- "char"
- "datetime"
- "double"
- "list"
- "long"
- "longlong"
- "string"
- "ulonglong"
- "arrstring"
- "void*"
Si la variante es nula, el tipo de valor devuelto es la cadena "null" (no la cadena vacía).
GetULongLong()
wxULongLong wxVariant::GetULongLong() const
Devuelve el valor entero sin signo de 64 bits.
GetVoidPtr()
void* wxVariant::GetVoidPtr() const
Obtiene el valor del puntero nulo.
Hay que tener en cuenta que este método se puede utilizar para objetos nulos (es decir, aquellos para los que IsNull() devuelve true) y devolverá nullptr para ellos.
GetWxObjectPtr()
Insert()
void wxVariant::Insert(const wxVariant & value)
Inserta un valor al principio de la lista.
IsNull()
bool wxVariant::IsNull() const
Devuelve verdadero si no hay datos asociados con esta variante, falso si hay datos.
IsType()
bool wxVariant::IsType(const wxString & type) const
Devuelve verdadero si el tipo coincide con el tipo de la variante, falso en caso contrario.
IsValueKindOf()
bool wxVariant::IsValueKindOf(const wxClassInfo * type) const
Devuelve verdadero si los datos se derivan de la clase descrita por el tipo, falso en caso contrario.
MakeNull()
void wxVariant::MakeNull()
Establece la variante como nula eliminando los datos internos.
MakeString()
wxString wxVariant::MakeString() const
Crea una representación de cadena del valor variante (para cualquier tipo).
Member()
bool wxVariant::Member(const wxVariant & value) const
Devuelve verdadero si el valor coincide con un elemento de la lista.
NullList()
void wxVariant::NullList()
Crea una lista vacía.
Esto difiere de una variante nula que no tiene datos; una lista nula es de tipo lista, pero el número de elementos de la lista es cero.
SetData()
void wxVariant::SetData(wxVariantData * data)
Establece los datos de la variante interna, eliminando los datos existentes si los hay.
Unshare()
bool wxVariant::Unshare()
Asegura que ningún dato asociado con esta variante se comparta con otras variantes.
Para que esto funcione, se debe implementar wxVariantData::Clone() para los tipos de datos con los que se está trabajando. wxVariantData::Clone() está implementado para todos los tipos de datos predeterminados.
Operadores miembro
operatordouble()
double wxVariant::operator double() const
Operadores para la conversión implícita, utilizando la función miembro getter adecuada.
operatorlong()
long wxVariant::operator long() const
Operadores para la conversión implícita, utilizando la función miembro getter adecuada.
operatorvoid*()
void* wxVariant::operator void *() const
Operador para la conversión implícita a un puntero a un void, utilizando GetVoidPtr().
operatorwxChar()
char wxVariant::operator wxChar() const
operatorwxDateTime()
void* wxVariant::operator wxDateTime() const
Operador para la conversión implícita a un puntero a wxDateTime, utilizando GetDateTime().
operatorwxLongLong()
wxLongLong wxVariant::operator wxLongLong() const
Operadores para la conversión implícita, utilizando la función miembro getter adecuada.
operatorwxString()
wxString wxVariant::operator wxString() const
Operador para la conversión implícita a una cadena, utilizando MakeString().
operatorwxULongLong()
wxULongLong wxVariant::operator wxULongLong() const
Operadores para la conversión implícita, utilizando la función miembro getter adecuada.
operator!=()
bool wxVariant::operator!=(bool value) const
Operador de prueba de desigualdad.
operator!=()
bool wxVariant::operator!=(const wxArrayString & value) const
Operador de prueba de desigualdad.
operator!=()
bool wxVariant::operator!=(const wxChar * value) const
Operador de prueba de desigualdad.
operator!=()
bool wxVariant::operator!=(const wxDateTime & value) const
Operador de prueba de desigualdad.
operator!=()
bool wxVariant::operator!=(const wxString & value) const
Operador de prueba de desigualdad.
operator!=()
bool wxVariant::operator!=(const wxVariant & value) const
Operador de prueba de desigualdad.
operator!=()
bool wxVariant::operator!=(const wxVariantList & value) const
Operador de prueba de desigualdad.
operator!=()
bool wxVariant::operator!=(double value) const
Operador de prueba de desigualdad.
operator!=()
bool wxVariant::operator!=(long value) const
Operador de prueba de desigualdad.
operator!=()
bool wxVariant::operator!=(void * value) const
Operador de prueba de desigualdad.
operator!=()
bool wxVariant::operator!=(wxChar value) const
Operador de prueba de desigualdad.
operator!=()
bool wxVariant::operator!=(wxLongLong value) const
Operador de prueba de desigualdad.
operator!=()
bool wxVariant::operator!=(wxObject * value) const
Operador de prueba de desigualdad.
operator!=()
bool wxVariant::operator!=(wxULongLong value) const
Operador de prueba de desigualdad.
operator=()
void wxVariant::operator=(bool value)
Operador de asignación, utilizando el recuento de referencias si es posible.
operator=()
void wxVariant::operator=(const wxArrayString & value)
Operador de asignación, utilizando el recuento de referencias si es posible.
operator=()
void wxVariant::operator=(const wxChar * value)
Operador de asignación, utilizando el recuento de referencias si es posible.
operator=()
void wxVariant::operator=(const wxDateTime & value)
Operador de asignación, utilizando el recuento de referencias si es posible.
operator=()
void wxVariant::operator=(const wxString & value)
Operador de asignación, utilizando el recuento de referencias si es posible.
operator=()
void wxVariant::operator=(const wxVariant & value)
Operador de asignación, utilizando el recuento de referencias si es posible.
operator=()
void wxVariant::operator=(const wxVariantList & value)
Operador de asignación, utilizando el recuento de referencias si es posible.
operator=()
void wxVariant::operator=(double value)
Operador de asignación, utilizando el recuento de referencias si es posible.
operator=()
void wxVariant::operator=(long value)
Operador de asignación, utilizando el recuento de referencias si es posible.
operator=()
void wxVariant::operator=(void * value)
Operador de asignación, utilizando el recuento de referencias si es posible.
operator=()
void wxVariant::operator=(wxChar value)
Operador de asignación, utilizando el recuento de referencias si es posible.
operator=()
bool wxVariant::operator=(wxLongLong value) const
Operador de asignación, utilizando el recuento de referencias si es posible.
operator=()
void wxVariant::operator=(wxObject * value)
Operador de asignación, utilizando el recuento de referencias si es posible.
operator=()
bool wxVariant::operator=(wxULongLong value) const
Operador de asignación, utilizando el recuento de referencias si es posible.
operator=()
void wxVariant::operator=(wxVariantData * value)
Operador de asignación, utilizando el recuento de referencias si es posible.
operator==()
bool wxVariant::operator==(bool value) const
Operador de prueba de igualdad.
operator==()
bool wxVariant::operator==(const wxArrayString & value) const
Operador de prueba de igualdad.
operator==()
bool wxVariant::operator==(const wxChar * value) const
Operador de prueba de igualdad.
operator==()
bool wxVariant::operator==(const wxDateTime & value) const
Operador de prueba de igualdad.
operator==()
bool wxVariant::operator==(const wxString & value) const
Operador de prueba de igualdad.
operator==()
bool wxVariant::operator==(const wxVariant & value) const
Operador de prueba de igualdad.
operator==()
bool wxVariant::operator==(const wxVariantList & value) const
Operador de prueba de igualdad.
operator==()
bool wxVariant::operator==(double value) const
Operador de prueba de igualdad.
operator==()
bool wxVariant::operator==(long value) const
Operador de prueba de igualdad.
operator==()
bool wxVariant::operator==(void * value) const
Operador de prueba de igualdad.
operator==()
bool wxVariant::operator==(wxChar value) const
Operador de prueba de igualdad.
operator==()
bool wxVariant::operator==(wxLongLong value) const
Operador de prueba de igualdad.
operator==()
bool wxVariant::operator==(wxObject * value) const
Operador de prueba de igualdad.
operator==()
bool wxVariant::operator==(wxULongLong value) const
Operador de prueba de igualdad.
operator[]()
wxVariant& wxVariant::operator[](size_t idx)
Devuelve una referencia al valor en idx (basado en cero).
Esto se puede utilizar para cambiar el valor en este índice.
operator[]()
wxVariant wxVariant::operator[](size_t idx) const
Devuelve el valor en idx (basado en cero).
Métodos y datos heredados
Esta clase hereda los métodos y datos miembro públicos y protegidos de wxObject.