Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Asociar un procedimiento a un objeto TForm??? (https://www.clubdelphi.com/foros/showthread.php?t=68007)

Jhonjhon_123 19-05-2010 03:15:59

Asociar un procedimiento a un objeto TForm???
 
Hola!!

miren, tengo este code que lo arme, la idea es cojer un formulario X que tenga el procedimiento "OnRead" y ejecutarlo, pero la cosa es que cuando intendo correr el soft me salta error "Operator not applicable to this operand type" en la linea "//Esta Linea" justo en "OnRead".

Supongo yo que es por que TForm pos no tiene ese prosedimiento, pero no se como arreglarle, quiero enviarle cualquier Form y me lo acepte.

Como lo Resuelvo?

Código Delphi [-]
procedure Sent_DataSocket_Form(CSokcet:TCustomWinSocket; ListView:TListView; ID_Obj:integer; DataSocket:string; ObjForm: TForm);
var
        ID_Item: integer;
        ListItem: TListItem; //Como la X en VB
begin
        ID_Item := GetID_Item_CSocket(CSokcet, ListView);

        if ID_Item >= 0 then
        begin
                ListItem := ListView.Items[ID_Item];
                if ListItem.SubItems.Objects[ID_Obj] <> nil then
                begin
                        (ListItem.SubItems.Objects[ID_Obj] as ObjForm).OnRead(CSokcet, DataSocket); //Esta Linea
                        Exit;
                end;
        end;
end;

Neftali [Germán.Estévez] 19-05-2010 11:42:15

El problema es que si TForm no posee el procedimiento OnRead no va a funcionar hagas lo que hagas. :confused::confused::confused:

Parece que lo que tienes almacenados en la lista de Objects son objetos de tipo TForm o TSockets.

Estás haciendo el CAST (operador AS) como TForm, pero luego intentas ejecutar un método que pertenece a la clase TCustomSocket. Eso no cuadra.

Si realmente son sockets debería ser algo similar a esto.
Código Delphi [-]
(ListItem.SubItems.Objects[ID_Obj] as TCustomSocket).OnRead(CSokcet, DataSocket);
Y si son TForm, no tiene sentido ejecutar el OnRead.

maeyanes 19-05-2010 15:41:13

Hola...

Aparte que el cast lo tratas de hacer sobre una variable y no sobre un tipo de clase:

Código Delphi [-]
ListItem.SubItems.Objects[ID_Obj] as ObjForm // <--- Error!!


Saludos...

Jhonjhon_123 19-05-2010 22:20:36

Cita:

Empezado por Neftali (Mensaje 364581)
El problema es que si TForm no posee el procedimiento OnRead no va a funcionar hagas lo que hagas. :confused::confused::confused:

Parece que lo que tienes almacenados en la lista de Objects son objetos de tipo TForm o TSockets.

Estás haciendo el CAST (operador AS) como TForm, pero luego intentas ejecutar un método que pertenece a la clase TCustomSocket. Eso no cuadra.

Si realmente son sockets debería ser algo similar a esto.
Código Delphi ...(ListItem.SubItems.Objects[ID_Obj] as TCustomSocket).OnRead(CSokcet, DataSocket);

Y si son TForm, no tiene sentido ejecutar el OnRead.

non mira, no tiene nada k¡que ver con sockets el procedimiento "OnRead" para este caso es como cualquier procedimiento normal agregado, le pude poner "Pepito, etc".

Ahora, no hay forma de que Delphi me asocie ese "OnRead" al form que yo le pase sin que me de error?

maeyanes 19-05-2010 22:34:37

Hola...

¿Si leiste mi mensaje? Ahí te doy una pista del por que tu error...


Saludos...

Jhonjhon_123 19-05-2010 22:36:57

mira, realmente no se mucho de esto, solo arme el code comoestaba, pero se que:

(ListItem.SubItems.Objects[ID_Obj] as ObjForm).ProcedimientoNormal

funciona perfecto para un procedimiento normal de la clase TForm, pero quiero es saber como hacer para procedimientos agregados.

maeyanes 19-05-2010 22:51:50

Hola...

Dudo mucho que ese código que escribiste funcione como comentas, a menos que ObjForm sea del tipo TFormClass.

Ahora, para que te sirva tu código podrías hacer algo como:

Código Delphi [-]
procedure Sent_DataSocket_Form(CSocket: TCustomWinSocket; ListView:TListView; ID_Obj: Integer;
  DataSocket: string; FormClass: TFormClass);
var
  ID_Item: integer;
  ListItem: TListItem; //Como la X en VB

begin
  ID_Item := GetID_Item_CSocket(CSocket, ListView);
  if ID_Item >= 0 then
  begin
    ListItem := ListView.Items[ID_Item];
    if ListItem.SubItems.Objects[ID_Obj] <> nil then
    begin
      (ListItem.SubItems.Objects[ID_Obj] as FormClass).OnRead(CSocket, taSocket);
      Exit
    end
  end
end;

// Para llamar el procedimiento
Sent_DataSocket_Form(CSocket, ListView, ID_Obj, 'DataSocket', TMyForm);

O también cambiar la línea problemática a algo como:

Código Delphi [-]
if ListItem.SubItems.Objects[ID_Obj] is TMyFormType then
  TMyFormType(ListItem.SubItems.Objects[ID_Obj]).OnRead(CSokcet, DataSocket);

Donde TMyFormType es la clase que contiene el método OnRead definido.


Saludos...

Jhonjhon_123 19-05-2010 22:59:53

la cosa es que nesesito que sea algo generico en terminos de Form, por que lo usare en muchos Form.

Ahora: el codigo que me sujeriste me sigue sin funcionar

Neftali [Germán.Estévez] 20-05-2010 09:57:25

Vamos a ver...
Me da, que el problema es que no estás entendiendo lo que escribes, de ahí que tampoco entiendes lo que te digo (y lo que te dice maeyanes):

Código Delphi [-]
 (ListItem.SubItems.Objects[ID_Obj] as ObjForm).OnRead(CSokcet, DataSocket);
Analicemos esta línea por partes.

(1) Cuando colocas algo como esto:
(ListItem.SubItems.Objects[ID_Obj] as ObjForm)

Lo que estás diciendo aquí es que Delphi trate el primer objeto (ListItem.SubItems.Objects[ID_Obj]) como si fuera un objeto de la clase del segundo elemento (ObjForm).

Eso supone que lo primero es un objeto y lo segundo es una clase.
En este caso lo que falla es que tu segundo elemento debe ser una Clase (tal y como te ha dicho maeyanes) y que además el objeto almacenado debe ser del tipo de la segunda clase (de otra forma dará error).

Suponiendo que ese "CAST" (que así se llama) fuera correcto, sintácticamente debería ser equivalente a usar una variable del tipo del que estamos haciendo el CAST.

(2) En tu caso ObjForm es de la clase TForm, así que sintácticamente es equivalente a escribir esto.

Código Delphi [-]
form1.OnRead(CSokcet, DataSocket);

Esto te va a dar error, ya que la clase TForm no posee ningun método OnRead. Y no sólo por el nombre, sino por los parámetros. No hay ningun método en TForm (con ese nombre o con el nombre pepito que cuadre con esos parámetros).

Curiosamente (y por eso mi sugerencia de los sockets) sí hay un método/evento llamado OnRead y con unos parámetros similares en la clase TCustomSocket.

Código Delphi [-]
property OnRead: TSocketNotifyEvent;
type TSocketNotifyEvent = procedure (Sender: TObject; Socket: TCustomWinSocket) of object;

De ahí que supuse que esa línea estaba levantando el evento OnRead de los sockets almacenados en la lista.
Tal vez si ampliaras el código y dijeras lo que hace o de donde lo has sacado podríamos entenderlo mejor.:(


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

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