Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Acceder a DisplayFormat en tiempo de Ejecución (https://www.clubdelphi.com/foros/showthread.php?t=76408)

Kalondro 30-10-2011 14:05:38

Acceder a DisplayFormat en tiempo de Ejecución
 
Buenas,

Estoy intentando acceder a la propiedad DisplayFormat sobre campos que se creen dinamicamente de la siguiente forma:

Código:

static_cast<TFloatField>(Temporal->FieldByName("Campo"))->DisplayFormat = "#,##0.00;;#";
Pero el compilador me da los siguientes errores

Código:

[BCC32 Error] Modulo1.cpp(358): E2459 VCL style classes must be constructed using operator new
[BCC32 Error] Modulo1.cpp(358): E2288 Pointer to structure required on left side of -> or ->*

¿ Estoy haciendo algo mal ?

Uso el Builder 2009

Un saludo.

ecfisa 30-10-2011 21:55:47

Hola Kalondro.

No sé con que BD estés trabajando pero te hago un ejemplo con la propiedad DisplayFormat sobre un campo calculado por si te sirve de ayuda:
Código:

...
{
  Temporal->Close();
  TFloatField *NewField = new TFloatField(Temporal);
  NewField->FieldName = "CAMPO";
  NewField->DataSet = Temporal;
  NewField->FieldKind = fkCalculated;
  NewField->DisplayFormat = "#,##0.00;;#";
  Temporal->Open();
  Temporal->Edit();
  Temporal->FieldByName("CAMPO")->Value = "33.255";
}

Un saludo.

Kalondro 30-10-2011 23:47:11

Hola ecfisa, gracias por la respuesta.

Uso tablas Paradox y las creo de la siguiente forma

Código:

#include <memory>
...
std::auto_ptr<TTable> Temporal1(new TTable(NULL));
Temporal1->DatabaseName = "";
Temporal1->TableType    = ttParadox;
Temporal1->TableName    = "TmpArticulos";
Temporal1->FieldDefs->Add("Contador",          ftAutoInc,  0, False);
Temporal1->FieldDefs->Add("Paso",              ftInteger,  0, False);
Temporal1->FieldDefs->Add("TipoPaso",          ftInteger,  0, False);
Temporal1->FieldDefs->Add("ReferenciaInterna", ftString,  20, False);
Temporal1->FieldDefs->Add("Referencia",        ftString,  20, False);
Temporal1->FieldDefs->Add("Denominacion",      ftString,  50, False);
Temporal1->FieldDefs->Add("TipoMaterial",      ftFloat,    0, False);
Temporal1->FieldDefs->Add("Lote",              ftFloat,    0, False);
Temporal1->FieldDefs->Add("Peso",              ftFloat,    0, False);
Temporal1->FieldDefs->Add("Unidades",          ftFloat,    0, False);
Temporal1->FieldDefs->Add("Almacen",          ftString,  10, False);
Temporal1->FieldDefs->Add("Seleccionado",      ftBoolean,  0, False);
Temporal1->IndexDefs->Add("", "Contador", TIndexOptions() << ixPrimary);
Temporal1->IndexDefs->Add("TmpReferencia", "ReferenciaInterna;Referencia", TIndexOptions() << ixCaseInsensitive);
Temporal1->CreateTable();

Esto me lo hace sin problemas y me la crea en el directorio del ejecutable.
Después asigno la tabla a un componente TTable de la siguiente manera.

Código:

tbTmpArticulos->DatabaseName = "";
tbTmpArticulos->TableName    = "TmpArticulos.db";
tbTmpArticulos->IndexName    = "TmpReferencia";
tbTmpArticulos->Active      = true;

Y por último más adelante es cuando quiero aplicar el DisplayFormat a cualquier campo del tipo Float de la siguiente manera

Código:

static_cast<TFloatField>(tbTmpArticulos->FieldByName("Lote"))->DisplayFormat = "#,##0.00;;#"
El ejemplo que has puesto tu (si no me equivoco) es para añadir un nuevo campo a una tabla ya creada, y lo he probado de la siguiente manera y no me funciona

Código:

TFloatField *NewField = new TFloatField(tbTmpArticulos->FieldByName("Peso"));
NewField->DisplayFormat = "#,##0.00;;#";

Un saludo.

escafandra 31-10-2011 00:11:56

prueba es cast de esta manera:
Código:

static_cast<TFloatField*>(tbTmpArticulos->FieldByName("Lote"))->DisplayFormat = "#,##0.00;;#"

Saludos.

Kalondro 31-10-2011 00:24:19

Muchas gracias escafandra.

Funciona perfectamente, un pequeño detalle (o no tan pequeño) que me estaba volviendo loco.

Muchas gracias a los dos.

ecfisa 31-10-2011 01:44:25

Hola Kalondro.
Cita:

El ejemplo que has puesto tu (si no me equivoco) es para añadir un nuevo campo a una tabla ya creada
Si así es, sinceramente no tenía en muy en claro entonces como era la situación.

Otra opción puede ser:
Código:

  ((TFloatField*)(tbTmpArticulos->FieldByName("Peso")))->DisplayFormat = "#,##0.00;;#";
Pero es mucho más aconsejable usar la sugerencia del amigo escafandra.


Un saludo.:)


La franja horaria es GMT +2. Ahora son las 21:07:47.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi