2012-01-18 12 views
5

Duplicar posible:
Reference object instance created using “with” in Delphi¿Cómo se obtiene una referencia a un objeto TQuery creado en una declaración WITH?

Un método que utilizo para crear objetos de consulta en Delphi sigue el primer ejemplo de código. Me da una referencia al objeto y puedo pasar el objeto a una función.

procedure SomeProcedure; 
var 
    qry: TQuery; 
begin 
    qry := TQuery.Create(nil); 

    with qry do 
    begin 
    Connection := MyConn; 
    SQL.Text := 'SELECT * FROM PEOPLE'; 
    Open; 

    funcDisplayDataSet(qry); 
    Free; 
    end; 

end; 

¿Es también posible hacer esto en una instrucción WITH donde su objeto en Crear contenida en la declaración CON?

procedure SomeProcedure; 
begin 
    with TQuery.Create(nil) do 
    begin 
    Connection := MyConn; 
    SQL.Text := 'SELECT * FROM PEOPLE'; 
    Open; 

    funcDisplayDataSet(???); // Here I'm unsure how to pass the object created... 
    Free; 
    end; 
end; 

¿Puedo pasar este objeto dinámico a una función como `funcDisplayDataSet (TQuery)?

Me gustaría saber si esto es posible. No estoy buscando un resumen sobre por qué la declaración WITH es mala o buena. Hay otras publicaciones de en el flujo de StackOver con esa discusión. *

+1

+1 para la pregunta interesante, aunque sospecho de que no hay una manera de hacerlo es limpio/claro, si es que lo es. Si la solución resulta ser un vudú que haría que el próximo tipo tenga que ir y mirar cómo lo hiciste, entonces no deberías hacerlo. –

+0

La misma pregunta aquí [reference-object-instance-created-using-in-delphi] (http://stackoverflow.com/questions/791181/reference-object-instance-created-using-with-in-delphi) , con una solución provista por Alexander. –

+4

Solo usa una variable local y saca el WITH.Si vas a hacer algún truco del mal, solo para mantener al CON ahí dentro, tendré que buscarte y jadear. –

Respuesta

6

Eso no es posible, en general, de una manera limpia. Sus opciones:

  1. Agregue un método a la clase que devuelve Self.
  2. Deje de usar with y cree una variable local para la instancia.

La opción 1 es viable si tiene control sobre la clase. Pero deja la clase bastante extraña. ¿Por qué una clase necesitaría un método de instancia que devolviera la instancia? Si no tienes control sobre la clase, podrías usar un ayudante de clase como sugiere RRUZ, pero considero el uso de ayudantes de clase como último recurso. Nunca he resuelto un problema con un ayudante de clase.

Eso deja la opción 2. Esta sería la forma en que resolvería el problema.

+1

+1 "Nunca he resuelto un problema con un ayudante de clase" –

+0

Había resuelto un problema con un ayudante de clase ... Transformaba un trabajo de 50 horas en una solución de 6 horas ... En una emergencia, tal era el caso, son realmente útiles. –

5

¿Qué tal el uso de un ayudante de clase?

type 
    TQueryHelper = class helper for TQuery 
    public 
    function Instance: TQuery; 
    end; 


function TQueryHelper.Instance: TQuery; 
begin 
    Result := Self; 
end; 

Y utilizar como esto

With TQuery.Create(nil) do 
    begin 
    SQL.Text:='Select * from OTGH'; 
    ShowMessage(Instance.SQL.Text); 
    end; 
+3

Bueno, esto hace el trabajo pero falla mi prueba de estar "limpio". +1 –

+0

David, estoy en contra de la declaración 'with' también, esta es solo una respuesta al cuestionario' ... Me gustaría saber si esto es posible'. – RRUZ

+0

Casi lo mismo que la solución (por Alexander) en mi enlace de arriba. Sin ayuda de clase, pero aún no "limpio" por la medida de David. –

3

El with declaración no proporciona una referencia que se puede utilizar para pasar fuera de la norma.

Con un TQuery, podría obtener alrededor de ella mediante el uso de una propiedad que tiene una referencia al padre:

begin 
    with TQuery.Create(nil) do 
    begin 
    Connection := MyConn; 
    SQL.Text := 'SELECT * FROM PEOPLE'; 
    Open; 
    // Fields have reference to parent component, but your implementation may vary 
    funcDisplayDataSet(TQuery(Fields.Fields[0].GetParentComponent)); 
    Free; 
    end; 
end; 
Cuestiones relacionadas