Thursday, May 04, 2006

Delphi .NET, GDI+ y un poco más

Reencontrandome con un colectivo de personajes con los cuales nos dedicabamos hace un tiempo a escribir para la comunidad de developers que usan herramientas tipo Borland, hemos retomado la cosa, y queriendo participar en la causa, pues escogí como tema Delphi.NET, para programar cosas con GDI+.
Lo que quiero es ir mostrando a paso lento pero seguro, cómo es la situación esta del Object Pascal for .NET.
Por ejemplo ahora en la sección Uses pueden ver cosas como estas:
uses System.Drawing;
Si señores, ahi le indicamos a Mr Delphi que vamos a necesitar acceso a las clases de este namespace, y finalmente poder utilizarlas.
Luego dicen por ahi que Private y Protected en Delphi.NET no son como los pintan. Si señores, si ustedes usan
private intXo: integer;
Le cuento que además de ser usado dentro de la clase, a ese engendro lo pueden ver desde afuera. Cómo la ven? a mí la verdad a merced de que esto sea por mera casualidad o por resolver chicharrones para el equipo de la Borland Corporation, pues me parece una falta de atrevimiento querer hacer llover hacia arriba.
Quiere entonces que lo privado sea verdaderamente privado? pues teneis que usar:
strict private
Cómo les queda el ojo? un poco borroso, pues amí me quedo así cuando vi eso, y lo mismo haganle al protected si quieren que sea verdaderamente protected.
Quieren ver otra critica a los MRs de Borland?
http://thenetrix.blogspot.com/2006/04/anda-qu-chulo-y-quin-trabaja.html
Bueno aqui además de criticar a Borland, pues tambièn vamos a lo que vinimos:
Supongase que quieren pintar un tablero de ajedrez en su Windows Forms, aqui esta el code:

type TGraficos = class
private
{ Private Declarations }
intXo: integer;
intYo: integer;
intAncho: integer;

public constructor Create;
procedure PintarTablero(objGraficos: Graphics);
end;

implementation
constructor TGraficos.Create;

begin
inherited Create; // TODO: Add any constructor code here
intXo := 80;
intYo := 0;
intAncho := 60;

end;

procedure TGraficos.PintarTablero;
var objPen: Pen; objBrushNegro: Brush;
objBrushBlanco: Brush;
intContador1: integer;
intContador2: integer;

begin

for intContador1 := 0 to 7 do
for intContador2 := 0 to 7 do
if ((intContador1 + intContador2) mod 2) = 1 then
objGraficos.FillRectangle(objBrushNegro, intXo + intContador2 * intAncho, intYo + intContador1 * intAncho, intXo + intContador1 * intAncho + intAncho, intYo + intContador2 * intAncho + intAncho)
else
objGraficos.FillRectangle(objBrushBlanco, intXo + intContador2 * intAncho, intYo + intContador1 * intAncho, intXo + intContador2 * intAncho + intAncho, intYo + intContador1 * intAncho + intAncho);
objPen.Dispose();

objBrushBlanco.Dispose();
objBrushNegro.Dispose();

end;

TGraficos, recuerden, uno de los 10 mandamientos dice: "Colocaras una T antecediendo el nombre de tú
clase", vaya que en esto si soy responsable y no he olvidado los mandamientos tipo Borland.
Fijense el uso de var para declarar variables locales al procedimiento. Ah si, además esto funciona como Mr VB, toca decirle al señor compilador, vea esto es un procedure, o esto es una function. Sencillo el primero no retorna nada, el segundo si retorna. Ah cosas raras, yo prefiero C#.
El famoso Begin, esto me recuerda al viejo pseudocódigo, pero en fin hace las veces de las {} para los Javeros, C++, y C#reros, podría decirse?
Pero bueno, finalmente, llegamos a la conclusión. A parte de toda esta parafernalia heredada del object pascal comun y corriente, llegamos al punto del uso de nuestras queridas clases del .NET Framework, que eso si es totalmente transparente para los que le dedicamos 9 hrs al dia y un poco más a .NET.

Fijense como el procedure recibe un tipo Graphics, muy simple, instancian TGraficos, y al constructor le asiganan por ejemplo el Graphics devuelto por la forma, al estilo, self.CreateGraphics(), o hacen el llamdo en el evento Paint de la forma y le pasan e.Graphics. El primero como ven es un método como tal, el segundo una propiedad del tipo (e) de la clase PaintEventArgs.
Adicionalmente pueden ponerse en su Form un control tipo pictureBox, y lo usan para retornar el tipo Graphics, de la misma forma como lo hacen con el Form.

Recuerden que esto es uso de GDI+, entre más complejos son lo gráficos y las utilidades que usamos, debemos estar al pendiente de liberar los recursos, para no tener sobrecarga en recursos de memory y procesamiento. Para esto, en mi sencillo ejemplo invoco el método Dispose() de cada uno de los objetos que han o están ocupando recursoso de mi máquina.

Si señores esto es Delphi.NET, un lenguaje más que se une a la liga de la justicia, por qué? sencillo, para estar a la moda. No mentira, porque saben que deben estar al dia con lo que se trabaja actualmente y así no quedarse resagados en relación a IDEs como VS.NET 2005.

Una cosa si les digo, quieren invertir bien la plata? Comprense un VS.NET, la verdad es que Delphi 8 for Microsoft .NET Frameowrk, deja mucho que desear.
Un abrazo

1 comment:

TablonTxiki said...

Hola , Gracias por tu información estas haciendo un gran trabajo en tu Blog Felicidades !!