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;
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. :-)