![]() |
![]() |
| 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
|
|||
|
|||
|
Solucionado
Gracias Neftalí.
En ocasiones, la vía más fácil es preguntar a quienes tienen más experiencia en determinado tema. Por eso acudo a este foro del cual soy miembro desde hace algún tiempo. Es muy cierto que los componentes que uso no soportan UTF8. Me puse a rebuscar en la ayuda del c++builder6 y existen varias funciones de conversión dentro de la categoría character set conversions y encontré una: UTF8Decode, la cual hace el trabajito de conventir de UTF8 a AnsiString pero me apareció otro problema, y es que al convertir a AnsiString el resultado lo guardo en un ComboBox, que antes, en su evento OnChange usaba el texto seleccionado para otra consulta, y ahora no funciona, porque la consulta no devuelve resultados para un Texto AnsiString en una tabla codificada con UTF8. Por suerte también existe UTF8Encode. Entonces aunque parezca una tarea medieval: decodifico el resultado de una consulta para llenar mi 1er ComboBox, y luego el texto seleccionado lo codifico para usarlo en otra consulta, que me devolverá un resultado que deberé decodificar nuevamente para llenar el 2do ComboBox. El 1er ComboBox se llena con los nombres de las provincias de mi país (algunas tienen tildes y diérisis) y al seleccionar una provincia, en el 2do ComboBox aparecen los municipios de esa provincia como resultado de una consulta. (Usando tablas relacionadas obviamente). Actualmente estoy investigando como Decodificar el contenido de mi DBGrid, con su DataSet buscando alguna propiedad que sea String para poder usar UTF8Decode. Una vez más Gracias. |
|
#2
|
|||
|
|||
|
a ver si te sirve este codigo para convertir el AnsiString
Código:
#include <windows.h>
AnsiString AnsiToUTF8(const AnsiString &ansiStr)
{
// Paso 1: Convertir AnsiString a WideString (UTF-16)
WideString wideStr = WideString(ansiStr);
// Paso 2: Calcular el tamaño necesario para la cadena UTF-8
int utf8Len = WideCharToMultiByte(CP_UTF8, 0, wideStr.c_bstr(), -1, NULL, 0, NULL, NULL);
// Paso 3: Asignar un buffer para almacenar la cadena UTF-8
char *utf8Str = new char[utf8Len];
// Paso 4: Convertir la WideString (UTF-16) a UTF-8
WideCharToMultiByte(CP_UTF8, 0, wideStr.c_bstr(), -1, utf8Str, utf8Len, NULL, NULL);
// Convertir el buffer de UTF-8 a AnsiString y liberar el buffer
AnsiString result = utf8Str;
delete[] utf8Str;
return result;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString original = "Hola, mundo! ñáéíóú";
AnsiString utf8Str = AnsiToUTF8(original);
ShowMessage(utf8Str); // Muestra la cadena convertida a UTF-8
}
|
|
#3
|
|||
|
|||
|
Gracias, pero debe ser lo contrario, convertir de UTF8 a AnsiString porque mis componentes no soportan UTF8 en su Charset de su tipo de letra.
Encontré una solución pírrica con UTF8Decode y UTF8Encode para los ComboBox, pero todavía no lo he logrado con el DBGrid. Cómo puedo insertar una imágen aquí? tengo una en una carpeta de mi pc pero al poner la ruta, me sale un icono de una imagen rota, como que no la encuentra. |
|
#4
|
|||
|
|||
|
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. |
|
#5
|
|||
|
|||
|
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.
|
|
#6
|
||||
|
||||
|
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. |
|
#7
|
|||
|
|||
|
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. |
![]() |
| 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 |
|