Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-01-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Violación en ejecución

Para una aplicación en BCB 6 con una BB.DD. en Firebird tengo el formulario de la imagen.

Los botones señalados con una flechita son, como es evidente, ayudas del campo adjunto. Al pulsar sobre los botones señalados se despliega bajo el campo correspondiente una ayuda similar a la que se muestra con la información correspondiente. La misma se puede seleccionar (o esa es la idea) bien haciendo doble click sobre el valor bien pulsando la tecla Enter una vez seleccioando el valor.

Para dsplegar la ayuda uso un TListBox que está definido en el .h del formulario, al igual que los eventos asociados, y que despliego así:
Código PHP:
void __fastcall TfPersona::BotAyu(TObject *Sender)
{
     
POINT P1, P2;
     
TBitBtn *Boton;
    
TComponent *Source;
     
TNotifyEvent OnExit_;

    for (
nItem = 0; nItem < this->ComponentCount; nItem ++)
     {
          
Source = this->FindComponent("AyuLis");
          if (
Source != NULL)
               return;
     }

    for (
nItem = 0; nItem < this->ComponentCount; nItem ++)
     {
        
Source = this->Components[nItem];
          if (!
Source->ClassNameIs("TBitBtn"))
               continue;

          
Boton = static_cast<TBitBtn *>(Source);
          
Boton->OnClick = NULL;
     }

     
Boton = dynamic_cast<TBitBtn *>(Sender);
    for (
nItem = 0; nItem < this->ComponentCount; nItem ++)
     {
          
Source = this->FindComponent(Boton->Name.SubString(2, Boton->Name.Length()));
          if (
Source != NULL)
               if (
Source->ClassNameIs("TEdit") || Source->ClassNameIs("TLabeledEdit"))
               {
                    
AyuEdit = static_cast<TCustomEdit *>(Source);
                    if (
Source->Name == "Afiliacion")
                         
Afiliacion->OnExit = NULL;
                    else if (
Source->Name == "ForPago")
                         
ForPago->OnExit = NULL;
                    else if (
Source->Name == "Iban")
                         
Iban->OnExit = NULL;
                    else if (
Source->Name == "Junta")
                         
Junta->OnExit = NULL;
                    else if (
Source->Name == "Pais")
                         
Pais->OnExit = NULL;
                    else if (
Source->Name == "PerPago")
                         
PerPago->OnExit = NULL;
                    else if (
Source->Name == "Profesion")
                         
Profesion->OnExit = NULL;
                    else if (
Source->Name == "Provincia")
                         
Provincia->OnExit = NULL;
                    else if (
Source->Name == "Situacion")
                         
Situacion->OnExit = NULL;
                    break;
               }
     }

     if (
Source == NULL)
          return;

     
P1.x = AyuEdit->Left;
     
P1.y = AyuEdit->Top;
     
P2   = this->ScreenToClient(AyuEdit->Parent->ClientToScreen(P1));

     
Query->Close();

     
AyuLis              = new TListBox(this);
     
AyuLis->Name        = "AyuLis";
     
AyuLis->Parent      = this;
     
AyuLis->BevelInner  = bvNone;
     
AyuLis->BevelKind   = bkFlat;
     
AyuLis->BevelOuter  = bvLowered;
     
AyuLis->BorderStyle = bsNone;
     if (
AyuEdit->Name == "Situacion" || AyuEdit->Name == "ForPago" || AyuEdit->Name == "PerPago")
     {
          
AyuLis->Height = 4 * AyuLis->ItemHeight;

          
Query->SQL->Text = "SELECT Literal FROM Instalacion WHERE Etiqueta = :Etiqueta ORDER BY Literal";
          
Query->ParamByName("Etiqueta")->AsString = AyuEdit->Name;
     }
     else
     {
          if (
AyuEdit->Name == "Afiliacion")
               
AyuLis->Height = 4 * AyuLis->ItemHeight;
          else
               
AyuLis->Height = 10 * AyuLis->ItemHeight;

          
Query->SQL->Text = "SELECT Nombre";
          if (
AyuEdit->Name == "Iban")
               
Query->SQL->Text = "SELECT Nombre||' ('||Codigo||')' FROM Bancos";
          else
               
Query->SQL->Text = "SELECT Nombre FROM " + AyuEdit->Name;
          if (
AyuEdit->Name != "Iban" && AyuEdit->Name != "Pais" && AyuEdit->Name != "Provincia")
               
Query->SQL->Add("WHERE CodPrv = (SELECT Literal FROM Instalacion WHERE Etiqueta = 'Provincia')");
          
Query->SQL->Add("ORDER BY Nombre, Codigo");
     }
     
AyuLis->Left       = P2.x;
     
AyuLis->Top        = P2.y + AyuEdit->Height;
     
AyuLis->Width      = AyuEdit->Width + Boton->Width;
     
AyuLis->OnDblClick = AyuLisClick;
     
AyuLis->OnKeyPress = AyuLisKeyPress;

     
Query->Open();
     
AyuLis->Items->Clear();
     for (; !
Query->Eof; Query->Next())
          
AyuLis->Items->Add(Query->Fields->FieldByNumber(1)->AsString);
     
AyuLis->Visible = true;
     
AyuLis->SetFocus();

     if (
Source->Name == "Afiliacion")
          
Afiliacion->OnExit = AfiliacionExit;
     else if (
Source->Name == "ForPago")
          
ForPago->OnExit = SituacionExit;
     else if (
Source->Name == "Iban")
          
Iban->OnExit = IbanExit;
     else if (
Source->Name == "Junta")
          
Junta->OnExit = JuntaExit;
     else if (
Source->Name == "Pais")
          
Pais->OnExit = PaisExit;
     else if (
Source->Name == "PerPago")
          
PerPago->OnExit = SituacionExit;
     else if (
Source->Name == "Profesion")
          
Profesion->OnExit = ProfesionExit;
     else if (
Source->Name == "Provincia")
          
Provincia->OnExit = ProvinciaExit;
     else if (
Source->Name == "Situacion")
          
Situacion->OnExit = SituacionExit;
}
//--------------------------------------------------------------------------- 
En los dos eventos asociados al TListBox (OnDblClick y OnKeyPress) tengo este codigo:
Código PHP:
void __fastcall TfPersona::AyuLisClick(TObject *Sender)
{
     
TBitBtn *Boton;
    
TComponent *Source;

     if (
AyuLis->ItemIndex < 0)
          return;

     
cAux = AyuLis->Items->Strings[AyuLis->ItemIndex];
     if (
AyuEdit->Name == "Iban")
     {
          
NomBan->Text      = cAux.SubString(1, cAux.Pos("(") - 1).Trim();
          
AyuEdit->Text     = cAux.SubString(cAux.Pos("(") + 1, 4);
          
AyuEdit->SelStart = 5;
     }
     else
     {
          
AyuEdit->Text = cAux;
          
Query->Close();
          if (
AyuEdit->Name == "ForPago" || AyuEdit->Name == "PerPago" || AyuEdit->Name == "Situacion")
          {
               
Query->SQL->Text = "SELECT Valor FROM Instalacion WHERE Etiqueta = :Etiqueta AND Literal = :Literal";
               
Query->ParamByName("Etiqueta")->AsString = AyuEdit->Name;
               
Query->ParamByName("Literal")->AsString  = AyuEdit->Text;
          }
          else
          {
               
Query->SQL->Text = "SELECT Codigo FROM " + AyuEdit->Name + " WHERE Nombre = :Nombre";
               if (
AyuEdit->Name != "Provincia" && AyuEdit->Name != "Pais")
                    
Query->SQL->Add("AND CodPrv = (SELECT Literal FROM Instalacion WHERE Etiqueta = 'Provincia')");
               
Query->ParamByName("Nombre")->AsString  = AyuEdit->Text;
          }
          
Query->Open();
          if (
AyuEdit->Name == "Pais")
               
AyuEdit->Tag = 100 *  Query->Fields->FieldByNumber(1)->AsString.c_str()[0] +  Query->Fields->FieldByNumber(1)->AsString.c_str()[1];
          else
               
AyuEdit->Tag = Query->Fields->FieldByNumber(1)->AsInteger;
     }

     for (
nItem = 0; nItem < this->ComponentCount; nItem ++)
          if (
this->Components[nItem]->ClassNameIs("TListBox") && this->Components[nItem]->Name == "AyuLis")
          {
               
delete AyuLis;
               break;
          }

     for (
nItem = 0; nItem < this->ComponentCount; nItem ++)
     {
          
Source = this->Components[nItem];
          if (!
Source->ClassNameIs("TBitBtn"))
               continue;

          
Boton = static_cast<TBitBtn *>(Source);
          if (
Boton->OnClick == NULL)
          {
               if (
Boton->Name == "aPoblacion")
                    
Boton->OnClick = aPoblacionClick;
               else if (
Boton->Name == "Button1")
                    
Boton->OnClick = Button1Click;
               else
                    
Boton->OnClick = BotAyu;
          }
     }
     
AyuEdit->SetFocus();
}
//--------------------------------------------------------------------------- 
Se ejecuta bien, selecciona el valor indicado y todo pero al seleccionar el valor deseado en la ayuda en algunos campos me da un mensaje de error:

Si le doy al botón de aceptar continúa la ejecución sin ningún problema pero ya no sé dónde buscar que está provocando este error. He tratado de seguirle la pista con el depurador ejecutando línea a línea, pero en algún sitio se me pierde o me pierdo yo .

Se admite cualquier sugerencia. Si alguno quiere ayudarme puedo enviarle el código y la base de datos asociada (evidentemente capada).
Responder Con Cita
  #2  
Antiguo 26-01-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 18
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Haz probado la depuracion usando los debug dcu? Para C++ parece que necesitas estos pasos aunque nunca lo he probado

De esta manera, le indicas al compilador que utilice la VCL en modo "debug" en lugar de "release", y te permite llegar mas a fondo dentro del codigo fuente. Salvo es raras condiciones (API externas, mal-uso de frameworks, abuso de reference counting, threads) los Access Violation son relativamente faciles de cazar y el depurador siempre ayuda muchisimo

Sino la otra forma es ir poniendo "ShowMessage" a medida que vas avanzando asi ves "hasta donde llega el codigo" y poder localizar el lugar donde falla

Mirarlo a simple vista es muy complicado porque el codigo es demasiado largo y muy complejo para los meros mortales
Responder Con Cita
  #3  
Antiguo 27-01-2017
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.473
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Si ejecutas paso a paso, aunque no llegues a la línea exacta, pero tal vez si llegues a la línea que provoca el error.
A veces es una línea que provoca el "salto" de un evento asociado. Si consigues saber la línea que se ejecuta antes de provocar el error, puedes buscar eventos asociados.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Violación en ejecución Angel.Matilla C++ Builder 1 14-10-2016 13:24:29
Violacion de acceso Willo Varios 1 07-11-2011 00:15:19
Violacion De Acceso elguille Varios 2 17-10-2005 16:32:56
Violacion en FreeReport brandolin Impresión 0 27-08-2004 18:29:55
violacion en picklist !!! Lepe Varios 0 13-09-2003 18:22:12


La franja horaria es GMT +2. Ahora son las 00:05:19.


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