Statistiques
| Révision:

root / UFMenu.pas

Historique | Voir | Annoter | Télécharger (35,615 ko)

1 3 avalancogn
unit UFMenu;
2
3
{$WARN UNIT_PLATFORM OFF}
4
5
interface
6
7
uses
8
  Windows, Forms, Classes, Controls, Dialogs, Graphics, StdCtrls, Buttons,
9
  ExtCtrls, ComCtrls, Menus, XPMan, IdBaseComponent, IdComponent,
10
  IdTCPConnection, IdTCPClient, IdHTTP, IdIOHandler, IdIOHandlerSocket,
11
  IdIOHandlerStack, IdSSL, IdSSLOpenSSL;
12
13
type
14
  TFMenu = class (TForm)
15
    StatusLine : TStatusBar ;
16
    IBackground: TImage;
17
    MainMenu: TMainMenu;
18
    MFile: TMenuItem;
19
    MLicense: TMenuItem;
20
    MConfig: TMenuItem;
21
    MFolder: TMenuItem;
22
    N11: TMenuItem;
23
    MExit: TMenuItem;
24
    MAliments: TMenuItem;
25
    MMatiere: TMenuItem;
26
    N21: TMenuItem;
27
    MAliment: TMenuItem;
28
    MTarif: TMenuItem;
29
    N22: TMenuItem;
30
    MImpExp: TMenuItem;
31
    MTruie: TMenuItem;
32
    MSeqAliT: TMenuItem;
33
    MRationT: TMenuItem;
34
    MLogeT: TMenuItem;
35
    MProfilT: TMenuItem;
36
    N31: TMenuItem;
37
    MSimulT: TMenuItem;
38
    N32: TMenuItem;
39
    MBesGest: TMenuItem;
40
    MBesGestT: TMenuItem;
41
    MBesGestE: TMenuItem;
42
    MBesLact: TMenuItem;
43
    MBesLactT: TMenuItem;
44
    MBesLactE: TMenuItem;
45
    MPorc: TMenuItem;
46
    MSeqAliP: TMenuItem;
47
    MRationP: TMenuItem;
48
    MProfilP: TMenuItem;
49
    N41: TMenuItem;
50
    MSimulP: TMenuItem;
51
    MWindow: TMenuItem;
52
    MCascade: TMenuItem;
53
    MTileHorizontal: TMenuItem;
54
    MTileVertical: TMenuItem;
55
    MMinimizeAll: TMenuItem;
56
    MRetoreAll: TMenuItem;
57
    MArrange: TMenuItem;
58
    MHelp: TMenuItem;
59
    MContents: TMenuItem;
60
    N61: TMenuItem;
61
    MIntro: TMenuItem;
62
    N62: TMenuItem;
63
    MWeb: TMenuItem;
64
    MAbout: TMenuItem;
65
    ILogo: TImage;
66
    XPManifestStyle: TXPManifest;
67
    MUpdate: TMenuItem;
68
    IdHTTPCheckVersion: TIdHTTP;
69
    MDataset: TMenuItem;
70
    IdSSL: TIdSSLIOHandlerSocketOpenSSL;
71
    procedure FormShow(Sender: TObject);
72
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
73
    procedure MConfigClick(Sender: TObject);
74
    procedure MExitClick(Sender: TObject);
75
    procedure MMatiereClick(Sender: TObject);
76
    procedure MAlimentClick(Sender: TObject);
77
    procedure MTarifClick(Sender: TObject);
78
    procedure MImpExpClick(Sender: TObject);
79
    procedure MSeqAliTClick(Sender: TObject);
80
    procedure MRationTClick(Sender: TObject);
81
    procedure MLogeTClick(Sender: TObject);
82
    procedure MProfilTClick(Sender: TObject);
83
    procedure MSimulTClick(Sender: TObject);
84
    procedure MSeqAliPClick(Sender: TObject);
85
    procedure MRationPClick(Sender: TObject);
86
    procedure MProfilPClick(Sender: TObject);
87
    procedure MSimulPClick(Sender: TObject);
88
    procedure WindowCascade(Sender: TObject);
89
    procedure MTileHorizontalClick(Sender: TObject);
90
    procedure MTileVerticalClick(Sender: TObject);
91
    procedure MMinimizeAllClick(Sender: TObject);
92
    procedure MRetoreAllClick(Sender: TObject);
93
    procedure MArrangeClick(Sender: TObject);
94
    procedure HelpContentsClick(Sender: TObject);
95
    procedure HelpIndexClick(Sender: TObject);
96
    procedure MAboutClick(Sender: TObject);
97
    procedure MBesGestTClick(Sender: TObject);
98
    procedure MBesGestEClick(Sender: TObject);
99
    procedure MBesLactTClick(Sender: TObject);
100
    procedure MBesLactEClick(Sender: TObject);
101
    procedure FormResize(Sender: TObject);
102
    procedure MLicenseClick(Sender: TObject);
103
    procedure MFolderClick(Sender: TObject);
104
    procedure MIntroClick(Sender: TObject);
105
    procedure FormCreate(Sender: TObject);
106
    procedure MWebClick(Sender: TObject);
107
    procedure MHelpSearchClick(Sender: TObject);
108
    procedure FormDestroy(Sender: TObject);
109
    procedure MUpdateClick(Sender: TObject);
110
    procedure MDatasetClick(Sender: TObject);
111
  private
112
    { Private declarations }
113
    procedure VerifyData;
114
  public
115
    { Public declarations }
116
  end ;
117
118
var
119
  FMenu : TFMenu ;
120
121
implementation
122
123
uses
124
  FileCtrl, Math, Messages, ShellAPI, SysUtils, gnugettext, UVariables,
125
  UStrings, UInit, UUtil, UFindRec, UFLicense, UFConfig, {UFInraAfz,}
126
  UFMatiere, UFAliment, UFTarif, UFImpExp, UFSeqAliT, UFRationT, UFLogeT,
127
  UFProfilT, UFSimulT, UFBesGestT, UFBesGestE, UFBesLactT, UFBesLactE,
128
  UFSeqAliP, UFRationP, UFProfilP, UFSimulP, UFIntro, UFAbout, UFError,
129
  UFWarning;
130
131
{$r *.dfm}
132
133
var
134
  OldWndProc: Pointer;
135
  WndMsg: DWORD;
136
137
function NewWndProc(WindowHandle: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT stdcall;
138
begin
139
  if Msg = WndMsg
140
  then // Appel par une autre instance : restauration
141
  begin
142
    Result := SendMessage(Application.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
143
    SetForegroundWindow(Application.Handle);
144
    Exit;
145
  end;
146
  if WParam = VK_F1
147
  then // F1 = Help
148
    Result := HtmlHelp(Application.Handle, PChar(Application.CurrentHelpFile), HH_HELP_CONTEXT, FMenu.HelpContext)
149
  else
150
    Result := CallWindowProc(OldWndProc, WindowHandle, Msg, WParam, LParam);
151
end;
152
153
procedure TFMenu.FormCreate(Sender: TObject);
154
begin
155
  WndMsg := RegisterWindowMessage('InraPorc');
156
  OldWndProc := Pointer(SetWindowLong(Handle, GWL_WNDPROC, Longint(@NewWndProc)));
157
  if Screen.Fonts.IndexOf('Arial Unicode MS') <> -1
158
  then
159
  begin
160
    Font.Name := 'Arial Unicode MS';
161
    StatusLine.Font.Name := 'Arial Unicode MS';
162
  end;
163
  TranslateComponent(Self);
164
  Constraints.MinHeight := Min(768, Screen.WorkAreaHeight);
165
  Constraints.MinWidth := Min(1024, Screen.WorkAreaWidth);
166
end;
167
168
procedure TFMenu.FormDestroy(Sender: TObject);
169
begin
170
  SetWindowLong(Handle, GWL_WNDPROC, Longint(OldWndProc));
171
end;
172
173
procedure TFMenu.FormShow(Sender: TObject);
174
var
175
  CurrentVersion: string;
176
begin
177
  // Recherche automatique de mises-?-jours
178
  if CheckForUpdates then
179
  begin
180
    IdHTTPCheckVersion.ConnectTimeout := 10000;
181
    try
182
      CurrentVersion := IdHTTPCheckVersion.Get(URL_HTTPS + 'CheckVersion.php');
183
      if Length(CurrentVersion) = 7 then
184
        if CompareString(LOCALE_INVARIANT, NORM_IGNORECASE, PChar(CurrentVersion), Length(CurrentVersion), PChar(VersionString), Length(VersionString)) = CSTR_GREATER_THAN then
185
        begin
186
          if Copy(LanguageCode, 1, 2) = 'fr'
187
          then // Fran?ais
188
            ShellExecute(Handle, 'open', PChar(URL_HTTPS + 'history_fr.php'), nil, nil, SW_SHOWNORMAL)
189
          else // Anglais
190
            ShellExecute(Handle, 'open', PChar(URL_HTTPS + 'history_en.php'), nil, nil, SW_SHOWNORMAL);
191
          if MessageDlg(Format(MsgUpdateFound, [CurrentVersion]), mtConfirmation, [mbYes, mbNo], 0) = mrYes then
192
            ShellExecute(Handle, 'open', PChar(URL_HTTPS + Format('Downloads/%s/InraPorcSetup.exe', [CurrentVersion])), nil, nil, SW_SHOWNORMAL);
193
        end;
194
    except
195
    end;
196
  end;
197
  // Initialisation du contr?le des fen?tres MDI
198
  NumWinMatiere := -1;
199
  NumWinAliment := -1;
200
  NumWinTarif := -1;
201
  NumWinImpExp := -1;
202
  NumWinSeqAliT := -1;
203
  NumWinRationT := -1;
204
  NumWinLogeT := -1;
205
  NumWinProfilT := -1;
206
  NumWinSimulT := -1;
207
  NumWinBesGestT := -1;
208
  NumWinBesGestE := -1;
209
  NumWinBesLactT := -1;
210
  NumWinBesLactE := -1;
211
  NumWinSeqAliP := -1;
212
  NumWinRationP := -1;
213
  NumWinProfilP := -1;
214
  NumWinSimulP := -1;
215
  // Taille et position de la fen?tre principale
216
  SetBounds(MainLeft, MainTop, MainWidth, MainHeight);
217
  FormResize(nil);
218
  if FileExists(Logo)
219
  then
220
    ILogo.Picture.LoadFromFile(Logo);
221
  if DataFolderExists
222
  then
223
    VerifyData
224
  else
225
  begin
226
    MAliments.Enabled := False;
227
    MTruie.Enabled := False;
228
    MPorc.Enabled := False;
229
  end;
230
end;
231
232
procedure TFMenu.FormClose(Sender: TObject; var Action: TCloseAction);
233
var
234
  i: Integer;
235
begin
236
  if MDIChildCount > 0
237
  then
238
    for i := MDIChildCount - 1 downto 0 do
239
      MDIChildren[i].Close;
240
  FreeData ;
241
//  FreeLicense;
242
//  FreeRegistry;
243
end;
244
245
procedure TFMenu.FormResize(Sender: TObject);
246
var
247
  {BorderSize,} TextSize: Integer;
248
begin
249
  MImpExp.Enabled := IsComplete ;
250
  // Licence
251
  if IsEducation and (Length (Course) > 0)
252
  then
253
    StatusLine.Panels[1].Text := Format('%s (%s)', [Course, Company])
254
  else
255
  if IsComplete or IsEducation
256
  then
257
    StatusLine.Panels[1].Text := Format('%s %s (%s)', [FirstName, LastName, Company])
258
  else
259
  if IsEvaluation
260
  then
261
    StatusLine.Panels[1].Text := StrEvaluation
262
  else
263
    StatusLine.Panels[1].Text := StrReadOnly;
264
//  BorderSize := Width - ClientWidth;
265
  TextSize := StatusLine.Canvas.TextWidth(StatusLine.Panels[1].Text);
266
  with StatusLine do
267
    Panels[0].Width := ClientWidth - TextSize - 24;
268
end;
269
270
procedure TFMenu.VerifyData;
271
const
272
  SEP = '        ';
273
var
274
  i, j, ErrorCount: Integer;
275
  ErrorInraAfz, ok: Boolean;
276
begin
277
  if (not FileExists(NFicRationP) and FileExists(NFicRationPold))
278
  or (not FileExists(NFicProfilP) and FileExists(NFicProfilPold))
279
  then // L'ancien jeu de donn?es n'a pas ?t? converti
280
    Exit;
281
  ErrorCount := 0;
282
  ErrorInraAfz := FALSE;
283
  FError := TFError.Create(Self);
284
  FError.MErrors.Lines.Add(MAliments.Caption);
285
  // Mati?re premi?re
286
  FError.MErrors.Lines.Add(SEP + MMatiere.Caption);
287
  if not FileExists(NFicMatInraAfz)
288
  then
289
    FError.MErrors.Lines.Add(SEP + SEP + Format(MsgFileNotFound, [NFicMatInraAfz]));
290
  if not FileExists(NFicMatiere)
291
  then
292
  begin
293
    Inc(ErrorCount);
294
    FError.MErrors.Lines.Add(SEP + SEP + Format(MsgFileNotFound, [NFicMatiere]));
295
  end;
296
  // Aliment
297
  FError.MErrors.Lines.Add(SEP + MAliment.Caption);
298
  if not FileExists(NFicAliment)
299
  then
300
  begin
301
    Inc(ErrorCount);
302
    FError.MErrors.Lines.Add(SEP + SEP + Format(MsgFileNotFound, [NFicAliment]));
303
  end;
304
  if ListAliment.Count > 0
305
  then
306
    for i := 0 to ListAliment.Count - 1 do
307
    begin
308
      PAliment := ListAliment[i];
309
      if (PAliment.MP.NbMat < 0) or (PAliment.MP.NbMat > MAX_MP)
310
      then // Bug lors de l'importation (correction du 1/3/2007)
311
        PAliment.MP.NbMat := 0;
312
      if PAliment.MP.NbMat > 0
313
      then
314
        for j := 0 to PAliment.MP.NbMat - 1 do
315
          if (PAliment.MP.NumMat[j] <> 0) and not MatiereFound(PAliment.MP.NumMat[j])
316
          then
317
          begin
318
            Inc(ErrorCount);
319
            if PAliment.MP.NumMat[j] < 0
320
            then
321
              ErrorInraAfz := TRUE;
322
            FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PAliment.Nom, MMatiere.Caption, PAliment.MP.NumMat[j]]));
323
            PAliment.MP.NumMat[j] := 0;
324
          end;
325
    end;
326
  FError.MErrors.Lines.Add(MTruie.Caption);
327
  // S?quence alimentaire truie
328
  FError.MErrors.Lines.Add(SEP + MSeqAliT.Caption);
329
  if not FileExists(NFicSeqAliT)
330
  then
331
  begin
332
    Inc(ErrorCount);
333
    FError.MErrors.Lines.Add(SEP + SEP + Format(MsgFileNotFound, [NFicSeqAliT]));
334
  end;
335
  if ListSeqAliT.Count > 0
336
  then
337
    for i := 0 to ListSeqAliT.Count - 1 do
338
    begin
339
      PSeqAliT := ListSeqAliT[i];
340
      for j := 1 to PSeqAliT.NbRuleGest do
341
      begin
342
        if (PSeqAliT.RuleGest[j].NumAli1 <> -1) and not AlimentFound(PSeqAliT.RuleGest[j].NumAli1)
343
        then
344
        begin
345
          Inc(ErrorCount);
346
          FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSeqAliT.Nom, MAliment.Caption, PSeqAliT.RuleGest[j].NumAli1]));
347
          PSeqAliT.RuleGest[j].NumAli1 := -1;
348
        end;
349
        if (PSeqAliT.RuleGest[j].NumAli2 <> -1) and not AlimentFound(PSeqAliT.RuleGest[j].NumAli2)
350
        then
351
        begin
352
          Inc(ErrorCount);
353
          FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSeqAliT.Nom, MAliment.Caption, PSeqAliT.RuleGest[j].NumAli2]));
354
          PSeqAliT.RuleGest[j].NumAli2 := -1;
355
        end;
356
      end;
357
      for j := 1 to PSeqAliT.NbRuleLact do
358
      begin
359
        if (PSeqAliT.RuleLact[j].NumAli1 <> -1) and not AlimentFound(PSeqAliT.RuleLact[j].NumAli1)
360
        then
361
        begin
362
          Inc(ErrorCount);
363
          FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSeqAliT.Nom, MAliment.Caption, PSeqAliT.RuleLact[j].NumAli1]));
364
          PSeqAliT.RuleLact[j].NumAli1 := -1;
365
        end;
366
        if (PSeqAliT.RuleLact[j].NumAli2 <> -1) and not AlimentFound(PSeqAliT.RuleLact[j].NumAli2)
367
        then
368
        begin
369
          Inc(ErrorCount);
370
          FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSeqAliT.Nom, MAliment.Caption, PSeqAliT.RuleLact[j].NumAli2]));
371
          PSeqAliT.RuleLact[j].NumAli2 := -1;
372
        end;
373
      end;
374
      for j := 1 to PSeqAliT.NbRuleISSF do
375
      begin
376
        if (PSeqAliT.RuleISSF[j].NumAli1 <> -1) and not AlimentFound(PSeqAliT.RuleISSF[j].NumAli1)
377
        then
378
        begin
379
          Inc(ErrorCount);
380
          FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSeqAliT.Nom, MAliment.Caption, PSeqAliT.RuleISSF[j].NumAli1]));
381
          PSeqAliT.RuleISSF[j].NumAli1 := -1;
382
        end;
383
        if (PSeqAliT.RuleISSF[j].NumAli2 <> -1) and not AlimentFound(PSeqAliT.RuleISSF[j].NumAli2)
384
        then
385
        begin
386
          Inc(ErrorCount);
387
          FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSeqAliT.Nom, MAliment.Caption, PSeqAliT.RuleISSF[j].NumAli2]));
388
          PSeqAliT.RuleISSF[j].NumAli2 := -1;
389
        end;
390
      end;
391
    end;
392
  // Plan de rationnement truie
393
  FError.MErrors.Lines.Add(SEP + MRationT.Caption);
394
  if not FileExists(NFicRationT)
395
  then
396
  begin
397
    Inc(ErrorCount);
398
    FError.MErrors.Lines.Add(SEP + SEP + Format(MsgFileNotFound, [NFicRationT]));
399
  end;
400
  // Logement truie
401
  FError.MErrors.Lines.Add(SEP + MLogeT.Caption);
402
  if not FileExists(NFicLogeT)
403
  then
404
  begin
405
    Inc(ErrorCount);
406
    FError.MErrors.Lines.Add(SEP + SEP + Format(MsgFileNotFound, [NFicLogeT]));
407
  end;
408
  // Profil truie
409
  FError.MErrors.Lines.Add(SEP + MProfilT.Caption);
410
  if not FileExists(NFicProfilT)
411
  then
412
  begin
413
    Inc(ErrorCount);
414
    FError.MErrors.Lines.Add(SEP + SEP + Format(MsgFileNotFound, [NFicProfilT]));
415
  end;
416
  if ListProfilT.Count > 0
417
  then
418
    for i := 0 to ListProfilT.Count - 1 do
419
    begin
420
      PProfilT := ListProfilT[i];
421
      if (PProfilT.SeqAli <> -1) and not SeqAliTFound(PProfilT.SeqAli)
422
      then
423
      begin
424
        Inc(ErrorCount);
425
        FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PProfilT.Nom, MSeqAliT.Caption, PProfilT.SeqAli]));
426
        PProfilT.SeqAli := -1;
427
      end;
428
      if (PProfilT.Loge <> -1) and not LogeTFound(PProfilT.Loge)
429
      then
430
      begin
431
        Inc(ErrorCount);
432
        FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PProfilT.Nom, MLogeT.Caption, PProfilT.Loge]));
433
        PProfilT.Loge := -1;
434
      end;
435
    end ;
436
  // Simulation truie
437
  FError.MErrors.Lines.Add(SEP + MSimulT.Caption);
438
  if not FileExists(NFicSimulT)
439
  then
440
  begin
441
    Inc(ErrorCount);
442
    FError.MErrors.Lines.Add(SEP + SEP + Format(MsgFileNotFound, [NFicSimulT]));
443
  end;
444
  if ListSimulT.Count > 0
445
  then
446
    for i := 0 to ListSimulT.Count - 1 do
447
    begin
448
      PSimulT := ListSimulT[i];
449
      if (PSimulT.Profil <> -1) and not ProfilTFound(PSimulT.Profil)
450
      then
451
      begin
452
        Inc(ErrorCount);
453
        FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSimulT.Nom, MProfilT.Caption, PSimulT.Profil]));
454
        PSimulT.Profil := -1;
455
      end;
456
      if (PSimulT.Logement <> -1) and not LogeTFound(PSimulT.Logement)
457
      then
458
      begin
459
        Inc(ErrorCount);
460
        FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSimulT.Nom, MLogeT.Caption, PSimulT.Logement]));
461
        PSimulT.Logement := -1;
462
      end;
463
      for j := 1 to NB_CYCLES do
464
        if (PSimulT.SeqAli[j] <> -1) and not SeqAliTFound(PSimulT.SeqAli[j])
465
        then
466
          if (j < PSimulT.StadeInit div 3) or (j > PSimulT.StadeFin div 3)
467
          then // Port?e masqu?e => correction silencieuse
468
            PSimulT.SeqAli[j] := -1
469
          else
470
          begin
471
            Inc(ErrorCount);
472
            FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSimulT.Nom, MSeqAliT.Caption, PSimulT.SeqAli[j]]));
473
            PSimulT.SeqAli[j] := -1;
474
          end;
475
      for j := 1 to NB_CYCLES do
476
        if (PSimulT.Ration[j] <> -1) and not RationTFound(PSimulT.Ration[j])
477
        then
478
          if (j < PSimulT.StadeInit div 3) or (j > PSimulT.StadeFin div 3)
479
          then // Port?e masqu?e => correction silencieuse
480
            PSimulT.Ration[j] := -1
481
          else
482
          begin
483
            Inc(ErrorCount);
484
            FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSimulT.Nom, MRationT.Caption, PSimulT.Ration[j]]));
485
            PSimulT.Ration[j] := -1;
486
          end;
487
    end ;
488
  FError.MErrors.Lines.Add(MPorc.Caption);
489
  // S?quence alimentaire porc
490
  FError.MErrors.Lines.Add(SEP + MSeqAliP.Caption);
491
  if not FileExists(NFicSeqAliP)
492
  then
493
  begin
494
    Inc(ErrorCount);
495
    FError.MErrors.Lines.Add(SEP + SEP + Format(MsgFileNotFound, [NFicSeqAliP]));
496
  end;
497
  if ListSeqAliP.Count > 0
498
  then
499
    for i := 0 to ListSeqAliP.Count - 1 do
500
    begin
501
      PSeqAliP := ListSeqAliP[i];
502
      for j := 1 to PSeqAliP.NbRule do
503
      begin
504
        if (PSeqAliP.Rule[j].NumAli1 <> -1) and not AlimentFound(PSeqAliP.Rule[j].NumAli1)
505
        then
506
        begin
507
          Inc(ErrorCount);
508
          FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSeqAliP.Nom, MAliment.Caption, PSeqAliP.Rule[j].NumAli1]));
509
          PSeqAliP.Rule[j].NumAli1 := -1;
510
        end;
511
        if (PSeqAliP.Rule[j].NumAli2 <> -1) and not AlimentFound(PSeqAliP.Rule[j].NumAli2)
512
        then
513
        begin
514
          Inc(ErrorCount);
515
          FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSeqAliP.Nom, MAliment.Caption, PSeqAliP.Rule[j].NumAli2]));
516
          PSeqAliP.Rule[j].NumAli2 := -1;
517
        end;
518
      end;
519
    end;
520
  // Plan de rationnement porc
521
  FError.MErrors.Lines.Add(SEP + MRationP.Caption);
522
  if not FileExists(NFicRationP)
523
  then
524
  begin
525
    Inc(ErrorCount);
526
    FError.MErrors.Lines.Add(SEP + SEP + Format(MsgFileNotFound, [NFicRationP]));
527
  end;
528
  // Profil porc
529
  FError.MErrors.Lines.Add(SEP + MProfilP.Caption);
530
  if not FileExists(NFicProfilP)
531
  then
532
  begin
533
    Inc(ErrorCount);
534
    FError.MErrors.Lines.Add(SEP + SEP + Format(MsgFileNotFound, [NFicProfilP]));
535
  end;
536
  if ListProfilP.Count > 0
537
  then
538
    for i := 0 to ListProfilP.Count - 1 do
539
    begin
540
      PProfilP := ListProfilP[i];
541
      if (PProfilP.SeqAli <> -1) and not SeqAliPFound(PProfilP.SeqAli)
542
      then
543
      begin
544
        Inc(ErrorCount);
545
        FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PProfilP.Nom, MSeqAliP.Caption, PProfilP.SeqAli]));
546
        PProfilP.SeqAli := -1;
547
      end;
548
    end ;
549
  // Simulation porc
550
  FError.MErrors.Lines.Add(SEP + MSimulP.Caption);
551
  if not FileExists(NFicSimulP)
552
  then
553
  begin
554
    Inc(ErrorCount);
555
    FError.MErrors.Lines.Add(SEP + SEP + Format(MsgFileNotFound, [NFicSimulP]));
556
  end;
557
  if ListSimulP.Count > 0
558
  then
559
    for i := 0 to ListSimulP.Count - 1 do
560
    begin
561
      PSimulP := ListSimulP[i];
562
      if (PSimulP.Profil <> -1) and not ProfilPFound(PSimulP.Profil)
563
      then
564
      begin
565
        Inc(ErrorCount);
566
        FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSimulP.Nom, MProfilP.Caption, PSimulP.Profil]));
567
        PSimulP.Profil := -1;
568
      end;
569
      if (PSimulP.SeqAli <> -1) and not SeqAliPFound(PSimulP.SeqAli)
570
      then
571
      begin
572
        Inc(ErrorCount);
573
        FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSimulP.Nom, MSeqAliP.Caption, PSimulP.SeqAli]));
574
        PSimulP.SeqAli := -1;
575
      end;
576
      if (PSimulP.Ration <> -1) and not RationPFound(PSimulP.Ration)
577
      then
578
      begin
579
        Inc(ErrorCount);
580
        FError.MErrors.Lines.Add(SEP + SEP + Format('%s - %s %d', [PSimulP.Nom, MRationP.Caption, PSimulP.Ration]));
581
        PSimulP.Ration := -1;
582
      end;
583
    end ;
584
  // Traitement des erreurs
585
  ok := ErrorCount = 0;
586
  if not ok
587
  then
588
    if ErrorInraAfz
589
    then
590
    begin
591
      FWarning := TFWarning.Create (Self) ;
592
      with FWarning do
593
      begin
594
        Msg := 'InraAfz';
595
        CBDisplay.Visible := FALSE;
596
        ShowModal;
597
        Release;
598
      end;
599
    end
600
    else
601
      ok := FError.ShowModal = mrYes;
602
  MAliments.Enabled := ok;
603
  MTruie.Enabled := ok;
604
  MPorc.Enabled := ok;
605
end;
606
607
// "Menu Fichier"
608
609
procedure TFMenu.MLicenseClick(Sender: TObject);
610
begin
611
  FLicense := TFLicense.Create(Self);
612
  FLicense.ShowModal;
613
  FLicense.Release;
614
  // Adaptation taille StatusLine
615
  FormResize(nil);
616
end;
617
618
procedure TFMenu.MConfigClick(Sender: TObject);
619
var
620
  i, typ, mat, typmat, typali: Integer;
621
//  rec: PRecMatiere;
622
  FileName: String;
623
begin
624
  FConfig := TFConfig.Create(Self);
625
  if FConfig.ShowModal <> mrOK
626
  then // chargement de la configuration
627
    LoadConfig
628
  else
629
    if ConfigChanged
630
    then
631
    begin
632
      if NewFolder <> Folder
633
      then // Changement du dossier de donn?es par d?faut
634
      begin
635
        Folder := NewFolder;
636
        // Fermeture de toutes les fen?tres enfants
637
        if MDIChildCount > 0
638
        then
639
          for i := MDIChildCount - 1 downto 0 do
640
            MDIChildren[i].Close;
641
        // Changement de r?pertoire
642
        SetCurrentDir(Folder);
643
        // Rechargement des donn?es
644
        LoadData;
645
        VerifyData;
646
        if ((LicenseType = 0) or (LicenseType = 1)) and TooMuchRecords
647
        then // Trop d'enregistrements
648
          MessageDlg(MsgTooMuchRecords, mtWarning, [mbOk], 0);
649
        // Adaptation taille StatusLine
650
        FormResize(nil);
651
      end;
652
      if NewLogo <> Logo
653
      then // Changement du logo
654
      begin
655
        Logo := NewLogo;
656
        if FileExists(Logo)
657
        then
658
          ILogo.Picture.LoadFromFile(Logo)
659
        else
660
          ILogo.Picture.LoadFromFile('');
661
        InvalidateRect(ClientHandle, nil, TRUE);
662
      end;
663
      {
664
      if NewLanguageExt <> LanguageExt
665
      then // Changement de la langue
666
      begin
667
        LanguageExt := NewLanguageExt;
668
        MessageDlg(MsgLang, mtWarning, [mbOk], 0);
669
      end;
670
      }
671
      if NewLanguageCode <> LanguageCode
672
      then // Changement de la langue
673
      begin
674
        mat := -1;
675
        typ := -1;
676
        typmat := -1;
677
        typali := -1;
678
        if NumWinMatiere <> -1
679
        then // Composition mati?re premi?re
680
          if FMatiere.CBMatiere.ItemIndex <> -1
681
          then // Sauvegarder la position courante
682
            mat := FindNumMatiere(FMatiere.CBMatiere.Text);
683
        if NumWinAliment <> -1
684
        then // Composition aliment
685
          typ := FAliment.CBType.ItemIndex;
686
        if NumWinImpExp <> -1
687
        then // Import / export
688
        begin
689
          typmat := FImpExp.CBTypeMat.ItemIndex;
690
          typali := FImpExp.CBTypeAli.ItemIndex;
691
        end;
692
        LanguageCode := NewLanguageCode;
693
        UseLanguage(LanguageCode);
694
        RetranslateComponent(Self);
695
        if MDIChildCount > 0
696
        then // Traduction des fen?tres MDI ouvertes
697
          for i := MDIChildCount - 1 downto 0 do
698
            RetranslateComponent(MDIChildren[i]);
699
        // R?affichage des enregistrements pour prendre en compte la traduction
700
        if NumWinMatiere <> -1
701
        then // Composition mati?re premi?re
702
        begin
703
          StringsMatiere(FMatiere.CBMatiere.Items, 0, TRUE, TRUE);
704
          if mat <> -1
705
          then // Res?lectionner l'enregistrement courant
706
            FMatiere.CBMatiere.ItemIndex := FMatiere.CBMatiere.Items.IndexOf(FindNomMatiere(mat));
707
          FMatiere.CBMatiereChange(nil);
708
        end;
709
        if NumWinAliment <> -1
710
        then // Composition aliment
711
        begin
712
          FAliment.CBType.ItemIndex := typ;
713
          FAliment.CBTypeChange(nil);
714
          FAliment.CBAlimentChange(nil);
715
        end;
716
        if NumWinImpExp <> -1
717
        then // Import / export
718
        begin
719
          FImpExp.CBTypeMat.ItemIndex := typmat;
720
          FImpExp.CBTypeMatChange(nil);
721
          FImpExp.CBTypeAli.ItemIndex := typali;
722
          FImpExp.CBTypeAliChange(nil);
723
        end;
724
        if NumWinSeqAliT <> -1
725
        then // S?quence alimentaire truie
726
          FSeqAliT.CBSeqAliChange(nil);
727
        if NumWinRationT <> -1
728
        then // Plan de rationnement truie
729
          FRationT.CBRationChange(nil);
730
        if NumWinLogeT <> -1
731
        then // Logement truie
732
          FLogeT.CBLogeChange(nil);
733
        if NumWinProfilT <> -1
734
        then // Profil truie
735
          FProfilT.CBProfilChange(nil);
736
        if NumWinSimulT <> -1
737
        then // Simulation truie
738
          FSimulT.CBSimulChange(nil);
739
        {
740
        if NumWinBesGestT <> -1
741
        then // Besoin gestation truie
742
        begin
743
          FBesGestT.CBLoge.Clear;
744
          FBesGestT.CBLoge.Items.Add(StrSaisieManuelle);
745
          if ListLogeT.Count > 0
746
          then
747
            for i := 0 to ListLogeT.Count - 1 do
748
            begin
749
              PLogeT := ListLogeT[i];
750
              if LogeTValid(PLogeT)
751
              then
752
                FBesGestT.CBLoge.Items.Add(PLogeT.Nom);
753
            end;
754
          FBesGestT.CBLoge.ItemIndex := 0;
755
          FBesGestT.CBLogeChange(nil);
756
          FBesGestT.CBProfilChange(nil);
757
        end;
758
        if NumWinBesGestE <> -1
759
        then // Besoin gestation ?levage
760
          FBesGestE.CBProfilChange(nil);
761
        if NumWinBesLactT <> -1
762
        then // Besoin lactation truie
763
          FBesLactT.CBProfilChange(nil);
764
        if NumWinBesLactE <> -1
765
        then // Besoin lactation ?levage
766
          FBesLactE.CBProfilChange(nil);
767
        }
768
        if NumWinSeqAliP <> -1
769
        then // S?quence alimentaire porc
770
          FSeqAliP.CBSeqAliChange(nil);
771
        if NumWinRationP <> -1
772
        then // Plan de rationnement porc
773
          FRationP.CBRationChange(nil);
774
        if NumWinProfilP <> -1
775
        then // Profil porc
776
          FProfilP.CBProfilChange(nil);
777
        if NumWinSimulP <> -1
778
        then // Simulation porc
779
          FSimulP.CBSimulChange(nil);
780
        FormResize(nil);
781
        // Aide
782
        if Copy(LanguageCode, 1, 2) = 'fr'
783
        then // Fran?ais
784
          FileName := ChangeFileExt(Application.ExeName, '_fr.chm')
785
        else // Anglais
786
          FileName := ChangeFileExt(Application.ExeName, '_en.chm');
787
        if FileExists(FileName)
788
        then
789
          Application.HelpFile := FileName;
790
      end;
791
      SaveConfig;
792
      if NumWinMatiere <> -1
793
      then // Composition mati?re premi?re : Mode d'expression
794
      begin
795
        FMatiere.AjustCaption;
796
        FMatiere.AjustDecimals;
797
        FMatiere.IdxMatiere := -1; // Eviter la sauvegarde automatique
798
        FMatiere.CBMatiereChange(nil); // R?afficher l'enregistrement
799
      end ;
800
      if NumWinAliment <> -1
801
      then // Composition aliment : Mode d'expression
802
      begin
803
        FAliment.AjustCaption;
804
        FAliment.AjustDecimals;
805
        FAliment.IdxAliment := -1; // Eviter la sauvegarde automatique
806
        FAliment.CBAlimentChange(nil); // R?afficher l'enregistrement
807
      end ;
808
      if NumWinProfilP <> -1
809
      then // ProfilP : Caract?ristiques de la carcasse
810
        FProfilP.PCChange(nil); // Recalculer les simulations
811
      if NumWinImpExp <> -1
812
      then // Import / Export : Mode d'expression
813
        FImpExp.DisplayConfig;
814
    end;
815
  FConfig.Release;
816
end;
817
818
procedure TFMenu.MDatasetClick(Sender: TObject);
819
var
820
  FileName: String;
821
begin
822
  FileName := ExtractFilePath(Application.ExeName) + 'InstData.exe';
823
  if FileExists(FileName)
824
  then
825
    ShellExecute(Handle, 'open', PChar(FileName), nil, nil, SW_SHOWNORMAL);
826
end;
827
828
procedure TFMenu.MFolderClick(Sender: TObject);
829
var
830
  i: Integer;
831
  NewDir: String;
832
begin
833
  // Fermeture de toutes les fen?tres enfants
834
  if MDIChildCount > 0
835
  then
836
    for i := MDIChildCount - 1 downto 0 do
837
      MDIChildren[i].Close;
838
  // Changement de r?pertoire
839
  NewDir := GetCurrentDir;
840
  if SelectDirectory(StrSelectDir, '', NewDir)
841
  and DirectoryExists(NewDir)
842
  and (NewDir <> GetCurrentDir)
843
  then
844
  begin
845
    SetCurrentDir(NewDir);
846
    // Rechargement des donn?es
847
    LoadData;
848
    VerifyData;
849
  end;
850
  if ((LicenseType = 0) or (LicenseType = 1)) and TooMuchRecords
851
  then // Trop d'enregistrements
852
    MessageDlg(MsgTooMuchRecords, mtWarning, [mbOk], 0);
853
  FormResize(nil);
854
end;
855
856
procedure TFMenu.MExitClick(Sender: TObject);
857
begin
858
  Close;
859
end;
860
861
// Menu "Aliment"
862
863
procedure TFMenu.MMatiereClick(Sender: TObject);
864
begin
865
  if NumWinMatiere < 0
866
  then // Cr?ation
867
  begin
868
    NumWinMatiere := MDIChildCount;
869
    FMatiere := TFMatiere.Create(Self);
870
    FMatiere.Show;
871
  end
872
  else // Mise au premier plan
873
    FMatiere.BringToFront;
874
end;
875
876
procedure TFMenu.MAlimentClick(Sender: TObject);
877
begin
878
  if NumWinAliment < 0
879
  then // Cr?ation
880
  begin
881
    NumWinAliment := MDIChildCount;
882
    FAliment := TFAliment.Create(Self);
883
    FAliment.Show;
884
  end
885
  else // Mise au premier plan
886
    FAliment.BringToFront;
887
end;
888
889
procedure TFMenu.MTarifClick(Sender: TObject);
890
begin
891
  if NumWinTarif < 0
892
  then // Cr?ation
893
  begin
894
    NumWinTarif := MDIChildCount;
895
    FTarif := TFTarif.Create(Self);
896
    FTarif.Show;
897
  end
898
  else // Mise au premier plan
899
    FTarif.BringToFront;
900
end;
901
902
procedure TFMenu.MImpExpClick(Sender: TObject);
903
begin
904
  if NumWinImpExp < 0
905
  then // Cr?ation
906
  begin
907
    NumWinImpExp := MDIChildCount;
908
    FImpExp := TFImpExp.Create(Self);
909
    FImpExp.Show;
910
  end
911
  else // Mise au premier plan
912
    FImpExp.BringToFront;
913
end;
914
915
// Menu "Truie reproductrice"
916
917
procedure TFMenu.MSeqAliTClick(Sender: TObject);
918
begin
919
  if NumWinSeqAliT < 0
920
  then // Cr?ation
921
  begin
922
    NumWinSeqAliT := MDIChildCount;
923
    FSeqAliT := TFSeqAliT.Create(Self);
924
    FSeqAliT.Show;
925
  end
926
  else // Mise au premier plan
927
    FSeqAliT.BringToFront;
928
end;
929
930
procedure TFMenu.MRationTClick(Sender: TObject);
931
begin
932
  if NumWinRationT < 0
933
  then // Cr?ation
934
  begin
935
    NumWinRationT := MDIChildCount;
936
    FRationT := TFRationT.Create(Self);
937
    FRationT.Show;
938
  end
939
  else // Mise au premier plan
940
    FRationT.BringToFront;
941
end;
942
943
procedure TFMenu.MLogeTClick(Sender: TObject);
944
begin
945
  if NumWinLogeT < 0
946
  then // Cr?ation
947
  begin
948
    NumWinLogeT := MDIChildCount;
949
    FLogeT := TFLogeT.Create(Self);
950
    FLogeT.Show;
951
  end
952
  else // Mise au premier plan
953
    FLogeT.BringToFront;
954
end;
955
956
procedure TFMenu.MProfilTClick(Sender: TObject);
957
begin
958
  if NumWinProfilT < 0
959
  then // Cr?ation
960
  begin
961
    NumWinProfilT := MDIChildCount;
962
    FProfilT := TFProfilT.Create(Self);
963
    FProfilT.Show;
964
  end
965
  else // Mise au premier plan
966
    FProfilT.BringToFront;
967
end;
968
969
procedure TFMenu.MSimulTClick(Sender: TObject);
970
begin
971
  if NumWinSimulT < 0
972
  then // Cr?ation
973
  begin
974
    NumWinSimulT := MDIChildCount;
975
    FSimulT := TFSimulT.Create(Self);
976
    FSimulT.Show;
977
  end
978
  else // Mise au premier plan
979
    FSimulT.BringToFront;
980
end;
981
982
procedure TFMenu.MBesGestTClick(Sender: TObject);
983
begin
984
  if NumWinBesGestT < 0
985
  then // Cr?ation
986
  begin
987
    NumWinBesGestT := MDIChildCount;
988
    FBesGestT := TFBesGestT.Create(Self);
989
    FBesGestT.Show;
990
  end
991
  else // Mise au premier plan
992
    FBesGestT.BringToFront;
993
end;
994
995
procedure TFMenu.MBesGestEClick(Sender: TObject);
996
begin
997
  if NumWinBesGestE < 0
998
  then // Cr?ation
999
  begin
1000
    NumWinBesGestE := MDIChildCount;
1001
    FBesGestE := TFBesGestE.Create(Self);
1002
    FBesGestE.Show;
1003
  end
1004
  else // Mise au premier plan
1005
    FBesGestE.BringToFront;
1006
end;
1007
1008
procedure TFMenu.MBesLactTClick(Sender: TObject);
1009
begin
1010
  if NumWinBesLactT < 0
1011
  then // Cr?ation
1012
  begin
1013
    NumWinBesLactT := MDIChildCount;
1014
    FBesLactT := TFBesLactT.Create(Self);
1015
    FBesLactT.Show;
1016
  end
1017
  else // Mise au premier plan
1018
    FBesLactT.BringToFront;
1019
end;
1020
1021
procedure TFMenu.MBesLactEClick(Sender: TObject);
1022
begin
1023
  if NumWinBesLactE < 0
1024
  then // Cr?ation
1025
  begin
1026
    NumWinBesLactE := MDIChildCount;
1027
    FBesLactE := TFBesLactE.Create(Self);
1028
    FBesLactE.Show;
1029
  end
1030
  else // Mise au premier plan
1031
    FBesLactE.BringToFront;
1032
end;
1033
1034
// Menu "Porc croissance"
1035
1036
procedure TFMenu.MSeqAliPClick(Sender: TObject);
1037
begin
1038
  if NumWinSeqAliP < 0
1039
  then // Cr?ation
1040
  begin
1041
    NumWinSeqAliP := MDIChildCount;
1042
    FSeqAliP := TFSeqAliP.Create(Self);
1043
    FSeqAliP.Show;
1044
  end
1045
  else // Mise au premier plan
1046
    FSeqAliP.BringToFront;
1047
end;
1048
1049
procedure TFMenu.MRationPClick(Sender: TObject);
1050
begin
1051
  if NumWinRationP < 0
1052
  then // Cr?ation
1053
  begin
1054
    NumWinRationP := MDIChildCount;
1055
    FRationP := TFRationP.Create(Self);
1056
    FRationP.Show;
1057
  end
1058
  else // Mise au premier plan
1059
    FRationP.BringToFront;
1060
end;
1061
1062
procedure TFMenu.MProfilPClick(Sender: TObject);
1063
begin
1064
  if NumWinProfilP < 0
1065
  then // Cr?ation
1066
  begin
1067
    NumWinProfilP := MDIChildCount;
1068
    FProfilP := TFProfilP.Create(Self);
1069
    FProfilP.Show;
1070
  end
1071
  else // Mise au premier plan
1072
    FProfilP.BringToFront;
1073
end;
1074
1075
procedure TFMenu.MSimulPClick(Sender: TObject);
1076
begin
1077
  if NumWinSimulP < 0
1078
  then // Cr?ation
1079
  begin
1080
    NumWinSimulP := MDIChildCount;
1081
    FSimulP := TFSimulP.Create(Self);
1082
    FSimulP.Show;
1083
  end
1084
  else // Mise au premier plan
1085
    FSimulP.BringToFront;
1086
end;
1087
1088
// Menu "Fen?tre"
1089
1090
procedure TFMenu.WindowCascade(Sender: TObject);
1091
begin
1092
  Cascade;
1093
end;
1094
1095
procedure TFMenu.MTileHorizontalClick(Sender: TObject);
1096
begin
1097
  TileMode := tbHorizontal;
1098
  Tile;
1099
end;
1100
1101
procedure TFMenu.MTileVerticalClick(Sender: TObject);
1102
begin
1103
  TileMode := tbVertical;
1104
  Tile;
1105
end;
1106
1107
procedure TFMenu.MMinimizeAllClick(Sender: TObject);
1108
var
1109
  i: Integer;
1110
begin
1111
  if MDIChildCount > 0
1112
  then
1113
    for i := MDIChildCount - 1 downto 0 do
1114
      MDIChildren[i].WindowState := wsMinimized;
1115
end;
1116
1117
procedure TFMenu.MRetoreAllClick(Sender: TObject);
1118
var
1119
  i: Integer;
1120
begin
1121
  if MDIChildCount > 0
1122
  then
1123
    for i := MDIChildCount - 1 downto 0 do
1124
      MDIChildren[i].WindowState := wsNormal;
1125
end;
1126
1127
procedure TFMenu.MArrangeClick(Sender: TObject);
1128
begin
1129
  ArrangeIcons;
1130
end;
1131
1132
// Menu "Aide"
1133
1134
procedure TFMenu.HelpContentsClick(Sender: TObject);
1135
begin
1136
//  Application.HelpCommand(HELP_CONTENTS, 0);
1137
//  HtmlHelp(Application.Handle, PChar(Application.CurrentHelpFile), HH_DISPLAY_TOC, 0);
1138
  Application.HelpShowTableOfContents;
1139
end;
1140
1141
procedure TFMenu.HelpIndexClick(Sender: TObject);
1142
begin
1143
//  Application.HelpCommand(HELP_INDEX, 0);
1144
  HtmlHelp(Application.Handle, PChar(Application.CurrentHelpFile), HH_DISPLAY_INDEX, 0);
1145
end;
1146
1147
procedure TFMenu.MHelpSearchClick(Sender: TObject);
1148
var
1149
  q: THH_Fts_Query;
1150
begin
1151
//  Application.HelpCommand(HELP_FINDER, 0);
1152
  with q do
1153
  begin //D?finition de la requ?te
1154
    cbStruct := SizeOf(q); // Taille de la requ?te
1155
    fUniCodeStrings := False; // Mettre ? true si toute la cha?ne recherch?e est de type Unicode
1156
    pszSearchQuery := nil; // Cha?ne recherch?e
1157
    iProximity := -1; // Recherche en respectant les mots similaires
1158
    fStemmedSearch := False; // Mettre ? true pour rechercher dans les r?sultats pr?c?dents
1159
    fTitleOnly := False; // Mettre ? true si la recherche se fait uniquement sur les titres de rubriques
1160
    fExecute := True; // Mettre ? true pour ex?cuter la requ?te
1161
    pszWindow := nil; // Type de fen?tre ? afficher, ici c'est celle par d?faut
1162
  end;
1163
  HtmlHelp(Application.Handle, PChar(Application.CurrentHelpFile), HH_DISPLAY_SEARCH, DWORD(@q));
1164
end;
1165
1166
procedure TFMenu.MIntroClick(Sender: TObject);
1167
begin
1168
  FIntro := TFIntro.Create(Self);
1169
  FIntro.BBOk.Visible := False;
1170
  FIntro.BBCancel.Visible := False;
1171
  FIntro.BBClose.Visible := True;
1172
  FIntro.ShowModal;
1173
  FIntro.Release;
1174
end;
1175
1176
procedure TFMenu.MWebClick(Sender: TObject);
1177
begin
1178
  ShellExecute(Handle, 'open', PChar(URL_HTTPS), nil, nil, SW_SHOWNORMAL);
1179
end;
1180
1181
procedure TFMenu.MUpdateClick(Sender: TObject);
1182
var
1183
  UpdateURL: string;
1184
begin
1185
  if Copy(LanguageCode, 1, 2) = 'fr'
1186
  then // Fran?ais
1187
    UpdateURL := URL_HTTPS + 'update_fr.php?version=' + VersionString
1188
  else // Anglais
1189
    UpdateURL := URL_HTTPS + 'update_en.php?version=' + VersionString;
1190
  ShellExecute(Handle, 'open', PChar(UpdateURL), nil, nil, SW_SHOWNORMAL);
1191
end;
1192
1193
procedure TFMenu.MAboutClick(Sender: TObject);
1194
begin
1195
  FAbout := TFAbout.Create(Self);
1196
  FAbout.ShowModal;
1197
  FAbout.Release;
1198
end;
1199
1200
end.