Ver Mensaje Individual
  #2  
Antiguo 23-03-2023
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.285
Reputación: 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
Cita:
Empezado por juank1971 Ver Mensaje
como puedo buscar todos por ejemplo los TstringGrids de un formulario usando rtti ?
La forma de hacerlo es utilizando FindComponent de forma similar a como se ve en el código; Mejor usando IS que la comparación por ClassName.
Este recorrido es lento. Si necesitas hacerlo mçás de una vez, puedes almacenar los componentes en una Lista (TObjectList) para no tenerlo que hacer más de una vez.

Otra opción es crear manualmente esa lista al crear el formulario.

Código Delphi [-]
  Memo1.Lines.Clear;
  for var i:integer := 0 to ComponentCount - 1 do
    if Components[i] is TStringGrid then
      Memo1.Lines.Add(Components[i].Name + ' -> ClassName:' + Components[i].ClassName);

Este código funciona tanto para VCL como para FMX.
Para buscar otros componentes como el que comentas (clase TLinkGridToDataSource) basta adaptar ese código para la nueva clase.

Código Delphi [-]
  for var i:integer := 0 to ComponentCount - 1 do
    if Components[i] is TLinkGridToDataSource then
      Memo1.Lines.Add(Components[i].Name + ' -> ClassName:' + Components[i].ClassName);

En cuanto a esta cabecera:

Código Delphi [-]
function GetLinkGridToDataSource(Formulario: TForm; Grid: string): TLinkGridToDataSource;

En estos casos es mejor pasar directamente los componentes, no los nombres (parea no tener que realizar las búsquedas).

Código Delphi [-]
function GetLinkGridToDataSource(Formulario:TForm; Grid: TStringGrid): TLinkGridToDataSource;

Con una implementación similar a esta:

Código Delphi [-]
function GetLinkGridToDataSource(Formulario:TForm; Grid: TStringGrid): TLinkGridToDataSource;
begin
  Result := nil;
  for var i:integer := 0 to Formulario.ComponentCount - 1 do
    if Formulario.Components[i] is TLinkGridToDataSource then begin
      var comp:TComponent := Formulario.Components[i];
      if Assigned(TLinkGridToDataSource(comp).GridControl) then
        if (TLinkGridToDataSource(comp).GridControl = Grid) then begin
          Result := TLinkGridToDataSource(comp);
          Exit;
        end;
    end;
end;
__________________
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.

Última edición por Neftali [Germán.Estévez] fecha: 23-03-2023 a las 09:40:03.
Responder Con Cita