martes, 10 de octubre de 2017

Lazarus: guardar la disposición de las ventanas

Prescindiendo de algún paquete tipo anchor docking porque simplemente en Linux con GTK2 al menos no me funciona y nunca le di mucha importancia al asunto. Hasta que descubrí, leyendo en el foro de Lazarus, donde se aprende muchísimo, dicho sea de paso, que podemos ubicar y dimensionar las ventanas como más nos guste y simplemente guardar el escritorio (desktop). No solo eso, podemos guardar todos los escritorio que queramos.

Primero abrimos todas las ventanas (Explorador del proyecto, Inspector del código, etc.) que queremos, las distribuimos convenientemente, fijamos su tamaño y cuando está todo como nos resulte más cómodo, guardamos el escritorio.


Ítem Desktops en el menú Herramientas.


Presionando el botón del diskette guardamos un nuevo escritorio, el famoso "guardar como" o "Save as...".

Diferencia entre Free y FreeAndNil

Básicamente Free libera el objeto, pero no el puntero, es decir, el puntero sigue apuntando a una dirección de memoria (inutilizable ya). Para evitar esto está FreeAndNil que además de liberar el objeto le asigna nil al puntero, por ende, si preguntamos si esta asignado nos devolverá False, de la otra forma, Assigned nos devolvería True.
Hay varias discusiones en torno a FreeAndNil, argumentos a favor y en contra. Depende la situación, a veces en un escenario particular conviene no utilizarlo.

Resumiendo, Free libera al objeto y FreeAndNil además de liberarlo le asigna Nil al puntero.

Ejemplo:

var
  objeto : TBitmap;
begin
  objeto := TBitmap.Create;
  //... Se hace algo con el objeto ...
  objeto.Free;
  if Assigned (objeto) then
    ShowMessage ('Sí, está asignado.')
  else ShowMessage ('No está asignado');
end;


Esto mostrará 'Sí, está asignado'.

Con FreeAndNil:

var
  objeto : TBitmap;
begin
  objeto := TBitmap.Create;
  //... Se hace algo con el objeto ...
  FreeAndNil (objeto);
  if Assigned (objeto) then
    ShowMessage ('Sí, está asignado.')
  else ShowMessage ('No está asignado');
end;


Esto mostrará 'No está asignado'.

Conclusión final: en la mayoría de los casos usar solo Free es correcto y también lo es usar FreeAndNil.

Este es el procedimiento FreeAndNil:

procedure FreeAndNil(var obj);
var
  temp: tobject;
begin
  temp:=tobject(obj);
  pointer(obj):=nil;
  temp.free;
end;
     

Como curiosidad aunque algo lógico, primero le asigna nil y luego hace el Free por razones más que obvias, digo curioso porque podría llamarse NilAndFree.

domingo, 8 de octubre de 2017

RecNo: obtener el registro actual de un DataSet

Un error muy común es intentar obtener y establecer el puntero de un DataSet desde la propiedad del mismo, ¿por qué? porque no está implementada y siempre retornará -1 o 0 (cero), se necesita acceder a ella a través de una clase descendiente que la implemente, por ejemplo, una query de SQL.

También es importante no confundir RecNo con RowID ni con la clave primaria ni con nada, es un puntero al registro actual y se manifiesta en forma de un número entero, un LongInt para ser más precisos, por ende puede almacenarse este valor en una variable del tipo Integer.

Ejemplo de forma incorrecta de leer la propiedad RecNo:

ZQuery.DataSource.DataSet.RecNo

La forma correcta es:

ZQuery.RecNo

Por ejemplo:

var
  RegistroActual:Integer;
begin
  RegistroActual:=ZQuery.RecNo;
  ZQuery.Close;
  //...Se hace algo....
  ZQuery.Open;
  ZQuery.RecNo:=RegistroActual;
end;

SQLiteStudio: mostrar más de 1.000 filas

El valor predeterminado (por default) de filas o registros a mostrar en una consulta (query) en SQLiteStudio es 1.000 (mil). Por eso cuando hacemos una consulta que arroja un resultado de más de mil registros, solo se muestran los primeros mil únicamente, como si se hiciera un LIMIT 1000;

Para modificar esto y cambiar ese valor por otro, ya sea mayor o menor, solo debemos acceder a la configuración a través del menú Tools, ítem Open configuration dialog. O presionando F2.


Ahora en la barra izquierda seleccionamos Data browsing.


En Number of data rows per page establecemos el número deseado de filas a mostrar y finalmente presionamos OK.