Con este truco se intenta mostrar cómo hacer que un formulario estandard de delphi no se pueda mover utilizando el menú de sistema que aparece en la parte izquierda superior del formulario, ni arrastrandolo utilizando el ratón sobre la ventana de tútilo.
No se impide que el formulario pueda redimensionarse, aunque capturando los mensajes adecuados también sería posible impedirlo.
Para ello definimos un procedimiento privado al formulario e interceptamos los mensajes adecuados (SC_MOVE y HTCAPTION)
Definimos el procedimiento en la parte privada:
1
2
3
| private
//: Definimos el prcedimiento para capturar el mensaje
procedure _InternalNoMove(var Message: TWMChar); message WM_SYSCOMMAND; |
private
//: Definimos el prcedimiento para capturar el mensaje
procedure _InternalNoMove(var Message: TWMChar); message WM_SYSCOMMAND;
En la implementración colocamos esto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| //: Definimos el prcedimiento para capturar el mensaje
procedure TForm1._InternalNoMove (var Message: TWMChar);
begin
// Mensajes que interceptamos...
if (Message.Charcode = SC_MOVE or HTCAPTION) or
(Message.Charcode = SC_MOVE) then begin
// No hacemos nada || Nothing to do
end
else begin
// Se deben procesar el resto de mensajes ||
// Process messages normally
inherited;
end;
end; |
//: Definimos el prcedimiento para capturar el mensaje
procedure TForm1._InternalNoMove (var Message: TWMChar);
begin
// Mensajes que interceptamos...
if (Message.Charcode = SC_MOVE or HTCAPTION) or
(Message.Charcode = SC_MOVE) then begin
// No hacemos nada || Nothing to do
end
else begin
// Se deben procesar el resto de mensajes ||
// Process messages normally
inherited;
end;
end;
A partir de los sistemas Windows 2000 en adelante se puede utilizar el procedimiento GetLastInputInfo que se encuentra en la Unit Windows.pas y que puede utilizarse para calcular/obtener el tiempo total de inactividad a nivel de sistema (no de aplicación).
Con una simple llamada pueden obtenerse los segundos de inactividad.
1
2
3
4
5
6
7
8
9
10
| // Devuelve los segundos de inactividad
// ejemplo vía "DelphiAbout"
function InactivitySystemSeconds(): DWord;
var
liInfo: TLastInputInfo;
begin
liInfo.cbSize := SizeOf(TLastInputInfo) ;
GetLastInputInfo(liInfo) ;
Result := (GetTickCount - liInfo.dwTime) DIV 1000;
end; |
// Devuelve los segundos de inactividad
// ejemplo vía "DelphiAbout"
function InactivitySystemSeconds(): DWord;
var
liInfo: TLastInputInfo;
begin
liInfo.cbSize := SizeOf(TLastInputInfo) ;
GetLastInputInfo(liInfo) ;
Result := (GetTickCount - liInfo.dwTime) DIV 1000;
end;
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Para hacer ésto hay que importar primera la librería de ADO desde Delphi, que nos permita generar el fichero ADOX_TLB, que necesitamos para crear el fichero MDB.
Para importar la librería seguimos los pasos:
- Menu Project/Import Type Library.
- Buscar la librería: «Microsoft ADO Ext. 2.X for DDL and Security».
- Pulsa «Create Unit».
Una vez generador el fichero, utilizar el siguiente código:
const
DATABASENAME = 'c:\temp\BaseDatosNueva.mdb';
var
Catalog: _Catalog;
ConnectionString:String;
begin
// Create a Catalog Object
Catalog := CreateCOMObject(StringToGUID('ADOX.Catalog')) as _Catalog;
// Set the Connection String
ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + DATABASENAME;
try
// Create new Access database
Catalog.Create(ConnectionString);
except
on E:EOLEException do begin
// Levantamos la excepción
MessageDlg('Error al crear la Base de Datos; Mensaje:' +
E.Message, mtError, [mbOK], 0);
end;
end; |
const
DATABASENAME = 'c:\temp\BaseDatosNueva.mdb';
var
Catalog: _Catalog;
ConnectionString:String;
begin
// Create a Catalog Object
Catalog := CreateCOMObject(StringToGUID('ADOX.Catalog')) as _Catalog;
// Set the Connection String
ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + DATABASENAME;
try
// Create new Access database
Catalog.Create(ConnectionString);
except
on E:EOLEException do begin
// Levantamos la excepción
MessageDlg('Error al crear la Base de Datos; Mensaje:' +
E.Message, mtError, [mbOK], 0);
end;
end;
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…