Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-05-2007
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: 15.552
Poder: 10
Neftali [Germán.Estévez] Tiene un aura espectacularNeftali [Germán.Estévez] Tiene un aura espectacular
Acceder al objeto asociado a una prop. (RTTI)

Esta función permite acceder al objeto (componente) asociado a una propiedad published de un componente vía RTTI.
Al utilizar RTTI es necesario añadir la unit TypInfo al uses.

Código Delphi [-]
// Devuelve el objeto asociado a una propiedad (RTTI).
function GetPropAsObject(AObj: TObject; const PropName:String):TObject;
const
  EBLOCK = 'GetPropAsString';
var
  PInfo: PPropInfo;
  LObject: TObject;
Begin

  Result := nil;

  // Existe la propiedad
  if not ExistProp(AObj, PropName) then begin
    Exit;
  end;

  // Intentamos acceder (con un puntero) a la info. de la propiedad
  PInfo := GetPropInfo(AObj.ClassInfo, PropName);

  // Se ha encontrado la propiedad con éste nombre; Chequear el tipo...
  if (PInfo^.PropType^.Kind = tkClass) then begin

    LObject := GetObjectProp(AObj, PInfo);
    // Nada...
    if (LObject <> nil) then begin
      Result := LObject;
    end;
  end
  else begin
    Result := nil;
  end;
end;

NOTA: Usa la función ExistProp del truco 405.

Un ejemplo de utilización se muestra a continuación; Aquí se busca en todos los componentes del formulario los que tienen la propiedad DataSource; Para los que la tienen asignada se muestra el nombre del DataSourde asignado.

Código Delphi [-]
  // recorrer todoslos controles del form...
  for I := 0 to (Self.ComponentCount - 1) do begin
    comp := Self.Components[i];

    obj := GetPropAsObject(comp, 'DataSource');

    Memo1.Lines.Add('Componente: ' + comp.Name);
    if not Assigned(Obj) then begin
      Memo1.Lines.Add('  -> no Asignado');
    end
    else begin
      // Es un DataSource?
      if (obj is TDataSource) then begin
        Memo1.Lines.Add('  DataSource: ' + TDataSource(obj).Name);
      end
      else begin
        Memo1.Lines.Add('  -> Asignación incorrecta');
      end;
    end;

  end;
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 10:43:13.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi