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.