PDA

Ver la Versión Completa : saber que formularios he abierto


Rc96
21-09-2017, 17:49:32
Buenas buenas gente saludos. Alguno de ustedes sabra como obtener todos los caption de los formularios que yo abra mientras uso el programa por ejemplo mientras usaba el sistema use el from1 y el form2 quiero guardar esa informacion en una variable para luego guardarla en una tabla todo para llevar el control de los movimientos que pueda hacer un usuario del sistema. GRACIAS :D

Caminante
21-09-2017, 18:36:56
Hola

EL objeto screen guarda la lista de formularios abiertos en la aplicacion. Puedes acceder a ellos con la propiedad Forms.


Espero sea util

Saludos

Rc96
21-09-2017, 19:38:26
Hola caminante. cierto puedo obtener el nombre. Pero mi pregunta es como guardo, no el nombre de uno si no de todos los formularios que haya abierto mientras usaba el sistema. Gracias :D

ecfisa
21-09-2017, 21:55:08
Hola.

Fijate si esta idea te sirve de base, consiste en crear una unidad que se deberá incluir en todos los formularios:

unit uSaveForm;

interface

uses SysUtils, Classes;

procedure SaveOpenForm(const FormName: string);

implementation

procedure SaveOpenForm(const FormName: string);
const
FNAME = 'OpenForms.txt'; // nombre de archivo en que se guarda la actividad
var
TS: TStrings;
begin
TS := TStringList.Create;
try
if FileExists(FNAME) then
TS.LoadFromFile(FNAME);
TS.Add(FormName + ' - ' + FormatDateTime('dd/mm/yyyy hh:mm:ss',Now));
TS.SaveToFile(FNAME);
finally
TS.Free;
end;
end;

end.

El procedimiento SaveOpenForm guardará el nombre del formulario mas la fecha y hora en que se realizó la acción.

Luego deberás llamar al procedimiento en el evento OnShow de cada formulario, ejemplo:

...

implementation

uses ..., uSaveForm;

procedure TCualquierForm.FormShow(Sender: TObject);
begin
SaveOpenForm(Self.Name);
...
end;


Saludos :)

Neftali [Germán.Estévez]
22-09-2017, 12:26:13
Una alternativa, si no quieres modificar TODOS los formularios de la aplicación para añadirles código, como ha indicado [ecfisa], por ejemplo porque tu aplicación tiene 200 formularios, es realizar un hook sobre el mensaje de creación de ventanas.

En este código de Rodrigo, por ejemplo (https://github.com/RRUZ/Delphi-IDE-Colorizer/blob/master/IDE%20PlugIn/Colorizer.Hook.Forms.pas), se instala el gancho utilizando WH_CBT.

Siguiendo esa misma idea, puedes colocar en el formulario principal el siguiente código:


// Obtener el nombre de la clase
function GetWindowClassName(Handle: THandle): String;
var
Buffer: array[0..MAX_PATH] of WideChar;
begin
GetClassName(Handle, @Buffer, MAX_PATH);
Result := String(Buffer);
end;

// Función à la que nos devolverá el hook
function CBT_FUNC(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
const
ClassNameBufferSize = 1024;
var
LHWND : HWND;
classname:string;
begin
Result := CallNextHookEx(hhk, nCode, wParam, lParam);
if nCode<0 then exit;
if nCode = HCBT_CREATEWND then begin
LHWND := HWND(wParam);
if (LHWND>0) then begin
classname := GetWindowClassName(wParam);
// Mensaje, Guardarlo en una lista, Base de Datos,...
OutputDebugString(PChar(FormatDateTime('hh:mm:ss', now) + ' - ' + ClassName));
end;
end;
end;

// Inicializar el hook
Procedure InitHook();
begin
hhk := SetWindowsHookEx(WH_CBT, @CBT_FUNC, hInstance, GetCurrentThreadId);
if hhk=0 then RaiseLastOSError;
end;

// Finilizar el hook
Procedure FinHook();
begin
if (hhk <> 0) then
UnhookWindowsHookEx(hhk);
end;


initialization
InitHook();
finalization
FinHook();


Cuando se creea el fomrulario principal se crea el hook. Y cada vez que se crea un formulario se llamará a la función CBT_FUNC.
Ahi se hacen unas comprobaciones y se accede a la clase del formulario.

El resultado en este ejemplo se visualiza en los eventos utilizando OutputDebugString. Para visualizarlos puedes usar la ventana "Event Log" desde el IDE o alguna herramienta tipo DebugView, si ejecutas desde fuera.

Si desde tu aplicación abres estos formularios:
https://s26.postimg.org/81cbug4ax/Captura_2543.png

Deberías ver un Log como este:

https://s26.postimg.org/5b2zx97m1/Captura_2544.png

Rc96
25-09-2017, 15:27:57
Hola gente muchas gracias por todas sus respuestas tanto eficasa como a neftali. Por mi parte logre hacerlo pero creo que de una manera quizas para ustedes un poco tonta jaja solo use un listbox e hice que al abrir un form agregara el nombre del formulario a listbox luego solo recorro el listbox y obtengo todos los formularios que abri y guardo eso en mi tabla con hora, fecha y el usuario que hizo esos movimientos. no se como les parezca eso a ustedes que tienen mas experiencia y conocimiento :D. Bueno dirigiendome a neftali, estoy probando tu ejm pero me da el siguiente error [dcc32 Error] E2003 Undeclared identifier: 'hhk'. mi pregunta hnk es una variable que tengo que agregar? y si es asi de que tipo. nuevamente gracias.

ecfisa
25-09-2017, 18:23:15
Hola.

Si, es una variable, agrega estas líneas:

...

implementation

...

var // <-
hhk: HHOOK = 0; // <-
...


Saludos :)

Neftali [Germán.Estévez]
26-09-2017, 08:34:54
...estoy probando tu ejm pero me da el siguiente error [dcc32 Error] E2003 Undeclared identifier: 'hhk'. mi pregunta hnk es una variable que tengo que agregar? y si es asi de que tipo. nuevamente gracias.

Es una variable. Me dejé de añadirla al ejemplo.

var // <- hhk: HHOOK = 0; // <-


+1.

Rc96
26-09-2017, 13:43:22
muchas gracias ecfisa y neftali!! probare el ejemplo de ambos nunca esta de mas el conocimiento. :)