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 22-03-2023
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 230
Poder: 17
juank1971 Va por buen camino
Buscar componentes de un formulario usando rtti

saludos como puedo buscar todos por ejemplo los TstringGrids de un formulario usando rtti ?

algo por ejemplo como esto
Código Delphi [-]
for i := 0 to Formulario.ComponentCount - 1 do
   begin
     if Formulario.Components[i].ClassName= 'TStringGrid' then
    begin
      Grid := TStringGrid(Formulario.Components[i]); // encontró  alguno
      if Grid.ColumnCount > 0 then // comprueba que tenga columnas
        try
......................................
quisiera hacer esto con rtti, he tratado de buscar en google y clubdelphi pero todos los ejemplos buscan propiedades y demas de las clases no instanciadas.

o por ejemplo esto otro quisiera tambien hacerlo con RTTI:

Código Delphi [-]
function GetLinkGridToDataSource(Formulario: TForm; Grid: string): TLinkGridToDataSource;
var
   l:TLinkGridToDataSource; s:TStringGrid;
begin
  result := nil;
  for var i := 0 to Formulario.ComponentCount - 1 do
    if Formulario.Components[i] is TLinkGridToDataSource then
     begin
      l:= Formulario.Components[i] as TLinkGridToDataSource;
      if l.GridControl is TStringGrid then
       begin
       s:= l.GridControl as TStringGrid;
       if Grid = s.name then
        result := l;
       end;
     end;
end;
Responder Con Cita
  #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.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
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
  #3  
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.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
Si aplicamos el último procedimiento al primero que hemos usado para buscar los TStringGrids, podríamos hacer algo como eso:

Código Delphi [-]
procedure TForm4.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
  for var i:integer := 0 to ComponentCount - 1 do
    if Components[i] is TStringGrid then begin
      var lds: TLinkGridToDataSource := GetLinkGridToDataSource(Self, TStringGrid(Components[i]));
      if Assigned(lds) then
        Memo1.Lines.Add('Grid: ' + Components[i].Name + ' tiene asignado LinkDS: ' + lds.Name)
      else
        Memo1.Lines.Add('Grid: ' + Components[i].Name + ' no tiene asignado LinkDS');
    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.
Responder Con Cita
  #4  
Antiguo 23-03-2023
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 230
Poder: 17
juank1971 Va por buen camino
que bien gracias , no hay necesidad de usar rtti entonces.
rtti a mi modo de ver al parecer es mas bien cuando quiero cambiar propiedades e run time
como por ejemplo esta función para habilitar los componentes de un Tlayout al editar,
ahora estoy recordando ver una función para algo de esto en tu blog neftali.
Código Delphi [-]
procedure HabilitarComponentes(LY: TLayout; Hab: boolean);
begin
  with LY do
    for var i := 0 to ControlsCount - 1 do
    begin
      if Controls[i] is TEdit then
        (Controls[i] as TEdit).CanFocus := Hab;
       
      if Controls[i] is TMemo then
       (Controls[i] as TMemo).CanFocus := Hab;
      
     if Controls[i] is TDateEdit then
       (Controls[i] as TDateEdit).CanFocus := Hab;
     
     if Controls[i] is TcomboBox then
        (Controls[i] as TcomboBox).Enabled := Hab;
    end;
end;
Responder Con Cita
  #5  
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.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
Cita:
Empezado por juank1971 Ver Mensaje
como por ejemplo esta función para habilitar los componentes de un Tlayout al editar,
ahora estoy recordando ver una función para algo de esto en tu blog neftali.
Código Delphi [-]procedure HabilitarComponentes(LY: TLayout; Hab: boolean); begin with LY do for var i := 0 to ControlsCount - 1 do begin if Controls[i] is TEdit then (Controls[i] as TEdit).CanFocus := Hab; if Controls[i] is TMemo then (Controls[i] as TMemo).CanFocus := Hab; if Controls[i] is TDateEdit then (Controls[i] as TDateEdit).CanFocus := Hab; if Controls[i] is TcomboBox then (Controls[i] as TcomboBox).Enabled := Hab; end; end;
Es posible.
Justo para evitar código como el que muestras ahí, es para lo que va muy bien usar RTTI.
__________________
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
Funcion Get usando RTTI javicho_villa Varios 6 19-07-2021 20:32:35
Usando RTTI para devolver lista de eventos elrayo76 Varios 13 03-06-2016 08:34:57
Buscar siguiente registro con F3 en un DBGrid usando Locate cubanbaker Conexión con bases de datos 12 21-09-2011 21:50:10
Herencia externa de componentes (BPL)(RTTI) jednavlop OOP 4 05-11-2010 18:37:14
Mostrar y buscar en un Pdf usando TAcroPdf jplj Varios 0 29-10-2010 18:14:52


La franja horaria es GMT +2. Ahora son las 19:01:36.


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