リビジョン | 23 (tree) |
---|---|
日時 | 2021-09-04 01:55:51 |
作者 | derekwildstar |
ATENÇÃO: CÓDIGO-FONTE COM ERROS!
UDAMOPrincipal.pas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Criados os métodos HideMainForm e ShowMainForm
Quando este datamodule é destruído, a conexão é desfeita, para garantir a exclusão do arquivo -journal, mas isso não deu muito certo porque se o programa for forçado a fechar esse evento parece não ser executado
UFORMPrincipal.pas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Agora a mensagem WM_QUERYENDSESSION é manipulada. Antes de o logoff ser executado, verificamos se o botão de saída está ativo. Caso esteja, retornamos false para que o CiCo bloqueie o logoff, neste caso, a tela padrão do Windows mostrando os programas que estão impendido seu desligamento vai mostrar o CiCO com a mensagem definina no FormCreate pela função ShutdownBlockReasonCreate. Caso o botão de saída não esteja habilitado, significa que já fizemos o check-out e neste caso removemos a mensagem de razão para o bloqueio.
Usada a função ShutdownBlockReasonCreate tanto no handle do form quanto no handle da aplicação, com o intuito de definir uma mensagem customizada no caso de haver a tentativa de logoff e o CiCo esteja ativo. Foi necessário fazer isso para os dois handles porque se o form principal estiver visível a mensagem definida com o handle do form será usada e caso o form principal estiver oculto, será usada a mensagem definida no handle da aplicação. O ideal seria usar um handle só, o do form, tentando mostrar ele antes da aplicação ser fechada, mas não consegui desse modo.
CiCoSetup.iss
¯¯¯¯¯¯¯¯¯¯¯¯¯
Arquivo de instalação alterado para que o programa seja instalado incondicionalmente em D:\CiCo
@@ -43,6 +43,7 @@ | ||
43 | 43 | procedure FDTASaldosdiaGetText(Sender: TField; var Text: string; DisplayText: Boolean); |
44 | 44 | procedure FDTASaldossaldoGetText(Sender: TField; var Text: string; DisplayText: Boolean); |
45 | 45 | procedure FDTASaldossaldomensalGetText(Sender: TField; var Text: string; DisplayText: Boolean); |
46 | + procedure DataModuleDestroy(Sender: TObject); | |
46 | 47 | private |
47 | 48 | { Private declarations } |
48 | 49 | FLoggedUserName: String; |
@@ -65,6 +66,8 @@ | ||
65 | 66 | procedure ObterSaldoMensal; |
66 | 67 | procedure AtualizarSaldoAtual; |
67 | 68 | procedure AtualizarSaldoGlobal; |
69 | + procedure HideMainForm; | |
70 | + procedure ShowMainForm; | |
68 | 71 | |
69 | 72 | property LoggedUserName: String read FLoggedUserName; |
70 | 73 | end; |
@@ -94,6 +97,14 @@ | ||
94 | 97 | FORMPrincipal.Close; |
95 | 98 | end; |
96 | 99 | |
100 | +procedure TDAMOPrincipal.ShowMainForm; | |
101 | +begin | |
102 | + Application.MainFormOnTaskBar := True; | |
103 | + TRAI.Visible := False; | |
104 | + Application.MainForm.Show; | |
105 | + Application.Restore; | |
106 | +end; | |
107 | + | |
97 | 108 | procedure TDAMOPrincipal.ObterSaldoGlobal; |
98 | 109 | var |
99 | 110 | SaldoGlobal: SmallInt; |
@@ -222,10 +233,7 @@ | ||
222 | 233 | |
223 | 234 | procedure TDAMOPrincipal.APEVMinimize(Sender: TObject); |
224 | 235 | begin |
225 | - Application.MainForm.Hide; | |
226 | - Application.MainFormOnTaskBar := False; | |
227 | - DAMOPrincipal.TRAI.Visible := True; | |
228 | - DAMOPrincipal.TRAI.ShowBalloonHint; | |
236 | + HideMainForm; | |
229 | 237 | end; |
230 | 238 | |
231 | 239 | procedure TDAMOPrincipal.AplicarFiltro; |
@@ -248,6 +256,14 @@ | ||
248 | 256 | Configuracoes.Ambiente := TAmbiente(FORMPrincipal.RAGR.ItemIndex); |
249 | 257 | end; |
250 | 258 | |
259 | +procedure TDAMOPrincipal.HideMainForm; | |
260 | +begin | |
261 | + Application.MainForm.Hide; | |
262 | + Application.MainFormOnTaskBar := False; | |
263 | + DAMOPrincipal.TRAI.Visible := True; | |
264 | + DAMOPrincipal.TRAI.ShowBalloonHint; | |
265 | +end; | |
266 | + | |
251 | 267 | function TDAMOPrincipal.LimparCPF(ACPF: String): String; |
252 | 268 | begin |
253 | 269 | Result := StringReplace(ACPF,'.','',[rfReplaceAll]); |
@@ -321,6 +337,11 @@ | ||
321 | 337 | OpenTables; |
322 | 338 | end; |
323 | 339 | |
340 | +procedure TDAMOPrincipal.DataModuleDestroy(Sender: TObject); | |
341 | +begin | |
342 | + FDCO.Connected := False; | |
343 | +end; | |
344 | + | |
324 | 345 | procedure TDAMOPrincipal.DoMonthBalance(AMes: Byte; AAno: Word; ASaldos: TSaldos); |
325 | 346 | var |
326 | 347 | i: Byte; |
@@ -408,10 +429,7 @@ | ||
408 | 429 | |
409 | 430 | procedure TDAMOPrincipal.TRAIDblClick(Sender: TObject); |
410 | 431 | begin |
411 | - Application.MainFormOnTaskBar := True; | |
412 | - TRAI.Visible := False; | |
413 | - Application.MainForm.Show; | |
414 | - Application.Restore; | |
432 | + ShowMainForm; | |
415 | 433 | end; |
416 | 434 | |
417 | 435 | procedure TDAMOPrincipal.CheckStatusAndUpdateGUI(ACPF: String; APassaword: String); |
@@ -72,13 +72,13 @@ | ||
72 | 72 | procedure CBBXYearsChange(Sender: TObject); |
73 | 73 | procedure PNBBSaldoDoMesClick(Sender: TObject); |
74 | 74 | procedure PNBBSaldoGlobalClick(Sender: TObject); |
75 | - procedure DBGrid2DrawColumnCell(Sender: TObject; const Rect: TRect; | |
76 | - DataCol: Integer; Column: TColumn; State: TGridDrawState); | |
75 | + procedure DBGrid2DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); | |
77 | 76 | private |
78 | 77 | { Private declarations } |
79 | 78 | FAcaoAutomatica: Boolean; |
80 | 79 | FHiddenWindowHandle: HWND; |
81 | 80 | procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION; |
81 | + procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QUERYENDSESSION; | |
82 | 82 | procedure EuJaExisto(var Msg: TMessage); message WM_EUJAEXISTO; |
83 | 83 | |
84 | 84 | procedure HiddenWindowProc(var Message: TMessage); |
@@ -92,7 +92,8 @@ | ||
92 | 92 | implementation |
93 | 93 | |
94 | 94 | uses |
95 | - UConfiguracoes, UCiCo, UFORMPergunta, UFORMInformacao, DateUtils; | |
95 | + UConfiguracoes, UCiCo, UFORMPergunta, UFORMInformacao, DateUtils, | |
96 | + KRK.Rtl.Win.WinUser; | |
96 | 97 | |
97 | 98 | {$R *.dfm} |
98 | 99 |
@@ -116,6 +117,25 @@ | ||
116 | 117 | inherited; |
117 | 118 | end; |
118 | 119 | |
120 | +// Antes de o logoff ser executado, verificamos se o botão de saída está ativo. | |
121 | +// Caso esteja, retornamos false para que o CiCo bloqueie o logoff, neste caso, | |
122 | +// a tela padrão do Windows mostrando os programas que estão impendido seu | |
123 | +// desligamento vai mostrar o CiCO com a mensagem definina no FormCreate pela | |
124 | +// função ShutdownBlockReasonCreate. Caso o botão de saída não esteja | |
125 | +// habilitado, significa que já fizemos o check-out e neste caso removemos a | |
126 | +// mensagem de razão para o bloqueio. | |
127 | +procedure TFORMPrincipal.WMQueryEndSession(var Msg: TWMQueryEndSession); | |
128 | +begin | |
129 | + apagar os arquivos do sqlite aqui?? | |
130 | + if BUTNSaida.Enabled then | |
131 | + Msg.Result := LRESULT(False) | |
132 | + else | |
133 | + begin | |
134 | + ShutdownBlockReasonDestroy(Application.Handle); // isso pode ser desnecessário | |
135 | + ShutdownBlockReasonDestroy(Handle); // isso pode ser desnecessário | |
136 | + end; | |
137 | +end; | |
138 | + | |
119 | 139 | procedure TFORMPrincipal.BUTNEntradaClick(Sender: TObject); |
120 | 140 | begin |
121 | 141 | if (Configuracoes.Ambiente = aProducao) and (not FAcaoAutomatica) then |
@@ -262,6 +282,12 @@ | ||
262 | 282 | finally |
263 | 283 | FAcaoAutomatica := False; |
264 | 284 | end; |
285 | + | |
286 | + // Configura o bloqueio de desligamento por padrão. A mensagem só será | |
287 | + // exibida se o o check-out não for, de fato, realizado. Veja o manipulador | |
288 | + // da mensagem WM_QUERYENDSESSION para maiores detalhes | |
289 | + ShutdownBlockReasonCreate(Application.Handle,'Foi detectado que você não realizou o Check-Out. Se você sair o Check-Out não será realizado'); | |
290 | + ShutdownBlockReasonCreate(Handle,'Foi detectado que você não realizou o Check-Out. Se você sair o Check-Out não será realizado'); | |
265 | 291 | end |
266 | 292 | else |
267 | 293 | begin |
@@ -330,6 +356,7 @@ | ||
330 | 356 | |
331 | 357 | try |
332 | 358 | FAcaoAutomatica := True; |
359 | + | |
333 | 360 | if BUTNEntrada.Enabled and (TFORMPergunta.ShowMe(Self,'E aí?','Foi detectado que você não realizou o Check-In. Deseja realizá-lo agora?',0) = mrYes) then |
334 | 361 | BUTNEntrada.Click; |
335 | 362 | finally |