Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Error E2009 en evento de TWebBrowser : Parameter lists differ (https://www.clubdelphi.com/foros/showthread.php?t=88740)

(MAJ) 24-07-2015 23:55:53

Error E2009 en evento de TWebBrowser : Parameter lists differ
 
buenas muchachos, estoy haciendo una aplicación la cual lleva un webbrowser en tiempo de ejecución, pero al tratar de llamar un evento me da error de incompatibilidad.
Código Delphi [-]
procedure tform1.webbrowser1_completo(ASender: TObject; const pDisp: IDispatch; URL: OleVariant);
begin 
  //codigo 
end;  

procedure tform1.ejemplo1;
begin
   webbrowser1.ondocumentcomplete:=webbrowser1_completo;
 {aca es donde da el error: [DCC Error] eje.pas(x): E2009 Incompatible types: 'Parameter lists differ' }
end;


la verdad es que no tengo idea como pasar los parametros, intente todo lo que se me ocurrio y no logro hacerlo agarrar, si alguien puede darme una mano porque no se que hacer a estas alturas

ecfisa 25-07-2015 00:20:12

Hola (MAJ).

La verdad es, que de tu mensaje no me queda claro como es la situación ya que no llamas al evento sino que lo asignas. Pero en líneas generales no tendría que darte error.

Por ejemplo este código funciona correctamente:
Código Delphi [-]
...
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure WebBroserCompleto(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
  public
  end;

var
  Form1: TForm1;

implementation  {$R *.dfm}

uses  SHDocVw;

procedure TForm1.WebBroserCompleto(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  // ... codigo...
  ShowMessage('Documento completo');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  WB: TWebBrowser;
begin
  WB := TWebBrowser.Create(Self);
  WB.OnDocumentComplete := WebBroserCompleto;
  WB.ParentWindow := Handle;
  WB.Navigate('www.ClubDelphi.com');
  //...
end;

Saludos :)

AgustinOrtu 25-07-2015 00:35:25

Código Delphi [-]
procedure tform1.webbrowser1_completo(ASender: TObject; const pDisp: IDispatch; URL: OleVariant);
begin 
  //codigo 
end;

El parametro debe llamarse Sender no ASender

ecfisa 25-07-2015 01:15:15

Hola Agustin.
Cita:

Empezado por AgustinOrtu (Mensaje 494817)
...
El parametro debe llamarse Sender no ASender

Eso es cierto siempre que le haya dado el nombre Sender a dicho parámetro en la declaración del método webbrowser1_completo.

Saludos :)

AgustinOrtu 25-07-2015 23:50:25

Daniel,

El problema es que la clase TWebBrowser define su evento OnDocumentComplete asi:

Código Delphi [-]
  published
    property OnDocumentComplete: TWebBrowserDocumentComplete read FOnDocumentComplete write FOnDocumentComplete;
   ...

Y revisando el tipo TWebBrowserDocumentComplete tenemos esto:

Código Delphi [-]
  TWebBrowserDocumentComplete = procedure(ASender: TObject; const pDisp: IDispatch; 
                                                            var URL: OleVariant) of object;

Osea que no te queda otra que sea ASender :)

ecfisa 26-07-2015 00:49:36

Hola Agustín.

Yo me refería a que dá igual el nombre dado al parametro en la declaración, siempre que se corresponda con el de su definición.

Coincido con vos en que, si genera el evento en tiempo de diseño, el nombre del parámetro en la definición del método deberá ser Sender y no otro. Ya que es el nombre que Delphi le asignará por defecto al parámetro en la declaración.

Sin embargo este código,
Código Delphi [-]
..
type
  TForm1 = class(TForm)
   ...
  private
    procedure webbrowser1_completo(UngaBunga: TObject;
      const Maranga: IDispatch; var Turongo: OleVariant);
  public
    ...
  end;
...
implementation 

uses SHDocVw;

procedure TForm1.webbrowser1_completo(UngaBunga: TObject;
      const Maranga: IDispatch; var Turongo: OleVariant);
begin
  ShowMessage('Documento completo');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  WB: TWebBrowser;
begin
  WB := TWebBrowser.Create(Self);
  WB.OnDocumentComplete := webbrowser1_completo;
  WB.ParentWindow := Handle;
  WB.Navigate('www.ClubDelphi.com');
  ...
end;
funciona correctamente por que respeta la igualdad de los nombres.

Saludos :)

AgustinOrtu 26-07-2015 01:18:29

Mira vos que loco, no se de donde lo habre sacado entonces

Lo acabo de probar y funciona tal y como decis. Siempre que se respete tipo y orden y modificadores (const, var, out o nada) no hay problema

Y pensar que siempre lo respetaba a rajatabla :D

(MAJ) 29-07-2015 16:12:30

Resuelto
 
Muchas gracias por la ayuda muchachos, pero la verdad es que nadie se dio cuenta cual era el verdadero problema, ya que nadie leyo el codi¿go a conciecia, porque al declarar los parametros del evento los declare de la siguiente manera:

Código Delphi [-]
(Sender: TObject; const pDisp: IDispatch; URL: OleVariant)

En realidad ninguno se dio cuenta de que el tercer parametro es una variable, pero no esta declarado como tal, sino que al faltarle la sentencia "var" antes del parametro url, el programa lo toma como constante, al igual que el parametro anterior. En realidad los parametros tienen que estar declarados asi:

Código Delphi [-]
(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant)

gracias de nuevo a todos otra vez por su ayuda...

AgustinOrtu 29-07-2015 19:26:02

En la respuesta de ecfisa esta como var, en cualquier caso los que no nos dimos cuenta fuimos nosotros dos :D

Bien por solucionarlo ^\||/


La franja horaria es GMT +2. Ahora son las 14:24:24.

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