![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
|||
|
|||
|
sube la imagen aqui.... https://es.imgbb.com/
luego abres la pagina ahi donde sale la imagen en esa misma web y copias con el boton derecho el link (sobre la imagen) y lo pegas aqui dandole al icono de IMG de los iconos de arriba para hacer lo contrario (Convertir de UTF-8 a AnsiString) aqui tienes codigo que lo hace: Código:
#include <windows.h>
AnsiString UTF8ToAnsi(const AnsiString &utf8Str)
{
// Paso 1: Calcular el tamaño necesario para la cadena WideChar (UTF-16)
int wideLen = MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_str(), -1, NULL, 0);
// Paso 2: Asignar un buffer para almacenar la cadena WideChar (UTF-16)
wchar_t *wideStr = new wchar_t[wideLen];
// Paso 3: Convertir de UTF-8 a WideChar (UTF-16)
MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_str(), -1, wideStr, wideLen);
// Paso 4: Convertir la cadena WideChar (UTF-16) a AnsiString
AnsiString result = WideString(wideStr);
// Liberar el buffer temporal
delete[] wideStr;
return result;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString utf8Text = "Hola, mundo! ñáéíóú en UTF-8";
AnsiString ansiText = UTF8ToAnsi(utf8Text);
ShowMessage(ansiText); // Muestra la cadena convertida a AnsiString
}
El evento OnGetText de un TField es una excelente manera de convertir datos antes de que se muestren en el control visual. Aquí es donde puedes interceptar el texto en UTF-8, convertirlo a AnsiString, y luego mostrarlo en el DBGrid. Código:
void __fastcall TForm1::Query1NombreGetText(TField *Sender, AnsiString &Text, bool DisplayText)
{
// Obtener el valor original del campo como cadena UTF-8
AnsiString utf8Str = Sender->AsString;
// Convertir de UTF-8 a AnsiString
Text = UTF8ToAnsi(utf8Str);
}
Última edición por navbuoy fecha: 01-10-2024 a las 23:50:38. |
|
#2
|
|||
|
|||
|
Y cómo puedo acceder al TField de una consulta, o de mi DBGrid. Y al evento OnGetText?? No aparece en los eventos de mi zquery1, ni en mi DBGrid1. Eso está bastante abstracto.
|
|
#3
|
||||
|
||||
|
Las zeos sí están actualizadas para usar utf8
![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal Última edición por Casimiro Noteví fecha: 02-10-2024 a las 14:52:36. |
|
#4
|
|||
|
|||
|
En C++ Builder 6, para acceder a los campos de una fila específica en un DBGrid, puedes hacerlo a través del conjunto de datos (dataset) que está vinculado al DBGrid. El DBGrid está conectado a un TDataSource, el cual a su vez está vinculado a un TQuery, TTable, o cualquier otro componente de acceso a bases de datos. Los campos de los registros se gestionan mediante objetos TField.
Para acceder al valor de un campo desde el DBGrid, puedes seguir estos pasos: 1. Acceso directo a través de TQuery o TTable Si sabes qué campo específico deseas acceder, puedes utilizar el método FieldByName() o Fields[] del componente TQuery o TTable. Código:
AnsiString valorCampo = Query1->FieldByName("nombre_campo")->AsString;
2. Acceso desde el componente DBGrid El componente DBGrid no tiene acceso directo a los datos; sin embargo, puedes obtener los campos a través del conjunto de datos (DataSet) que está vinculado al TDataSource del DBGrid. Ejemplo Accediendo al Campo de la Fila Actual: Código:
void __fastcall TForm1::AccederCampoDesdeDBGrid()
{
// Obtener el conjunto de datos asociado al DBGrid
TDataSet *dataset = DBGrid1->DataSource->DataSet;
if (dataset->Active && !dataset->Eof)
{
// Obtener el valor del campo desde el dataset de la fila actual
AnsiString valorCampo = dataset->FieldByName("nombre_campo")->AsString;
ShowMessage("Valor del campo: " + valorCampo);
}
}
3. Acceso mediante SelectedField y SelectedRows Si deseas acceder al campo seleccionado en el DBGrid, puedes utilizar la propiedad SelectedField. Esto devuelve el campo de la columna actualmente seleccionada. Ejemplo usando SelectedField: Código:
void __fastcall TForm1::AccederCampoSeleccionado()
{
TField *campoSeleccionado = DBGrid1->SelectedField;
if (campoSeleccionado != NULL)
{
ShowMessage("Campo seleccionado: " + campoSeleccionado->FieldName +
"\nValor: " + campoSeleccionado->AsString);
}
else
{
ShowMessage("No hay ningún campo seleccionado.");
}
}
Si el DBGrid está en modo multiselección y deseas obtener datos de las filas seleccionadas, puedes iterar sobre las filas seleccionadas usando la propiedad SelectedRows. Ejemplo accediendo a campos de varias filas seleccionadas: Código:
void __fastcall TForm1::AccederCamposFilasSeleccionadas()
{
TDataSet *dataset = DBGrid1->DataSource->DataSet;
for (int i = 0; i < DBGrid1->SelectedRows->Count; i++)
{
// Ir a la fila seleccionada
dataset->GotoBookmark(DBGrid1->SelectedRows->Items[i]);
// Obtener el valor del campo en esa fila seleccionada
AnsiString valorCampo = dataset->FieldByName("nombre_campo")->AsString;
ShowMessage("Valor del campo en fila seleccionada: " + valorCampo);
}
}
Resumen: FieldByName(): Es la forma más común y directa de acceder a un campo por su nombre. DBGrid1->SelectedField: Para acceder al campo seleccionado en la columna actual. SelectedRows: Para acceder a campos de varias filas seleccionadas cuando el DBGrid está en modo multiselección. Con estos métodos, puedes acceder a los campos de un registro en un DBGrid y manejar los datos según sea necesario. |
|
#5
|
|||
|
|||
|
El Evento OnGetText en C++ Builder 6
En C++ Builder 6, el evento OnGetText sí existe para los objetos TField, pero no está disponible directamente en componentes como TQuery o TTable. Sin embargo, puedes usarlo a nivel de los campos individuales que forman parte del conjunto de datos.
El evento OnGetText se utiliza cuando necesitas personalizar la representación de un campo en un componente visual (por ejemplo, mostrar un formato especial o una conversión). Este evento es útil cuando necesitas modificar cómo se muestran los valores de un campo en controles como un DBGrid, sin modificar el valor subyacente en la base de datos. Cómo utilizar el evento OnGetText en C++ Builder 6 Pasos para usar OnGetText: Agrega los campos a tu conjunto de datos (ya sea un TQuery, TTable, o cualquier componente de acceso a datos). Esto puede hacerse de manera visual en tiempo de diseño o en código. Asigna el evento OnGetText a los campos específicos. Ejemplo paso a paso: Crear los campos del conjunto de datos: En el IDE de C++ Builder 6, selecciona tu componente TQuery o TTable. Haz clic derecho en el componente y selecciona "Fields Editor". En la ventana de Fields Editor, haz clic derecho y selecciona "Add all fields" para crear los campos asociados a las columnas de tu consulta. Asignar el evento OnGetText: Selecciona el campo en el Fields Editor. En el inspector de objetos, localiza el evento OnGetText y haz doble clic para generar el manejador del evento. Escribir el código en el manejador del evento OnGetText: En este manejador, puedes personalizar cómo se muestra el valor de este campo en los controles visuales. Ejemplo de Código: Imagina que tienes un campo numérico, pero quieres mostrarlo siempre con dos decimales en el DBGrid sin alterar su valor en la base de datos. Código:
void __fastcall TForm1::Query1NUMEROGetText(TField *Sender, AnsiString &Text, bool DisplayText)
{
if (!Sender->IsNull)
{
// Formatear el número con dos decimales
Text = FormatFloat("0.00", Sender->AsFloat);
}
else
{
// Si el campo es NULL, mostramos un texto vacío
Text = "";
}
El nombre de la función generada para el evento OnGetText no necesariamente tiene que seguir el nombre del campo o consulta. De hecho, puedes usar cualquier nombre válido para el manejador del evento, como OnGetText, o puedes seguir la convención de nombrarlo más específicamente para saber a qué campo corresponde (por ejemplo, Query1NUMEROGetText). El nombre TForm1::Query1NUMEROGetText en mi primer ejemplo fue solo una convención que hace referencia al campo NUMERO de la consulta Query1. Sin embargo, puedes cambiarlo por un nombre más general como TForm1::OnGetText, o cualquier otro nombre descriptivo. Ejemplo corregido: Si prefieres usar OnGetText como nombre del manejador, aquí tienes el código: Código:
void __fastcall TForm1::OnGetText(TField *Sender, AnsiString &Text, bool DisplayText)
{
if (!Sender->IsNull)
{
// Formatear el número con dos decimales
Text = FormatFloat("0.00", Sender->AsFloat);
}
else
{
// Si el campo es NULL, mostramos un texto vacío
Text = "";
}
}
En tiempo de diseño (usando el Fields Editor): Haz doble clic en el evento OnGetText del campo deseado en el Inspector de Objetos, y selecciona OnGetText (o el nombre que hayas definido). En tiempo de ejecución (si decides asignarlo manualmente): Código:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TFloatField *field = dynamic_cast<TFloatField*>(Query1->FieldByName("NUMERO"));
if (field != NULL)
{
field->OnGetText = OnGetText; // Asignando el manejador del evento
}
}
Resumen: El evento OnGetText está disponible a nivel de los campos individuales de un conjunto de datos. Puedes usarlo para personalizar la manera en que se muestra el valor de un campo en un control visual sin alterar el valor real en la base de datos. Necesitas definir los campos en el Fields Editor o en tiempo de ejecución para acceder a este evento. Última edición por navbuoy fecha: 02-10-2024 a las 16:42:53. |
|
#6
|
|||
|
|||
|
Problema solucionado!!!
Muchas gracias a todos por sus aportes Un fuerte abrazo desde Cuba |
|
#7
|
||||
|
||||
|
Cita:
![]() Nuestra guía de estilo alternativa (jocosa) ![]() Cita:
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Caracteres extraños en un Memo | Sr.Scorpion | Varios | 1 | 23-10-2008 19:54:59 |
| Caracteres extraños en un Memo | Sr.Scorpion | Varios | 6 | 23-10-2008 14:47:05 |
| Caracteres extraños (#$D#$A) | Iuconlas | Varios | 2 | 23-09-2005 17:09:05 |
| caracteres extraños en reportes | Tangela | Conexión con bases de datos | 0 | 21-01-2004 19:56:22 |
| Caracteres extraños | Germi | Conexión con bases de datos | 1 | 14-10-2003 15:26:18 |
|