Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-05-2010
Jhonjhon_123 Jhonjhon_123 is offline
Miembro
 
Registrado: may 2010
Posts: 12
Poder: 0
Jhonjhon_123 Va por buen camino
Question 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;
Responder Con Cita
  #2  
Antiguo 19-05-2010
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: 18.275
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
El problema es que si TForm no posee el procedimiento OnRead no va a funcionar hagas lo que hagas.

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.
__________________
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
  #3  
Antiguo 19-05-2010
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
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...
Responder Con Cita
  #4  
Antiguo 19-05-2010
Jhonjhon_123 Jhonjhon_123 is offline
Miembro
 
Registrado: may 2010
Posts: 12
Poder: 0
Jhonjhon_123 Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
El problema es que si TForm no posee el procedimiento OnRead no va a funcionar hagas lo que hagas.

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?
Responder Con Cita
  #5  
Antiguo 19-05-2010
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

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


Saludos...
Responder Con Cita
  #6  
Antiguo 19-05-2010
Jhonjhon_123 Jhonjhon_123 is offline
Miembro
 
Registrado: may 2010
Posts: 12
Poder: 0
Jhonjhon_123 Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 19-05-2010
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
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...
Responder Con Cita
  #8  
Antiguo 19-05-2010
Jhonjhon_123 Jhonjhon_123 is offline
Miembro
 
Registrado: may 2010
Posts: 12
Poder: 0
Jhonjhon_123 Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 20-05-2010
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: 18.275
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
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.
__________________
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
asociar un Query al Qrep megaredoxk Impresión 2 19-12-2007 17:33:38
relacionar un procedimiento con un evento de un objeto aranel OOP 3 20-10-2005 21:50:36
Propiedad tipo Objeto (TForm) buildero_d C++ Builder 1 15-09-2005 09:31:16
Asociar teclas F ramonibk Varios 3 26-11-2004 18:03:53
Asociar Icono a un RES craven Gráficos 2 17-09-2003 23:44:03


La franja horaria es GMT +2. Ahora son las 15:41:50.


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