Subversion Repositories delphiutils

Rev

Rev 57 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
50 daniel-mar 1
unit Main;
2
 
51 daniel-mar 3
(*
4
 
64 daniel-mar 5
# download einer primer-tabelle?
6
 
51 daniel-mar 7
bug: wenn man einen eintrag ändert oder hinzufügt, werden alle "status" auf unknown zurückgesetzt
8
td: aktualisierenbutton/f5 erlauben
52 daniel-mar 9
del-button...
10
icon: gray(internetdown),red,green
11
reg-write fehler erkennen
51 daniel-mar 12
 
64 daniel-mar 13
statustext einführen (format 2.0)
14
 
15
rote listeneinträge bei fehlern
16
 
17
f5 möglichkeit geben?
18
 
19
nur 1 instanz zulassen
20
 
21
spaltenindizes 0,1,2 in constanten packen
22
 
52 daniel-mar 23
Future
24
------
25
 
57 daniel-mar 26
- Rote Einträge bei Fehlern? (VCL Problem)
27
- XP Bubble verwenden?
28
- Toolbar / ApplicationEvents
52 daniel-mar 29
 
51 daniel-mar 30
*)
31
 
50 daniel-mar 32
interface
33
 
34
uses
35
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
57 daniel-mar 36
  Dialogs, ShellAPI, Menus, Registry, Grids, StdCtrls, ExtCtrls, ImgList;
50 daniel-mar 37
 
38
const
39
  WM_TASKABAREVENT = WM_USER+1; //Taskbar message
40
 
41
type
42
  TMainForm = class(TForm)
52 daniel-mar 43
    TrayPopupMenu: TPopupMenu;
50 daniel-mar 44
    Anzeigen1: TMenuItem;
45
    Beenden1: TMenuItem;
52 daniel-mar 46
    MonitorGrid: TStringGrid;
47
    MenuPopupMenu: TPopupMenu;
50 daniel-mar 48
    Edit1: TMenuItem;
49
    Open1: TMenuItem;
50
    N1: TMenuItem;
51
    Delete1: TMenuItem;
52
    Ping1: TMenuItem;
53
    InitTimer: TTimer;
54
    LoopTimer: TTimer;
55
    Checknow1: TMenuItem;
52 daniel-mar 56
    MainMenu: TMainMenu;
57
    MEntry: TMenuItem;
58
    MHelp: TMenuItem;
59
    MAbout: TMenuItem;
60
    MFile: TMenuItem;
61
    MClose: TMenuItem;
62
    MCloseAndExit: TMenuItem;
63
    MNewEntry: TMenuItem;
64
    N4: TMenuItem;
65
    MCheckAll: TMenuItem;
66
    MConfig: TMenuItem;
67
    MConnWarnOpt: TMenuItem;
68
    MInitTimeOpt: TMenuItem;
69
    MitWindowsstarten1: TMenuItem;
70
    N2: TMenuItem;
71
    MLoopTimeOpt: TMenuItem;
72
    MSpecs: TMenuItem;
73
    Open2: TMenuItem;
74
    Ping2: TMenuItem;
75
    Checknow2: TMenuItem;
76
    N3: TMenuItem;
77
    Edit2: TMenuItem;
78
    Delete2: TMenuItem;
79
    LastCheckPanel: TPanel;
80
    MUpdate: TMenuItem;
81
    UpdateTimer: TTimer;
82
    N5: TMenuItem;
83
    N6: TMenuItem;
57 daniel-mar 84
    ImageList1: TImageList;
50 daniel-mar 85
    procedure FormDestroy(Sender: TObject);
86
    procedure FormCreate(Sender: TObject);
87
    procedure Anzeigen1Click(Sender: TObject);
88
    procedure Beenden1Click(Sender: TObject);
89
    procedure FormShow(Sender: TObject);
52 daniel-mar 90
    procedure MonitorGridDblClick(Sender: TObject);
50 daniel-mar 91
    procedure Open1Click(Sender: TObject);
52 daniel-mar 92
    procedure MonitorGridMouseDown(Sender: TObject; Button: TMouseButton;
50 daniel-mar 93
      Shift: TShiftState; X, Y: Integer);
94
    procedure Edit1Click(Sender: TObject);
95
    procedure Delete1Click(Sender: TObject);
96
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
97
    procedure InitTimerTimer(Sender: TObject);
98
    procedure LoopTimerTimer(Sender: TObject);
51 daniel-mar 99
    procedure Checknow1Click(Sender: TObject);
52 daniel-mar 100
    procedure Ping1Click(Sender: TObject);
101
    procedure MCheckAllClick(Sender: TObject);
102
    procedure MAboutClick(Sender: TObject);
103
    procedure MLoopTimeOptClick(Sender: TObject);
104
    procedure MNewEntryClick(Sender: TObject);
105
    procedure MConnWarnOptClick(Sender: TObject);
106
    procedure MInitTimeOptClick(Sender: TObject);
107
    procedure MCloseClick(Sender: TObject);
108
    procedure MCloseAndExitClick(Sender: TObject);
109
    procedure MitWindowsstarten1Click(Sender: TObject);
110
    procedure MSpecsClick(Sender: TObject);
111
    procedure Open2Click(Sender: TObject);
112
    procedure Ping2Click(Sender: TObject);
113
    procedure Checknow2Click(Sender: TObject);
114
    procedure Edit2Click(Sender: TObject);
115
    procedure Delete2Click(Sender: TObject);
116
    procedure MUpdateClick(Sender: TObject);
117
    procedure UpdateTimerTimer(Sender: TObject);
50 daniel-mar 118
  private
119
    RealClose: boolean;
120
    WarnAtConnectivityFailure: boolean;
64 daniel-mar 121
    StatCache: TStringList;
50 daniel-mar 122
    procedure TaskbarEvent(var Msg: TMessage);
123
      Message WM_TASKABAREVENT;
124
    procedure OnQueryEndSession(var Msg: TWMQueryEndSession);
125
      message WM_QUERYENDSESSION;
52 daniel-mar 126
    procedure OnWmQuit(var Msg: TWMQuit);
127
      message WM_QUIT;
50 daniel-mar 128
    procedure NotifyIconChange(dwMessage: Cardinal);
129
    procedure LoadConfig;
51 daniel-mar 130
    procedure ProcessStatMon(i: integer; ShowSuccess: boolean);
131
    procedure ProcessAll(ShowSuccess: boolean);
52 daniel-mar 132
    function GetCurrentMonitorName: string;
133
    function GetCurrentMonitorURL: string;
50 daniel-mar 134
    procedure Vordergrund;
135
    procedure LoadList;
57 daniel-mar 136
    function Status: boolean;
52 daniel-mar 137
    // procedure RightAlignHelpMenuItem;
50 daniel-mar 138
  end;
139
 
140
var
141
  MainForm: TMainForm;
142
 
143
implementation
144
 
51 daniel-mar 145
{$R StatusMonManifest.res}
146
 
50 daniel-mar 147
{$R *.dfm}
148
 
149
uses
52 daniel-mar 150
  Functions, ServiceEdit, StatusMonFuncs, About, Common;
50 daniel-mar 151
 
52 daniel-mar 152
type
153
  TExtended = packed record
154
    Val: Extended;
155
    Err: boolean;
156
  end;
157
 
158
function StrToExtended(str: String): TExtended;
159
begin
160
  result.Err := false;
161
  result.Val := 0;
162
  try
163
    result.Val := StrToFloat(str);
164
  except
165
    result.Err := true;
166
  end;
167
end;
168
 
50 daniel-mar 169
// Ref: http://www.delphi-fundgrube.de/faq01.htm
170
 
171
procedure TMainForm.TaskbarEvent(var Msg: TMessage);
172
var
173
  Point: TPoint;
174
begin
175
  { Die WM_TaskbarEvent-Message "Msg" gibt in Msg.LParam
176
    das genaue Ereignis an. Msg.LParam kann folgende Werte für
177
    Mausereignisse annehmen:
178
 
179
    WM_MouseMove
180
    WM_LButtonDown
181
    WM_LButtonUp
182
    WM_LButtonDblClk
183
    WM_RButtonDown
184
    WM_RButtonUp
185
    WM_RButtonDblClk }
186
 
187
  case Msg.LParam of
188
    WM_LButtonDblClk:
189
      begin
190
        Vordergrund;
191
      end;
192
    WM_RButtonUp:
193
      begin
194
        // Rechtsklick
195
        // Diese Zeile ist wichtig, damit das PopupMenu korrekt
196
        // wieder geschlossen wird:
197
        SetForegroundWindow(Handle);
198
        GetCursorPos(Point);
52 daniel-mar 199
        TrayPopupMenu.Popup(Point.x, Point.y);
50 daniel-mar 200
      end;
201
  end;
202
end;
203
 
52 daniel-mar 204
procedure TMainForm.UpdateTimerTimer(Sender: TObject);
50 daniel-mar 205
begin
52 daniel-mar 206
  UpdateTimer.Interval := 6*60*60*1000; // Alle 6 Stunden gucken wir mal
207
  VTSUpdateCheck('statusmon', '3.0', false, false);
208
end;
209
 
210
procedure TMainForm.MUpdateClick(Sender: TObject);
211
begin
212
  VTSUpdateCheck('statusmon', '3.0', true, true);
213
end;
214
 
215
procedure TMainForm.MNewEntryClick(Sender: TObject);
216
begin
50 daniel-mar 217
  if EditForm.ShowDialog('') then LoadList;
218
end;
219
 
52 daniel-mar 220
procedure TMainForm.MSpecsClick(Sender: TObject);
221
begin
222
  // ToDo
223
end;
224
 
50 daniel-mar 225
procedure TMainForm.NotifyIconChange(dwMessage: Cardinal);
226
var
227
  NotifyIconData: TNotifyIconData;
57 daniel-mar 228
  ico: TIcon;
50 daniel-mar 229
begin
230
  Fillchar(NotifyIconData,Sizeof(NotifyIconData), 0);
231
  NotifyIconData.cbSize := Sizeof(NotifyIconData);
232
  NotifyIconData.Wnd    := Handle;
233
  NotifyIconData.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
234
  NotifyIconData.uCallbackMessage := WM_TASKABAREVENT;
57 daniel-mar 235
 
236
  ico := TIcon.Create;
237
  if Status then
238
    ImageList1.GetIcon(0, ico)
239
  else
240
    ImageList1.GetIcon(1, ico);
241
  NotifyIconData.hIcon := ico.Handle;
242
 
50 daniel-mar 243
  NotifyIconData.szTip := 'ViaThinkSoft Status Monitor 3.0';
244
  Shell_NotifyIcon(dwMessage, @NotifyIconData);
245
end;
246
 
247
procedure TMainForm.FormDestroy(Sender: TObject);
248
begin
64 daniel-mar 249
  StatCache.Free;
50 daniel-mar 250
  NotifyIconChange(NIM_DELETE);
251
end;
252
 
253
procedure TMainForm.FormCreate(Sender: TObject);
254
begin
52 daniel-mar 255
  LastCheckPanel.Caption := Format(LNG_LAST_CHECK, [LNG_LAST_CHECK_UNKNOWN]);
256
 
257
  // RightAlignHelpMenuItem;
258
 
64 daniel-mar 259
  StatCache := TStringList.Create;
260
 
261
  // Kommt sicherlich nicht in irgendeiner URL vor!
262
  // #0 funktioniert nicht
263
  StatCache.NameValueSeparator := #1;
264
 
50 daniel-mar 265
  NotifyIconChange(NIM_ADD);
266
 
52 daniel-mar 267
  MonitorGrid.Rows[0].Add(LNG_COLUMN_NAME);
268
  MonitorGrid.Rows[0].Add(LNG_COLUMN_URL);
269
  MonitorGrid.Rows[0].Add(LNG_COLUMN_STATUS);
50 daniel-mar 270
 
52 daniel-mar 271
  // Default-Werte
272
  WarnAtConnectivityFailure := false;
273
  LoopTimer.Interval   := 1*60*60*1000;
274
  InitTimer.Interval   :=    5*60*1000;
275
  UpdateTimer.Interval :=    5*60*1000;
276
 
50 daniel-mar 277
  LoadConfig;
278
end;
279
 
280
procedure TMainForm.Vordergrund;
281
begin
282
  Show;
283
  ShowWindow(Handle, SW_RESTORE);
284
  ForceForegroundWindow(Handle);
285
end;
286
 
52 daniel-mar 287
procedure TMainForm.MLoopTimeOptClick(Sender: TObject);
288
var
289
  reg: TRegistry;
290
  x: string;
291
  e: TExtended;
292
begin
293
  reg := TRegistry.Create;
294
  try
295
    reg.RootKey := HKEY_CURRENT_USER;
296
    if reg.OpenKey(REG_KEY_SETTINGS, true) then
297
    begin
298
      x := InputBox(LNG_LOOP_TIME, LNG_INPUT_MINUTE_INTERVAL, IntToStr(round(LoopTimer.Interval/60/1000)));
299
      e := StrToExtended(x);
300
      if not e.Err and (e.Val > 0) then
301
      begin
302
        LoopTimer.Interval := Round(e.Val*60*1000);
303
        reg.WriteInteger(REG_VAL_LOOP_TIMER_INTERVAL, LoopTimer.Interval);
304
        MLoopTimeOpt.Caption := Format(LNG_LOOP_TIME_OPTION, [round(e.Val)]);
305
      end
306
      else
307
      begin
308
        MessageBox(Handle, PChar(LNG_ERROR), PChar(LNG_NO_POSITIVE_NUMBER_WITHOUT_ZERO), MB_ICONERROR or MB_OK);
309
      end;
310
    end;
311
  finally
312
    reg.Free;
313
  end;
314
end;
315
 
316
procedure TMainForm.MCheckAllClick(Sender: TObject);
317
begin
318
  ProcessAll(false);
319
  MessageBox(Handle, PChar(LNG_CHECKALL_FINISHED_TEXT), PChar(LNG_CHECKALL_FINISHED_CAPTION), MB_ICONINFORMATION or MB_OK);
320
end;
321
 
50 daniel-mar 322
procedure TMainForm.Anzeigen1Click(Sender: TObject);
323
begin
324
  Vordergrund;
325
end;
326
 
327
procedure TMainForm.Beenden1Click(Sender: TObject);
328
begin
52 daniel-mar 329
  MCloseAndExit.Click;
50 daniel-mar 330
end;
331
 
52 daniel-mar 332
procedure TMainForm.MAboutClick(Sender: TObject);
333
begin
57 daniel-mar 334
  AboutForm.PopupParent := Screen.ActiveForm; // Workaround
52 daniel-mar 335
  AboutForm.ShowModal;
336
end;
337
 
50 daniel-mar 338
procedure TMainForm.LoadConfig;
339
var
340
  reg: TRegistry;
341
begin
342
  reg := TRegistry.Create;
343
  try
344
    reg.RootKey := HKEY_CURRENT_USER;
52 daniel-mar 345
    if reg.OpenKeyReadOnly(REG_KEY_SETTINGS) then
50 daniel-mar 346
    begin
52 daniel-mar 347
      if reg.ValueExists(REG_VAL_INIT_TIMER_INTERVAL) then
348
        InitTimer.Interval := reg.ReadInteger(REG_VAL_INIT_TIMER_INTERVAL);
51 daniel-mar 349
 
52 daniel-mar 350
      if reg.ValueExists(REG_VAL_LOOP_TIMER_INTERVAL) then
351
        LoopTimer.Interval := reg.ReadInteger(REG_VAL_LOOP_TIMER_INTERVAL);
51 daniel-mar 352
 
52 daniel-mar 353
      if reg.ValueExists(REG_VAL_WARN_AT_CONNFAILURE) then
354
        WarnAtConnectivityFailure := reg.ReadBool(REG_VAL_WARN_AT_CONNFAILURE);
51 daniel-mar 355
 
50 daniel-mar 356
      reg.CloseKey;
357
    end;
358
  finally
359
    reg.Free;
360
  end;
52 daniel-mar 361
 
362
  MInitTimeOpt.Caption := Format(LNG_INIT_TIME_OPTION, [round(InitTimer.Interval/1000/60)]);
363
  MLoopTimeOpt.Caption := Format(LNG_LOOP_TIME_OPTION, [round(LoopTimer.Interval/1000/60)]);
364
  MConnWarnOpt.Checked := WarnAtConnectivityFailure;
50 daniel-mar 365
end;
366
 
367
procedure TMainForm.LoadList;
368
var
369
  reg: TRegistry;
370
  st: TStringList;
371
  i: Integer;
64 daniel-mar 372
  MonitorUrl, CachedStat: String;
50 daniel-mar 373
begin
374
  reg := TRegistry.Create;
375
  st := TStringList.Create;
376
  try
377
    reg.RootKey := HKEY_CURRENT_USER;
52 daniel-mar 378
    if reg.OpenKeyReadOnly(REG_KEY_SERVICES) then
50 daniel-mar 379
    begin
380
      reg.GetKeyNames(st);
52 daniel-mar 381
      MonitorGrid.RowCount := st.Count + 1;
50 daniel-mar 382
      for i := 0 to st.Count - 1 do
383
      begin
52 daniel-mar 384
        if reg.OpenKeyReadOnly(Format(REG_KEY_SERVICE, [st.Strings[i]])) then
50 daniel-mar 385
        begin
52 daniel-mar 386
          MonitorGrid.Rows[i+1].Clear;
387
          MonitorGrid.Rows[i+1].Add(st.Strings[i]);
64 daniel-mar 388
          MonitorUrl := reg.ReadString(REG_VAL_URL);
389
          MonitorGrid.Rows[i+1].Add(MonitorUrl);
390
          CachedStat := StatCache.Values[MonitorUrl];
391
          If CachedStat = '' then CachedStat := LNG_STAT_UNKNOWN;
392
          MonitorGrid.Rows[i+1].Add(CachedStat);
50 daniel-mar 393
        end;
394
      end;
395
      reg.CloseKey;
396
    end;
397
  finally
398
    st.Free;
399
    reg.Free;
400
  end;
401
end;
402
 
403
procedure TMainForm.LoopTimerTimer(Sender: TObject);
404
begin
51 daniel-mar 405
  ProcessAll(false);
50 daniel-mar 406
end;
407
 
52 daniel-mar 408
procedure TMainForm.MitWindowsstarten1Click(Sender: TObject);
409
begin
410
  ShowMessage('ToDo'); // ToDo
411
end;
412
 
50 daniel-mar 413
procedure TMainForm.FormShow(Sender: TObject);
414
begin
415
  LoadList;
416
end;
417
 
52 daniel-mar 418
procedure TMainForm.MInitTimeOptClick(Sender: TObject);
419
var
420
  reg: TRegistry;
421
  x: string;
422
  e: TExtended;
423
begin
424
  reg := TRegistry.Create;
425
  try
426
    reg.RootKey := HKEY_CURRENT_USER;
427
    if reg.OpenKey(REG_KEY_SETTINGS, true) then
428
    begin
429
      x := InputBox(LNG_INIT_TIME, LNG_INPUT_MINUTE_INTERVAL, IntToStr(round(InitTimer.Interval/60/1000)));
430
      e := StrToExtended(x);
431
      if not e.Err and (e.Val > 0) then
432
      begin
433
        InitTimer.Interval := Round(e.Val*60*1000);
434
        reg.WriteInteger(REG_VAL_INIT_TIMER_INTERVAL, InitTimer.Interval);
435
        MInitTimeOpt.Caption := Format(LNG_INIT_TIME_OPTION, [round(e.Val)]);
436
      end
437
      else
438
      begin
439
        MessageBox(Handle, PChar(LNG_ERROR), PChar(LNG_NO_POSITIVE_NUMBER_WITHOUT_ZERO), MB_ICONERROR or MB_OK);
440
      end;
441
    end;
442
  finally
443
    reg.Free;
444
  end;
445
end;
446
 
50 daniel-mar 447
procedure TMainForm.InitTimerTimer(Sender: TObject);
448
begin
449
  InitTimer.Enabled := false;
450
  LoopTimer.Enabled := true;
451
end;
452
 
52 daniel-mar 453
procedure TMainForm.MCloseClick(Sender: TObject);
50 daniel-mar 454
begin
52 daniel-mar 455
  Close;
456
end;
457
 
458
procedure TMainForm.MCloseAndExitClick(Sender: TObject);
459
begin
460
  if MessageBox(Handle, PChar(LNG_EXIT_TEXT), PChar(LNG_EXIT_CAPTION), MB_ICONQUESTION or MB_YESNOCANCEL) = IDYES then
461
  begin
462
    RealClose := true;
463
    Close;
464
  end;
465
end;
466
 
467
procedure TMainForm.MonitorGridDblClick(Sender: TObject);
468
begin
50 daniel-mar 469
  Open1.Click;
470
end;
471
 
52 daniel-mar 472
function TMainForm.GetCurrentMonitorName: string;
473
begin
474
  // result := MonitorGrid.Rows[MonitorGrid.Row].Strings[0];
475
  result := MonitorGrid.Cells[0, MonitorGrid.Row];
476
end;
477
 
478
function TMainForm.GetCurrentMonitorURL: string;
479
begin
480
  // result := MonitorGrid.Rows[MonitorGrid.Row].Strings[1];
481
  result := MonitorGrid.Cells[1, MonitorGrid.Row];
482
end;
483
 
50 daniel-mar 484
procedure TMainForm.Open1Click(Sender: TObject);
485
begin
52 daniel-mar 486
  Open2.Click;
50 daniel-mar 487
end;
488
 
52 daniel-mar 489
procedure TMainForm.Open2Click(Sender: TObject);
490
begin
491
  ShellExecute(Handle, 'open', PChar(GetCurrentMonitorURL), '', '', SW_SHOW)
492
end;
493
 
494
procedure TMainForm.Ping1Click(Sender: TObject);
495
begin
496
  Ping2.Click;
497
end;
498
 
499
procedure TMainForm.Ping2Click(Sender: TObject);
500
begin
501
  ShellExecute(Handle, 'open', 'ping', PChar(GetDomainNameByURL(GetCurrentMonitorURL)+' -t'), '', SW_NORMAL);
502
end;
503
 
51 daniel-mar 504
procedure TMainForm.ProcessAll(ShowSuccess: boolean);
50 daniel-mar 505
var
506
  i: integer;
507
begin
52 daniel-mar 508
  for i := 1 to MonitorGrid.RowCount - 1 do
50 daniel-mar 509
  begin
52 daniel-mar 510
    MonitorGrid.Cells[2, i] := LNG_STAT_QUEUE;
511
  end;
512
  for i := 1 to MonitorGrid.RowCount - 1 do
513
  begin
51 daniel-mar 514
    ProcessStatMon(i, ShowSuccess);
50 daniel-mar 515
  end;
52 daniel-mar 516
  LastCheckPanel.Caption := Format(LNG_LAST_CHECK, [DateTimeToStr(Now)]);
50 daniel-mar 517
end;
518
 
51 daniel-mar 519
procedure TMainForm.ProcessStatMon(i: integer; ShowSuccess: boolean);
50 daniel-mar 520
var
521
  x: TMonitorState;
51 daniel-mar 522
  MonitorUrl, ServerName: string;
50 daniel-mar 523
begin
52 daniel-mar 524
  ServerName := MonitorGrid.Rows[i].Strings[0];
525
  MonitorUrl := MonitorGrid.Rows[i].Strings[1];
51 daniel-mar 526
 
64 daniel-mar 527
  if MonitorUrl = '' then Exit; // Passiert, wenn Create() aufgehalten wird (z.B. mit ShowMessage)  
528
 
52 daniel-mar 529
  MonitorGrid.Rows[i].Strings[2] := LNG_STAT_CHECKING;
51 daniel-mar 530
  Application.ProcessMessages;
531
 
50 daniel-mar 532
  x := DeterminateMonitorState(MonitorUrl);
533
 
534
  if x = msOK then
535
  begin
52 daniel-mar 536
    MonitorGrid.Rows[i].Strings[2] := LNG_STAT_OK;
64 daniel-mar 537
    StatCache.Values[MonitorUrl] := LNG_STAT_OK;
57 daniel-mar 538
    NotifyIconChange(NIM_MODIFY);
51 daniel-mar 539
    if ShowSuccess then
540
    begin
52 daniel-mar 541
      MessageBox(Handle, PChar(Format(LNG_ALERT_STATUS_OK, [ServerName, MonitorUrl])), PChar(LNG_CHECKALL_FINISHED_CAPTION), MB_ICONINFORMATION or MB_OK);
51 daniel-mar 542
    end;
50 daniel-mar 543
  end
544
  else if x = msStatusWarning then
545
  begin
52 daniel-mar 546
    MonitorGrid.Rows[i].Strings[2] := LNG_STAT_WARNING;
64 daniel-mar 547
    StatCache.Values[MonitorUrl] := LNG_STAT_WARNING;
57 daniel-mar 548
    NotifyIconChange(NIM_MODIFY);
52 daniel-mar 549
    if MessageBox(Handle, PChar(Format(LNG_ALERT_STATUS_WARNING, [ServerName, MonitorUrl])), PChar(LNG_ALERT_CAPTION), MB_ICONWARNING or MB_YESNOCANCEL) = IDYES then
50 daniel-mar 550
    begin
551
      ShellExecute(Handle, 'open', PChar(MonitorUrl), '', '', SW_NORMAL);
552
    end;
553
  end
51 daniel-mar 554
  else if x = msMonitorParseError then
50 daniel-mar 555
  begin
52 daniel-mar 556
    MonitorGrid.Rows[i].Strings[2] := LNG_STAT_PARSEERROR;
64 daniel-mar 557
    StatCache.Values[MonitorUrl] := LNG_STAT_PARSEERROR;
57 daniel-mar 558
    NotifyIconChange(NIM_MODIFY);
52 daniel-mar 559
    if MessageBox(Handle, PChar(Format(LNG_ALERT_MONITOR_FAILURE, [ServerName, MonitorUrl])), PChar(LNG_ALERT_CAPTION), MB_ICONWARNING or MB_YESNOCANCEL) = IDYES then
50 daniel-mar 560
    begin
561
      ShellExecute(Handle, 'open', PChar(MonitorUrl), '', '', SW_NORMAL);
562
    end;
563
  end
51 daniel-mar 564
  else if x = msMonitorGeneralError then
565
  begin
52 daniel-mar 566
    MonitorGrid.Rows[i].Strings[2] := LNG_STAT_GENERALERROR;
64 daniel-mar 567
    StatCache.Values[MonitorUrl] := LNG_STAT_GENERALERROR;
57 daniel-mar 568
    NotifyIconChange(NIM_MODIFY);
52 daniel-mar 569
    if MessageBox(Handle, PChar(Format(LNG_ALERT_MONITOR_FAILURE, [ServerName, MonitorUrl])), PChar(LNG_ALERT_CAPTION), MB_ICONWARNING or MB_YESNOCANCEL) = IDYES then
51 daniel-mar 570
    begin
571
      ShellExecute(Handle, 'open', PChar(MonitorUrl), '', '', SW_NORMAL);
572
    end;
573
  end
50 daniel-mar 574
  else if x = msServerDown then
575
  begin
52 daniel-mar 576
    MonitorGrid.Rows[i].Strings[2] := LNG_STAT_SERVERDOWN;
64 daniel-mar 577
    StatCache.Values[MonitorUrl] := LNG_STAT_SERVERDOWN;
57 daniel-mar 578
    NotifyIconChange(NIM_MODIFY);
50 daniel-mar 579
    // Es besteht eine Internetverbindung, daher ist wohl was mit dem
580
    // Server nicht in Ordnung
581
 
52 daniel-mar 582
    if MessageBox(Handle, PChar(Format(LNG_ALERT_SERVER_DOWN, [ServerName, MonitorUrl])), PChar(LNG_ALERT_CAPTION), MB_ICONWARNING or MB_YESNOCANCEL) = IDYES then
50 daniel-mar 583
    begin
52 daniel-mar 584
      Ping1.Click;
50 daniel-mar 585
    end;
586
  end
587
  else if x = msInternetBroken then
588
  begin
52 daniel-mar 589
    MonitorGrid.Rows[i].Strings[2] := LNG_STAT_INTERNETBROKEN;
64 daniel-mar 590
    StatCache.Values[MonitorUrl] := LNG_STAT_INTERNETBROKEN;
57 daniel-mar 591
    NotifyIconChange(NIM_MODIFY);
50 daniel-mar 592
    if not WarnAtConnectivityFailure then
593
    begin
52 daniel-mar 594
      if MessageBox(Handle, PChar(Format(LNG_ALERT_CONNECTIVITY_FAILURE, [ServerName, MonitorUrl])), PChar(LNG_ALERT_CAPTION), MB_ICONWARNING or MB_YESNOCANCEL) = IDYES then
50 daniel-mar 595
      begin
52 daniel-mar 596
        Ping1.Click;
50 daniel-mar 597
      end;
598
    end;
599
  end;
600
end;
601
 
57 daniel-mar 602
function TMainForm.Status: boolean;
603
var
604
  i: integer;
605
  s: string;
606
begin
607
  for i := 1 to MonitorGrid.RowCount - 1 do
608
  begin
609
    s := MonitorGrid.Cells[2, i];
610
    if (s <> LNG_STAT_OK) and (s <> LNG_STAT_UNKNOWN) and
611
       (s <> LNG_STAT_QUEUE) and (s <> LNG_STAT_CHECKING) and
612
       (s <> '') then
613
    begin
614
      result := false;
615
      exit;
616
    end;
617
  end;
618
  result := true;
619
end;
620
 
52 daniel-mar 621
// Ref: http://delphi.about.com/od/adptips2006/qt/rightalignmenu.htm
622
(* procedure TMainForm.RightAlignHelpMenuItem;
623
var
624
  mii: TMenuItemInfo;
625
  hMainMenu: hMenu;
626
  Buffer: array[0..79] of Char;
627
begin
628
  hMainMenu := Self.Menu.Handle;
629
 
630
  //GET Help Menu Item Info
631
  mii.cbSize := SizeOf(mii) ;
632
  mii.fMask := MIIM_TYPE;
633
  mii.dwTypeData := Buffer;
634
  mii.cch := SizeOf(Buffer) ;
635
  GetMenuItemInfo(hMainMenu, MHelp.Command, false, mii) ;
636
 
637
  //SET Help Menu Item Info
638
  mii.fType := mii.fType or MFT_RIGHTJUSTIFY;
639
  SetMenuItemInfo(hMainMenu, MHelp.Command, false, mii) ;
640
end; *)
641
 
642
procedure TMainForm.MonitorGridMouseDown(Sender: TObject;
50 daniel-mar 643
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
644
var
645
  col, row: integer;
646
begin
647
  if Button = mbRight then
648
  begin
52 daniel-mar 649
    MonitorGrid.MouseToCell(X, Y, col, row);
650
    if row >= MonitorGrid.FixedRows then
651
      MonitorGrid.Row := row;
50 daniel-mar 652
 
52 daniel-mar 653
    if col >= MonitorGrid.FixedCols then
654
      MonitorGrid.Col := col;
50 daniel-mar 655
 
52 daniel-mar 656
    if (row >= MonitorGrid.FixedRows) and
657
       (col >= MonitorGrid.FixedCols) then
50 daniel-mar 658
    begin
52 daniel-mar 659
      MonitorGrid.PopupMenu := MenuPopupMenu;
50 daniel-mar 660
    end
661
    else
662
    begin
52 daniel-mar 663
      MonitorGrid.PopupMenu := nil;
50 daniel-mar 664
    end;
665
  end;
666
end;
667
 
668
procedure TMainForm.Edit1Click(Sender: TObject);
669
begin
52 daniel-mar 670
  Edit2.Click;
50 daniel-mar 671
end;
672
 
52 daniel-mar 673
procedure TMainForm.Edit2Click(Sender: TObject);
674
begin
675
  if EditForm.ShowDialog(GetCurrentMonitorName) then LoadList;
676
end;
677
 
678
procedure TMainForm.Delete2Click(Sender: TObject);
50 daniel-mar 679
var
680
  reg: TRegistry;
681
begin
52 daniel-mar 682
  if MessageBox(Handle, PChar(Format(LNG_DELETE_TEXT, [GetCurrentMonitorName])), PChar(LNG_DELETE_CAPTION), MB_ICONQUESTION or MB_YESNOCANCEL) = IDYES then
50 daniel-mar 683
  begin
684
    reg := TRegistry.Create;
685
    try
686
      reg.RootKey := HKEY_CURRENT_USER;
52 daniel-mar 687
      if reg.DeleteKey(Format(REG_KEY_SERVICE, [GetCurrentMonitorName])) then LoadList;
50 daniel-mar 688
    finally
689
      reg.Free;
690
    end;
691
  end;
692
end;
693
 
52 daniel-mar 694
procedure TMainForm.Delete1Click(Sender: TObject);
50 daniel-mar 695
begin
52 daniel-mar 696
  Delete2.Click;
50 daniel-mar 697
end;
698
 
52 daniel-mar 699
procedure TMainForm.Checknow1Click(Sender: TObject);
50 daniel-mar 700
begin
52 daniel-mar 701
  Checknow2.Click;
50 daniel-mar 702
end;
703
 
52 daniel-mar 704
procedure TMainForm.Checknow2Click(Sender: TObject);
51 daniel-mar 705
begin
52 daniel-mar 706
  ProcessStatMon(MonitorGrid.Row, true);
51 daniel-mar 707
end;
708
 
52 daniel-mar 709
procedure TMainForm.MConnWarnOptClick(Sender: TObject);
710
var
711
  reg: TRegistry;
712
begin
713
  reg := TRegistry.Create;
714
  try
715
    reg.RootKey := HKEY_CURRENT_USER;
716
    if reg.OpenKey(REG_KEY_SETTINGS, true) then
717
    begin
718
      WarnAtConnectivityFailure := MConnWarnOpt.Checked;
719
      reg.WriteBool(REG_VAL_WARN_AT_CONNFAILURE, WarnAtConnectivityFailure);
720
    end;
721
  finally
722
    reg.Free;
723
  end;
724
end;
725
 
50 daniel-mar 726
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
727
begin
728
  Hide;
729
  CanClose := RealClose;
730
end;
731
 
57 daniel-mar 732
procedure TMainForm.OnQueryEndSession(var Msg: TWMQueryEndSession);
50 daniel-mar 733
begin
734
  RealClose := true;
735
  Close;
736
  Msg.Result := 1;
737
end;
738
 
52 daniel-mar 739
procedure TMainForm.OnWmQuit(var Msg: TWMQuit);
740
begin
741
  RealClose := true;
742
  Close;
743
  Msg.Result := 1;
744
end;
745
 
50 daniel-mar 746
end.