Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-05-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Unhappy Función no existe (Call of nonfunction)

Tengo un formulario en un proyecto en BCB 6 con esto:
Código:
#include <vcl.h>
#pragma hdrstop

#include "MenInt.h"
#include "Persona.h"
//---------------------------------------------------------------------------

#pragma package(smart_init)
#pragma resource "*.dfm"
TfMenInt *fMenInt;

extern AnsiString cAux, NombreUser;
extern bool lPrueba;
extern int LinEje;
extern TDateTime dFecha;
extern TListItem *pItem;
extern TReplaceFlags oReplace;

extern void ColorForm(TForm *Form);
extern int Mensaje(int Icono, AnsiString Mensaje, AnsiString Botones);
He destacado una función, que uso absolutamente en todos los formularios del proyecto (58 en total) y en todos ellos está declarada exactamente igual como es lógico.

También en todos la uso exactamente de la misma forma; en este formulario la primera vez que la llamo lo hecho así:
Código:
fPersona->Query->Close();
fPersona->Query->SQL->Text = "INSERT INTO Correo (Remite, Destino, Hora, Asunto, Mensaje, Leido) VALUES (:Remite, :Destino, :Hora, :Asunto, :Mensaje, 0)";
fPersona->Query->ParamByName("Remite")->AsString  = NombreUser;
fPersona->Query->ParamByName("Hora")->AsDateTime  = Now();
fPersona->Query->ParamByName("Asunto")->AsString  = Asunto->Text;
fPersona->Query->ParamByName("Mensaje")->AsString = Mensaje->Text;

if (Usuarios->Visible)
{
     lPrueba = false;
     for (nItem = 0; nItem < Usuarios->Items->Count; nItem ++)
          if (Usuarios->Items->Item[nItem]->Checked)
          {
               lPrueba = true;
               try
               {
                    fPersona->Query->Close();
                    fPersona->Query->ParamByName("Destino")->AsString  = Usuarios->Items->Item[nItem]->SubItems->Strings[0];
                    fPersona->Query->ExecSQL();
                    fPersona->Query->Transaction->Commit();
               }
               catch(...)
               {
                    fPersona->Query->Transaction->Rollback();
               }
          }

     if (!lPrueba)
     {
          Mensaje(3, "No ha seleccionado ningún destinatario.", "Volver");     // <---- AQUÍ DA EL ERROR EL COMPILADOR
          return;
     }
}
Pero a la hora de compilar me está dando un error E2314 Call of nonfunction en esa llamada. Y estoy totalmente perdido sobre los motivos ya que SIEMPRE lo hago igual.
Responder Con Cita
  #2  
Antiguo 09-05-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Voy más allá. He probado a compilar el formulario poniendo esa llamada en diversos sitios del código, por si fuera un problema de escritura y no lo hubiera detectado; Ponga donde ponga esa línea me da el mismo error.
Responder Con Cita
  #3  
Antiguo 09-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Angel.

Revisa que no exista una variable, posterior a la declaración de función, con el nombre "Mensaje" cuyo ámbito alcance al bloque de código donde se genera el error.

Un ejemplo que provocará el error que mencionas:
Código PHP:
...
{
  
int abcMensaje;
  ...

  
Mensaje(3"No ha seleccionado ningún destinatario.""Volver");

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 09-05-2017 a las 23:57:18.
Responder Con Cita
  #4  
Antiguo 10-05-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola Angel.

Revisa que no exista una variable, posterior a la declaración de función, con el nombre "Mensaje" cuyo ámbito alcance al bloque de código donde se genera el error.
Gracias por la respuesta. No es el caso; el código está tal cual y no hay ninguna declaración adicional. Como esa función la uso en muchísimos sitios ya tengo cuidado con las declaraciones que hay en la aplicación.
Responder Con Cita
  #5  
Antiguo 11-05-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Bueno: Me dieron la solución los amigos de otro foro. El problema venía porque en el query uno de los parámetros se llama igual que la función. La solución fue hacer referencia a la función global.
Código:
if (Usuarios->Visible)
{
     lPrueba = false;
     [...]

     if (!lPrueba)
     {
          ::Mensaje(3, "No ha seleccionado ningún destinatario.", "Volver");
          return;
     }
}
Responder Con Cita
  #6  
Antiguo 11-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por Angel.Matilla Ver Mensaje
Gracias por la respuesta. No es el caso; el código está tal cual y no hay ninguna declaración adicional.
En realidad si había una, la del parámetro.

Cita:
Empezado por Angel.Matilla Ver Mensaje
Bueno: Me dieron la solución los amigos de otro foro. El problema venía porque en el query uno de los parámetros se llama igual que la función. La solución fue hacer referencia a la función global.
Otra alternativa es cambiar el nombre del parámetro que está ocasionando el conflicto.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 11-05-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Otra alternativa es cambiar el nombre del parámetro que está ocasionando el conflicto.
Lo probé. Cuando Leo me hizo la sugerencia es lo primero que probé, cambiar el nombre del parámetro, y seguía dando error.
Responder Con Cita
  #8  
Antiguo 11-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Quedé sorprendido sobre el echo de que un nombre de parámetro (encerrado entre comillas) pudiera dar conflicto con un nombre de función y para quitarme toda, duda reproduje tu código (tabla incluida).

El error se produce por el conflicto entre el nombre de una variable llamada Mensaje (supongo que es de tipo TEdit) precisamente en la línea:
Cita:
Empezado por Angel.Matilla Ver Mensaje
Código:
....
  fPersona->Query->ParamByName("Mensaje")->AsString = Mensaje->Text;
....
y la funcion llamada Mensaje.

Cambiando el nombre del Edit deja de dar el error:
Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
... 
   fPersona->Query->ParamByName("Mensaje")->AsString = MensajeNEW->Text; //(*)
 ...
}
(*) Cambiado el nombre, desaparece el error.


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 11-05-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Angel.Matilla Ver Mensaje
El problema venía porque en el query uno de los parámetros se llama igual que la función.
Hola,

Para que quienes consulten esto en las generaciones venideras no se confundan, creo que hace falta hacer hincapié en que el error original NO se debe al nombre del parámetro del Query. Se debe a la existencia de un objeto y una función con el mismo nombre en el mismo contexto.

LineComment Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Existe la funcion EVAL en Delphi darkone2k3 Varios 14 27-09-2013 22:38:19
Función nativa EnsureRange, ¿existe equivalente en Excel? Al González Varios 0 29-12-2011 03:04:08
Existe alguna función en Firebird que me permita restar fechas??? Nelly Varios 1 06-07-2007 22:27:56
Existe una funcion para...? famcd PHP 6 07-02-2006 13:18:07
existe en paradox la funcion IFF fjolivares SQL 1 21-09-2004 16:21:23


La franja horaria es GMT +2. Ahora son las 16:17:05.


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
Copyright 1996-2007 Club Delphi