Ver Mensaje Individual
  #7  
Antiguo 06-05-2006
Avatar de lpmlpm
lpmlpm lpmlpm is offline
Miembro
 
Registrado: ago 2005
Posts: 136
Reputación: 19
lpmlpm Va por buen camino
Cita:
Empezado por Al González
o redefinir el método virtual TDataSet.SetActive para llevar un conteo de aperturas en todos los conjuntos de datos que en adelante agreguemos a nuestra aplicación, sean de clase TClientDataSet, TADOQuery, TIBTable, o de alguna otra clase de componente data set que posiblemente aún no tengamos y bajaremos de Internet en unos días.
De hecho esto aunque limitadamente, es posible de implementar ahora asi como las demás funcionalidades que mencionas; el ejemplo del TDataset sería algo como esto en BDS2006:

Código Delphi [-]
TMiDataset = class helper for TDataset
   public
   class var FActivaciones: Integer;
    procedure SetActive(Value: Boolean); reintroduce;
  end;

implementation

procedure TMiDataset.SetActive (Value: Boolean);
begin
  [...]
  Inc(FActivaciones);
end;

//Y se usaría en algo como esto:
procedure TForm2.Button2Click(Sender: TObject);
begin
  Query1.Open;
  Caption := IntToStr(Table1.FActivaciones);
end;

Claro el problema es que el método SetActive es un método Protegido de la clase TDataset, por lo que no es posible ahora como estan las cosas poder re-definirlo, tal vez un poco mas adelante; pero la cuestión es que si es posible agregar funcionalidades extras; por ejemplo para agregarle un método mas a todos los derivados de TCustomDBGrid:

Código Delphi [-]
  TMiGrid = class helper for TCustomDBGrid
    public
      procedure AjustaColumnas;
  end;

procedure TMiGrid.AjustaColumnas;
const
  DEFBORDER = 3;
var
  temp, n: Integer;
  lmax: array[0..30] of Integer;
begin
  DataSource.DataSet.DisableControls;
  Canvas.Font := Font;
  for n := 0 to Columns.Count - 1 do
    lmax[n] := Canvas.TextWidth(Fields[n].FieldName) + DEFBORDER;
  DataSource.DataSet.First;
  while not DataSource.DataSet.EOF do
  begin
    for n := 0 to Columns.Count - 1 do
    begin
      temp := Canvas.TextWidth(trim(Columns[n].Field.DisplayText)) + DEFBORDER;
      if temp > lmax[n] then lmax[n] := temp;
    end;
    DataSource.DataSet.Next;
  end;
  DataSource.DataSet.First;
  for n := 0 to Columns.Count - 1 do
    if lmax[n] > 0 then
      Columns[n].Width := lmax[n];
  DataSource.DataSet.EnableControls;
end;

Vaya, me parece que la sintaxis existe para poder aplicar nuevas funcionalidades a diferentes niveles de la jerarquia de clases.

Para el caso de los Memo y los TEdit puedes aplicar el ayudante al nivel de la clase TCustomEdit, aún no existe la funcionalidad de poder incluir datos extras en los ayudantes a excepción de las variables de clase, por eso este contador sería común a todas las instancias de clases derivadas de TDataset (ya decia antes que era un poco limitado), esperemos que en la próxima versión ya se puedan usar variables de campos comunes.

Se han ido incluyendo algunas mejoras del lenguaje desde la versión 7, muchas de ellas para ofrecer compatibilidades con los esquemas de .Net, lo bueno es que estas funcionalidades las han hecho disponibles en el esquema Win32 tambien, Además del "For in", están: function inlining, class visibility, class methods/fields/properties, class helpers, nested types, operator overloading, y namespaces.

Particularmente ahora soy un fan de las "live templates" y las uso bastante, una vez las empiezas a dominar son una verdadera maravilla.

Saludos
Carlos G

Edito: si alguien me puede proporcionar un buen ejemplo que justifique el requerir Herencia Múltiple ojalá lo pueda compartir, hasta ahora no he encontrado un buen ejemplo para ello, y ojalá lo explicara con peras, manzanas, abejitas y florecitas porque con los A y A' se hace uno un enredadero marca llorarás. :-)
__________________
"Lo mejor de no saber hacer nada es que se tiene mucho tiempo libre."

Última edición por lpmlpm fecha: 06-05-2006 a las 19:33:37.
Responder Con Cita