es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

TStringGrid deja espacios en blanco en la última columna. ¿Por qué? ¿Cómo depurar?

Tengo un TStringGrid que se actualiza correctamente y DrawCell está dibujando correctamente. Luego, en la siguiente actualización, las celdas se actualizan correctamente, pero la última columna está en blanco. Para ayudar a la depuración, he agregado una rutina común para establecer los valores.

“`c++
void __fastcall TF3Frame::SetCell(String s, int Col, int Row)
{
static int Blank = 0;
if (s == L””)
s = Blank++;
CResults->Cells[ColIndex[Col]][Row] = s;
}


Esto reemplazará cualquier valor en blanco con un número en incremento. Funciona como se esperaba cuando no hay celdas en blanco, luego hago mi actualización y la última columna vuelve a estar en blanco. Para ser claro, cuando lo actualizo (siempre), hay datos en la celda. Pero cuando llega a `DrawCell`, la celda está en blanco después de la segunda actualización. Intenté establecer un punto de interrupción de datos, pero Delphi VCL está optimizado y no se pueden ver las variables. Incluso he intentado hacer una subclase de `TStringGrid` para limitar el acceso a la última columna, pero la clase de diseño de VCL no le gustó eso. He agotado todas las opciones que se me ocurren. ¿Hay alguna forma de agregar una devolución de llamada cuando se modifica una celda? ¿Alguna otra idea? Intentaré dar un código pseudocomentado de lo que está sucediendo. ```c++ Carga de la página realiza una búsqueda completa los valores en CResults(todo está bien) Evento onChange de TComboBox realiza una búsqueda completa los valores en CResults (todo está bien) TStringGrid DrawCell muestra los resultados si proviene de la carga de la página, CResults->Cells[<em>][4] tiene los valores correctos si proviene de TComboBox, CResults->Cells[</em>][4] es NULL La única diferencia que puedo ver es el evento que inicialmente completa los valores.
Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar relacionado con el orden de los eventos y cómo se actualizan los datos en la cuadrícula. Una sugerencia sería intentar utilizar el evento OnSetEditText de TStringGrid para detectar cuándo se está modificando una celda y realizar cualquier actualización necesaria en ese punto. A continuación se muestra un pseudocódigo para ilustrar:

    “`c++
    void __fastcall TF3Frame::StringGridSetEditText(TObject *Sender, int ACol, int ARow, const UnicodeString Value)
    {
    // Comprobar si la celda que se está modificando está en la última columna
    if (ACol == IndiceUltimaColumna)
    {
    // Realizar cualquier actualización necesaria aquí
    }
    }


    Otra idea sería intentar usar una estructura de datos o contenedor separado para hacer un seguimiento de los valores originales y compararlos con los valores actualizados en el evento `DrawCell`. Esto podría ayudar a identificar los cambios o discrepancias que ocurren entre las actualizaciones. ```c++ void __fastcall TF3Frame::StringGridDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { // Obtener el valor actual de la celda de CResults String valorCelda = CResults->Cells[ACol][ARow]; // Comprobar si este valor difiere del valor original if (valorCelda != ValoresCeldaOriginales[ACol][ARow]) { // Realizar cualquier actualización necesaria aquí } // Dibujar la celda como de costumbre }

    En general, puede requerir algo de experimentación y depuración para determinar la causa raíz del problema, pero espero que estas sugerencias puedan ayudarte a orientarte en la dirección correcta.

Comments are closed.