Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Función no existe (Call of nonfunction) (https://www.clubdelphi.com/foros/showthread.php?t=91830)

Angel.Matilla 09-05-2017 11:21:02

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.

Angel.Matilla 09-05-2017 17:33:47

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.

ecfisa 09-05-2017 20:26:19

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 :)

Angel.Matilla 10-05-2017 09:15:39

Cita:

Empezado por ecfisa (Mensaje 516459)
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.

Angel.Matilla 11-05-2017 12:00:49

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;
    }
}


ecfisa 11-05-2017 17:25:50

Hola.
Cita:

Empezado por Angel.Matilla (Mensaje 516484)
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 (Mensaje 516563)
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 :)

Angel.Matilla 11-05-2017 17:34:32

Cita:

Empezado por ecfisa (Mensaje 516574)
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.

ecfisa 11-05-2017 20:12:28

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 (Mensaje 516408)
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 :)

roman 11-05-2017 20:27:53

Cita:

Empezado por Angel.Matilla (Mensaje 516563)
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


La franja horaria es GMT +2. Ahora son las 08:44:03.

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