Cita:
Empezado por juank1971
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;