Statistiques
| Révision:

root / UFRationP.pas

Historique | Voir | Annoter | Télécharger (32,438 ko)

1
unit UFRationP;
2

    
3
interface
4

    
5
uses
6
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7
  Dialogs, StdCtrls, Buttons, ExtCtrls, Math, PBNumEdit, TeEngine, Series, 
8
  TeeProcs, Chart, JvExControls, JvComponent, JvEnterTab, UVariables, 
9
  gnugettext;
10

    
11
type
12
  TFRationP = class(TForm)
13
    GBRation: TGroupBox;
14
    SBAddRation: TSpeedButton;
15
    SBDelRation: TSpeedButton;
16
    CBRation: TComboBox;
17
    GBRule: TGroupBox;
18
    LModeFin: TLabel;
19
    LNo: TLabel;
20
    SBAddRule: TSpeedButton;
21
    SBDelRule: TSpeedButton;
22
    LAli: TLabel;
23
    LBRule: TListBox;
24
    GBEnd: TGroupBox;
25
    PBValFin: TPBNumEdit;
26
    GBAjust: TGroupBox;
27
    GBParam: TGroupBox;
28
    LUnite: TLabel;
29
    LEqPV: TLabel;
30
    CBUnite: TComboBox;
31
    PBaPV: TPBNumEdit;
32
    RBCoef: TRadioButton;
33
    RBIngere: TRadioButton;
34
    PBbPV: TPBNumEdit;
35
    PBIng50: TPBNumEdit;
36
    PBIng100: TPBNumEdit;
37
    Graph: TChart;
38
    SeriesLigne: TLineSeries;
39
    SBRename: TSpeedButton;
40
    SBComment: TSpeedButton;
41
    PEqPV: TPanel;
42
    PCoefPV: TPanel;
43
    CBModeFin: TComboBox;
44
    PUnite: TPanel;
45
    LType: TLabel;
46
    CBType: TComboBox;
47
    PQuantite: TPanel;
48
    LQuantite: TLabel;
49
    PBQuantite: TPBNumEdit;
50
    CBEqPV: TComboBox;
51
    CBX: TComboBox;
52
    CBY: TComboBox;
53
    GBSim: TGroupBox;
54
    CBSim: TComboBox;
55
    GBY: TGroupBox;
56
    GBX: TGroupBox;
57
    PRation: TPanel;
58
    SBSave: TSpeedButton;
59
    SBPrint: TSpeedButton;
60
    PPercent: TPanel;
61
    LPercent: TLabel;
62
    PBPercent: TPBNumEdit;
63
    JvEnterAsTab: TJvEnterAsTab;
64
    LGaspillage: TLabel;
65
    PBGaspillage: TPBNumEdit;
66
    LaPV: TLabel;
67
    LbPV: TLabel;
68
    LIng100: TLabel;
69
    LIng50: TLabel;
70
    PCoefDuree: TPanel;
71
    LaDuree: TLabel;
72
    LbDuree: TLabel;
73
    PBaDuree: TPBNumEdit;
74
    PBbDuree: TPBNumEdit;
75
    PEqDuree: TPanel;
76
    LEqDuree: TLabel;
77
    CBEqDuree: TComboBox;
78
    GBGraph: TGroupBox;
79
    PGraphTop: TPanel;
80
    PRules: TPanel;
81
    LProfilRef: TLabel;
82
    LSeqAliRef: TLabel;
83
    LWastage: TLabel;
84
    PRight: TPanel;
85
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
86
    procedure FormShow(Sender: TObject);
87
    procedure CBRationChange(Sender: TObject);
88
    procedure SBAddRationClick(Sender: TObject);
89
    procedure SBDelRationClick(Sender: TObject);
90
    procedure LBRuleClick(Sender: TObject);
91
    procedure LBRuleDrawItem(Control: TWinControl; Index: Integer;
92
      Rect: TRect; State: TOwnerDrawState);
93
    procedure SBAddRuleClick(Sender: TObject);
94
    procedure SBDelRuleClick(Sender: TObject);
95
    procedure PBValFinChange(Sender: TObject);
96
    procedure CBUniteChange(Sender: TObject);
97
    procedure RBCoefClick(Sender: TObject);
98
    procedure PBaPVChange(Sender: TObject);
99
    procedure PBbPVChange(Sender: TObject);
100
    procedure PBIng50Change(Sender: TObject);
101
    procedure PBIng100Change(Sender: TObject);
102
    procedure FormDeactivate(Sender: TObject);
103
    procedure SBRenameClick(Sender: TObject);
104
    procedure SBCommentClick(Sender: TObject);
105
    procedure PBQuantiteChange(Sender: TObject);
106
    procedure CBTypeChange(Sender: TObject);
107
    procedure CBModeFinChange(Sender: TObject);
108
    procedure FormActivate(Sender: TObject);
109
    procedure CBEqDureeChange(Sender: TObject);
110
    procedure CBEqPVChange(Sender: TObject);
111
    procedure CBXChange(Sender: TObject);
112
    procedure CBYChange(Sender: TObject);
113
    procedure CBSimChange(Sender: TObject);
114
    procedure SBSaveClick(Sender: TObject);
115
    procedure SBPrintClick(Sender: TObject);
116
    procedure FormCreate(Sender: TObject);
117
    procedure PBPercentChange(Sender: TObject);
118
    procedure PBGaspillageChange(Sender: TObject);
119
    procedure PBaDureeChange(Sender: TObject);
120
    procedure PBbDureeChange(Sender: TObject);
121
  private
122
    { D?clarations priv?es }
123
    Update, Modified: boolean;
124
    IdxRationP, NumRule: integer;
125
    PResSimulP: PTabResSimulP;
126
    procedure Save;
127
    procedure AffGraph;
128
  public
129
    { D?clarations publiques }
130
    function StrModeFin(n: integer): String;
131
    function StrEquation(n: integer): String;
132
  end;
133

    
134
var
135
  FRationP: TFRationP;
136

    
137
implementation
138

    
139
uses
140
  UStrings, UInit, UUtil, UFindRec, UCalcul, UEchelle, UFComment, UCalcSimulP,
141
  UFRapRationP;
142

    
143
{$R *.dfm}
144

    
145
{ TFRationP }
146

    
147
procedure TFRationP.FormCreate(Sender: TObject);
148
begin
149
  if Screen.Fonts.IndexOf('Arial Unicode MS') <> -1
150
  then
151
    Font.Name := 'Arial Unicode MS';
152
  TranslateComponent(Self);
153
  Constraints.MinWidth := 748 + (Width - ClientWidth);
154
  Width := Constraints.MinWidth;
155
  Constraints.MinHeight := 440 + (Height - ClientHeight);
156
  Height := Constraints.MinHeight;
157
  CBModeFin.ItemIndex := 0;
158
  CBType.ItemIndex := 0;
159
  CBUnite.ItemIndex := 0;
160
  CBEqDuree.ItemIndex := 0;
161
  CBEqPV.ItemIndex := 0;
162
  CBX.ItemIndex := 0;
163
  CBY.ItemIndex := 0;
164
end;
165

    
166
procedure TFRationP.FormShow(Sender: TObject);
167
begin
168
  Modified := False;
169
  // Abscisses par d?faut
170
  CBX.ItemIndex := XCrois;
171
  New(PResSimulP);
172
  StringsRationP(CBRation.Items, True);
173
  SBAddRation.Enabled := IsComplete or (ListRationP.Count < 5);
174
  SBSave.Enabled := IsComplete or IsEducation;
175
  IdxRationP := -1;
176
//  CBRationChange(nil);
177
end;
178

    
179
procedure TFRationP.FormClose(Sender: TObject; var Action: TCloseAction);
180
begin
181
  if Modified then Save;
182
  Dispose(PResSimulP);
183
  Action := caFree;
184
  NumWinRationP := -1;
185
end;
186

    
187
procedure TFRationP.FormActivate(Sender: TObject);
188
begin
189
  StringsSimulP(CBSim.Items, False);
190
//  if IdxRationP <> -1
191
//  then
192
//    PRationP := ListRationP[IdxRationP];
193
  CBRationChange(nil);
194
  PRation.Enabled := IsComplete or IsEducation or IsEvaluation;
195
  SBAddRule.Visible := PRation.Enabled;
196
  SBDelRule.Visible := PRation.Enabled;
197
end;
198

    
199
procedure TFRationP.FormDeactivate(Sender: TObject);
200
begin
201
  if Modified then Save;
202
end;
203

    
204
procedure TFRationP.Save;
205
var
206
  s: string;
207
begin
208
  Modified := False;
209
  if IsComplete or IsEducation
210
  then
211
    if MessageDlg(Caption + sLineBreak + MsgSave, mtConfirmation, [mbYes, mbNo], 0) = mrYes
212
    then
213
    begin
214
      SaveRationP;
215
      if not RationPValid(PRationP)
216
      then
217
        MessageDlg(Format(MsgInvalidData, [Caption, PRationP.Nom]), mtWarning, [mbOK], 0);
218
    end
219
    else
220
    begin
221
      LoadRationP;
222
      s := CBRation.Text;
223
      StringsRationP(CBRation.Items, True);
224
      if FindIdxRationP(s) = -1
225
      then
226
      begin
227
        IdxRationP := -1;
228
        CBRationChange(nil);
229
      end
230
      else
231
        CBRation.ItemIndex := CBRation.Items.IndexOf(s);
232
    end;
233
end;
234

    
235
procedure TFRationP.CBRationChange (Sender : TObject) ;
236
var
237
  i : integer ;
238
begin
239
  if (IdxRationP <> -1) and (CBRation.Text <> PRationP.Nom)
240
  then
241
    if Modified then Save ;
242
  IdxRationP := FindIdxRationP (CBRation.Text) ;
243
  LBRule.Clear ;
244
  if IdxRationP = -1
245
  then
246
  begin
247
    CBRation.Repaint ;
248
    SBDelRation.Enabled := FALSE ;
249
    SBRename.Enabled := FALSE ;
250
    SBComment.Enabled := FALSE ;
251
    SBSave.Enabled := FALSE ;
252
    SBPrint.Enabled := FALSE ;
253
    PRation.Visible := FALSE ;
254
  end
255
  else // Affichage de l'enregistrement
256
  begin
257
    SBDelRation.Enabled := TRUE ;
258
    SBRename.Enabled := TRUE ;
259
    SBComment.Enabled := TRUE ;
260
    SBSave.Enabled := TRUE ;
261
    SBPrint.Enabled := TRUE ;
262
    PRation.Visible := TRUE ;
263
    PRationP := ListRationP[IdxRationP] ;
264
    with PRationP^ do
265
      CBRation.Hint := Memo ;
266
    with PRationP^ do
267
      for i := 1 to NbRule do
268
        LBRule.Items.Add ('') ;
269
    LBRule.ItemIndex := 0 ;
270
    LBRuleClick (nil) ;
271
    CBSimChange (nil) ;
272
  end ;
273
end ;
274

    
275
procedure TFRationP.SBAddRationClick (Sender : TObject) ;
276
var
277
  i, n, q : integer ;
278
  s : string ;
279
  ok : boolean ;
280
  PBackup : PRecRationP ;
281
begin
282
  if Modified then Save ;
283
  if IdxRationP = -1
284
  then
285
    q := mrNo
286
  else
287
    q := MessageDlg (MsgCopy, mtConfirmation, [mbYes, mbNo], 0) ;
288
  // saisie du nouveau nom
289
  s := '' ;
290
  repeat
291
    if InputQuery (FRationP.Caption, MsgName, s)
292
    then // V?rification du nom
293
    begin
294
      s := Trim (s) ; // Suppression des espaces au d?but et ? la fin
295
      if s = ''
296
      then // Pas de nom
297
      begin
298
        ok := FALSE ;
299
        MessageDlg (MsgNameEmpty, mtWarning, [mbOk], 0) ;
300
      end
301
      else
302
        if Length (s) > 25
303
        then // Nom trop long
304
        begin
305
          ok := FALSE ;
306
          MessageDlg (Format (MsgNameTooLarge, [25]), mtWarning, [mbOk], 0) ;
307
          s := Copy (s, 1, 25) ;
308
        end
309
        else
310
        begin
311
          ok := TRUE ;
312
          i := 0 ;
313
          while ok and (i < ListRationP.Count) do
314
          begin
315
            PRationP := ListRationP[i] ;
316
            if PRationP.Nom = s
317
            then // Nom d?j? utilis?
318
            begin
319
              ok := FALSE ;
320
              MessageDlg (MsgNameExists, mtWarning, [mbOk], 0) ;
321
            end
322
            else
323
              Inc (i) ;
324
          end ;
325
        end ;
326
    end
327
    else // Annulation
328
    begin
329
      s := '' ;
330
      if (IdxRationP <> -1)
331
      then
332
        PRationP := ListRationP[IdxRationP] ;
333
      ok := TRUE ;
334
    end ;
335
  until ok ;
336
  if s <> ''
337
  then // Cr?ation du nouvel enregistrement
338
  begin
339
    // recherche du premier num?ro libre
340
    n := 0 ;
341
    repeat
342
      Inc (n) ;
343
      ok := TRUE ;
344
      i := 0 ;
345
      while ok and (i < ListRationP.Count) do
346
      begin
347
        PRationP := ListRationP[i] ;
348
        if PRationP.Num = n
349
        then
350
          ok := FALSE
351
        else
352
          Inc (i) ;
353
      end ;
354
    until ok ;
355
    New (PRationP) ;
356
    with PRationP^ do
357
    begin
358
      Nom := s ;
359
      Num := n ;
360
      if q = mrYes
361
      then
362
      begin
363
        PBackup := ListRationP[IdxRationP] ;
364
        Memo := PBackup.Memo ;
365
        NbRule := PBackup.NbRule ;
366
        Rule := PBackup.Rule ;
367
      end
368
      else
369
      begin
370
        Memo := '';
371
        NbRule := 1;
372
        for i := 1 to MAX_RULE do
373
          with Rule[i] do
374
          begin
375
            ModeFin := -1;
376
            ValFin := 0;
377
            Gaspillage := 0;
378
            RuleType := -1;
379
            Unite := -1;
380
            EqDuree := -1;
381
            EqPV := -1;
382
            Percent := 1;
383
            Quantity := 0;
384
            aDuree := 0;
385
            bDuree := 0;
386
            aPV := 0;
387
            bPV := 0;
388
         end;
389
      end;
390
    end ;
391
    ListRationP.Add (PRationP) ;
392
    CBRation.Items.Add (PRationP.Nom) ;
393
    CBRation.ItemIndex := CBRation.Items.IndexOf (PRationP.Nom) ;
394
    CBRationChange (nil) ;
395
    Modified := TRUE ;
396
    SBAddRation.Enabled := IsComplete or (ListRationP.Count < 5) ;
397
    SBCommentClick (nil) ;
398
  end ;
399
end;
400

    
401
procedure TFRationP.SBDelRationClick (Sender : TObject) ;
402
begin
403
  if RationPUsed (PRationP.Num)
404
  then // Enregistrement utilis?
405
    MessageDlg (MsgDelErr, mtWarning, [mbOk], 0)
406
  else // Suppression de l'enregistrement
407
    if MessageDlg (MsgDel, mtConfirmation, [mbYes, mbNo], 0) = mrYes
408
    then
409
    begin
410
      Dispose (PRationP) ;
411
      ListRationP.Delete (IdxRationP) ;
412
      SaveRationP ; // Sauvegarde !
413
      Modified := FALSE ;
414
      CBRation.DeleteSelected ;
415
      IdxRationP := -1 ;
416
      CBRation.ItemIndex := -1 ;
417
      CBRationChange (nil) ;
418
      SBAddRation.Enabled := IsComplete or (ListRationP.Count < 5) ;
419
    end ;
420
end ;
421

    
422
procedure TFRationP.SBRenameClick (Sender : TObject) ;
423
var
424
  i : integer ;
425
  s : string ;
426
  ok : boolean ;
427
begin
428
  // Saisie du nouveau nom
429
  s := CBRation.Text ;
430
  repeat
431
    if InputQuery (FRationP.Caption, MsgRename, s) and (s <> CBRation.Text)
432
    then // V?rification du nom
433
    begin
434
      s := Trim (s) ; // Suppression des espaces au d?but et ? la fin
435
      if s = ''
436
      then // Pas de nom
437
      begin
438
        ok := FALSE ;
439
        MessageDlg (MsgNameEmpty, mtWarning, [mbOk], 0) ;
440
      end
441
      else
442
        if Length (s) > 25
443
        then // Nom trop long
444
        begin
445
          ok := FALSE ;
446
          MessageDlg (Format (MsgNameTooLarge, [25]), mtWarning, [mbOk], 0) ;
447
          s := Copy (s, 1, 25) ;
448
        end
449
        else
450
        begin
451
          ok := TRUE ;
452
          i := 0 ;
453
          while ok and (i < ListRationP.Count) do
454
          begin
455
            PRationP := ListRationP[i] ;
456
            if PRationP.Nom = s
457
            then // Nom d?j? utilis?
458
            begin
459
              ok := FALSE ;
460
              MessageDlg (MsgNameExists, mtWarning, [mbOk], 0) ;
461
            end
462
            else
463
              Inc (i) ;
464
          end ;
465
        end ;
466
    end
467
    else // Annulation
468
    begin
469
      s := '' ;
470
      ok := TRUE ;
471
    end ;
472
  until ok ;
473
  PRationP := ListRationP[IdxRationP] ;
474
  if s <> ''
475
  then // Renommer l'enregistrement
476
  begin
477
    PRationP.Nom := s ;
478
    Modified := TRUE ;
479
    StringsRationP (CBRation.Items, TRUE) ;
480
    CBRation.ItemIndex := CBRation.Items.IndexOf (s) ;
481
  end ;
482
end ;
483

    
484
procedure TFRationP.SBCommentClick (Sender : TObject) ;
485
begin
486
  // Saisie du commentaire
487
  FComment := TFComment.Create (Self) ;
488
  with FComment do
489
  begin
490
    Memo.Text := PRationP.Memo ;
491
    if ShowModal = mrOk
492
    then // Commenter l'enregistrement
493
    begin
494
      PRationP.Memo := Memo.Text ;
495
      Modified := TRUE ;
496
      CBRation.Hint := PRationP.Memo ;
497
    end ;
498
    Release ;
499
  end ;
500
end ;
501

    
502
procedure TFRationP.SBSaveClick(Sender: TObject);
503
begin
504
  SaveRationP ;
505
  if not RationPValid (PRationP)
506
  then
507
    MessageDlg(Format (MsgInvalidData, [Caption, PRationP.Nom]), mtWarning, [mbOK], 0) ;
508
  Modified := FALSE ;
509
end;
510

    
511
procedure TFRationP.SBPrintClick(Sender: TObject);
512
begin
513
  FRapRationP := TFRapRationP.Create (Self) ;
514
  FRapRationP.QRRapport.PreviewModal ;
515
  FRapRationP.Release ;
516
end;
517

    
518
procedure TFRationP.LBRuleClick(Sender: TObject);
519
begin
520
  NumRule := LBRule.ItemIndex + 1;
521
  SBAddRule.Enabled := LBRule.Items.Count < MAX_RULE;
522
  SBDelRule.Enabled := NumRule < PRationP.NbRule;
523
  GBEnd.Visible := SBDelRule.Enabled;
524
  with PRationP.Rule[NumRule] do
525
  begin
526
    Update := True;
527
    CBModeFin.ItemIndex := ModeFin;
528
    CBModeFinChange(nil);
529
    PBValFin.AsFloat := ValFin;
530
    PBGaspillage.AsFloat := Gaspillage * 100;
531
    CBType.ItemIndex := RuleType;
532
    CBTypeChange(nil);
533
    CBUnite.ItemIndex := Unite;
534
    CBUniteChange(nil);
535
    CBEqDuree.ItemIndex := EqDuree;
536
    CBEqDureeChange(nil);
537
    CBEqPV.ItemIndex := EqPV;
538
    CBEqPVChange(nil);
539
    PBPercent.Value := Percent * 100;
540
    PBQuantite.AsFloat := Quantity / (1 - Gaspillage);
541
    PBaDuree.AsFloat := aDuree / (1 - Gaspillage);
542
    PBbDuree.AsFloat := bDuree / (1 - Gaspillage);
543
    PBaPV.AsFloat := aPV / (1 - Gaspillage);
544
    if EqPV = 0
545
    then // a+b*PV
546
      PBbPV.AsFloat := bPV / (1 - Gaspillage)
547
    else
548
      PBbPV.AsFloat := bPV;
549
    PBIng50.AsFloat := CalcIngere(EqPV, Unite, PBaPV.AsFloat, PBbPV.AsFloat, 50);
550
    PBIng100.AsFloat := CalcIngere(EqPV, Unite, PBaPV.AsFloat, PBbPV.AsFloat, 100);
551
    Update := False;
552
  end;
553
end;
554

    
555
procedure TFRationP.LBRuleDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
556
begin
557
  with (Control as TListBox).Canvas do
558
  begin
559
    // Cadre principal
560
    FillRect(Rect);
561
    // Texte
562
    SetTextAlign(Handle, TA_RIGHT);
563
    Rect.Right := LBRule.Width - 4;
564
    TextRect(Rect, Rect.Right, Rect.Top, Format('%1.0f%%', [PRationP.Rule[Index + 1].Gaspillage * 100]));
565
    Rect.Right := 338;
566
    SetTextAlign(Handle, TA_LEFT);
567
    Rect.Left := 22;
568
    TextRect(Rect, Rect.Left, Rect.Top, StrModeFin(Index + 1));
569
    Rect.Left := 182;
570
    TextRect(Rect, Rect.Left, Rect.Top, StrEquation(Index + 1));
571
    Rect.Left := 0;
572
    // Num?ro
573
    SetTextAlign(Handle, TA_RIGHT);
574
    Rect.Right := 14;
575
    TextRect(Rect, Rect.Right, Rect.Top, Format('%d', [Index + 1]));
576
  end;
577
end;
578

    
579
procedure TFRationP.SBAddRuleClick (Sender : TObject) ;
580
var
581
  i : integer ;
582
begin
583
  for i := PRationP.NbRule downto NumRule do
584
    PRationP.Rule[i + 1] := PRationP.Rule[i] ;
585
  with PRationP.Rule[NumRule] do
586
  begin
587
    ModeFin := -1 ;
588
    ValFin := 0 ;
589
  end ;
590
  Inc (PRationP.NbRule) ;
591
  LBRule.Items.Add ('') ;
592
  LBRule.ItemIndex := NumRule - 1 ;
593
  LBRuleClick (nil) ;
594
  Modified := TRUE ;
595
  ActiveControl := CBModeFin ;
596
end ;
597

    
598
procedure TFRationP.SBDelRuleClick (Sender : TObject) ;
599
var
600
  i : integer ;
601
begin
602
  PRationP.NbRule := PRationP.NbRule - 1 ;
603
  for i := NumRule to PRationP.NbRule do
604
    PRationP.Rule[i] := PRationP.Rule[i + 1] ;
605
  i := NumRule ; // Position courante
606
  LBRule.DeleteSelected ;
607
  LBRule.ItemIndex := i - 1 ;
608
  LBRuleClick (nil) ;
609
  CBSimChange (nil) ;
610
  ActiveControl := LBRule ;
611
  Modified := TRUE ;
612
end ;
613

    
614
procedure TFRationP.CBModeFinChange(Sender: TObject);
615
begin
616
  PBValFin.Visible := CBModeFin.ItemIndex <> -1;
617
  if CBModeFin.ItemIndex >= 4
618
  then // Consommation
619
    PBValFin.Decimals := 3
620
  else
621
    PBValFin.Decimals := 0;
622
  if not Update
623
  then
624
  begin
625
    Modified := True;
626
    PRationP.Rule[NumRule].ModeFin := CBModeFin.ItemIndex;
627
    LBRule.Repaint;
628
    CBSimChange(nil);
629
  end;
630
end;
631

    
632
procedure TFRationP.PBValFinChange(Sender : TObject);
633
begin
634
  if not Update
635
  then
636
  begin
637
    Modified := True;
638
    PRationP.Rule[NumRule].ValFin := PBValFin.AsFloat;
639
    LBRule.Repaint;
640
    CBSimChange(nil);
641
  end;
642
end;
643

    
644
procedure TFRationP.PBGaspillageChange(Sender: TObject);
645
begin
646
  if not Update
647
  then
648
  begin
649
    Modified := True;
650
    PRationP.Rule[NumRule].Gaspillage := PBGaspillage.AsFloat / 100;
651
    // Recalculer Quantity
652
    PRationP.Rule[NumRule].Quantity := PBQuantite.AsFloat * (1 - PRationP.Rule[NumRule].Gaspillage);
653
    // Recalculer aDuree et bDuree
654
    PRationP.Rule[NumRule].aDuree := PBaDuree.AsFloat * (1 - PRationP.Rule[NumRule].Gaspillage);
655
    PRationP.Rule[NumRule].bDuree := PBbDuree.AsFloat * (1 - PRationP.Rule[NumRule].Gaspillage);
656
    // Recalculer aPV et bPV
657
    PRationP.Rule[NumRule].aPV := PBaPV.AsFloat * (1 - PRationP.Rule[NumRule].Gaspillage);
658
    if CBEqPV.ItemIndex = 0
659
    then // a+b*PV
660
      PRationP.Rule[NumRule].bPV := PBbPV.AsFloat * (1 - PRationP.Rule[NumRule].Gaspillage);
661
    LBRule.Repaint;
662
    CBSimChange(nil);
663
  end;
664
end;
665

    
666
procedure TFRationP.CBTypeChange(Sender: TObject);
667
begin
668
  PUnite.Visible := False;
669
  PPercent.Visible := False;
670
  PQuantite.Visible := False;
671
  PEqDuree.Visible := False;
672
  PCoefDuree.Visible := False;
673
  PEqPV.Visible := False;
674
  PCoefPV.Visible := False;
675
  case CBType.ItemIndex of
676
    0: // % Ad libitum
677
      PPercent.Visible := True;
678
    1: // Constant
679
    begin
680
      PUnite.Visible := True;
681
      PQuantite.Visible := True;
682
    end;
683
    2: // f(dur?e)
684
    begin
685
      PUnite.Visible := True;
686
      PEqDuree.Visible := True;
687
      CBEqDureeChange(nil);
688
    end;
689
    3: // f(poids vif)
690
    begin
691
      PUnite.Visible := True;
692
      PEqPV.Visible := True;
693
      CBEqPVChange(nil);
694
    end;
695
  end;
696
  if not Update
697
  then
698
  begin
699
    Modified := True;
700
    PRationP.Rule[NumRule].RuleType := CBType.ItemIndex;
701
    LBRule.Repaint;
702
    CBSimChange(nil);
703
  end;
704
end;
705

    
706
procedure TFRationP.CBUniteChange(Sender: TObject);
707
var
708
  etat: boolean;
709
  d, m, Ing50, Ing100: Double;
710
begin
711
  etat := Update;
712
  Update := True;
713
  // Ajustement de la pr?cision de Quantity, aDuree, bDuree, Ing50 et Ing100
714
  if (CBUnite.ItemIndex = 0) or (CBUnite.ItemIndex = 4)
715
  then // kg (QI ou MS)
716
  begin
717
    PBQuantite.Decimals := 3;
718
    PBaDuree.Decimals := 3;
719
    PBbDuree.Decimals := 3;
720
    PBIng50.Decimals := 3;
721
    PBIng100.Decimals := 3;
722
  end
723
  else // MJ (ED, EM ou EN)
724
  begin
725
    PBQuantite.Decimals := 2;
726
    PBaDuree.Decimals := 2;
727
    PBbDuree.Decimals := 2;
728
    PBIng50.Decimals := 2;
729
    PBIng100.Decimals := 2;
730
  end;
731
  Update := etat;
732
  if not Update
733
  then
734
  begin
735
    Update := True;
736
    CBEqPVChange(nil);
737
    Update := False;
738
    // Ancienne unit? (diviseur)
739
    case PProfilP.Unite of
740
      0: // Quantit? (kg/j)
741
        d := cGammaFrais;
742
      1: // ED (MJ/j)
743
        d := cGammaED;
744
      2: // EM (MJ/j)
745
        d := cGammaEM;
746
      3: // EN (MJ/j)
747
        d := cGammaEN;
748
      4: // MS (kg/j)
749
        d := cGammaMS;
750
      else
751
        d := 1;
752
    end;
753
    // Nouvelle unit? (multiplicateur)
754
    case CBUnite.ItemIndex of
755
      0: // Quantit? (kg/j)
756
        m := cGammaFrais;
757
      1: // ED (MJ/j)
758
        m := cGammaED;
759
      2: // EM (MJ/j)
760
        m := cGammaEM;
761
      3: // EN (MJ/j)
762
        m := cGammaEN;
763
      4: // MS (kg/j)
764
        m := cGammaMS;
765
      else
766
        m := 1;
767
    end;
768
    Modified := True;
769
    PRationP.Rule[NumRule].Unite := CBUnite.ItemIndex;
770
    if d <> m
771
    then // Conversion
772
    begin
773
      Update := True;
774
      RBIngere.Checked := True;
775
      PBIng50.AsFloat := m * PBIng50.AsFloat / d;
776
      PBIng100.AsFloat := m * PBIng100.AsFloat / d;
777
      with PRationP.Rule[NumRule] do
778
      begin
779
        Ing50 := PBIng50.AsFloat * (1 - Gaspillage);
780
        Ing100 := PBIng100.AsFloat * (1 - Gaspillage);
781
        CalcCoef(EqPV, Unite, Ing50, Ing100, aPV, bPV);
782
        PBaPV.AsFloat := aPV / (1 - Gaspillage);
783
        if EqPV = 0
784
        then // a+b*PV
785
          PBbPV.AsFloat := bPV / (1 - Gaspillage)
786
        else
787
          PBbPV.AsFloat := bPV;
788
      end;
789
      Update := False;
790
    end;
791
    LBRule.Repaint;
792
    CBSimChange(nil);
793
  end;
794
end;
795

    
796
procedure TFRationP.CBEqDureeChange(Sender: TObject);
797
begin
798
  PCoefDuree.Visible := (CBType.ItemIndex = 2) and (CBEqDuree.ItemIndex <> -1);
799
  if not Update
800
  then
801
  begin
802
    Modified := True;
803
    PRationP.Rule[NumRule].EqDuree := CBEqDuree.ItemIndex;
804
    LBRule.Repaint;
805
    CBSimChange(nil);
806
  end;
807
end;
808

    
809
procedure TFRationP.CBEqPVChange(Sender: TObject);
810
var
811
  etat: Boolean;
812
  Ing50, Ing100: Double;
813
begin
814
  etat := Update;
815
  Update := True;
816
  // Ajustement de la pr?cision des coefficients a et b
817
  case CBEqPV.ItemIndex of
818
    0: // a+b*PV
819
      if (CBUnite.ItemIndex = 0) or (CBUnite.ItemIndex = 4)
820
      then // kg (QI ou MS)
821
      begin
822
        PBaPV.Decimals := 3;
823
        PBbPV.Decimals := 3;
824
      end
825
      else // MJ (ED, EM ou EN)
826
      begin
827
        PBaPV.Decimals := 2;
828
        PBbPV.Decimals := 2;
829
      end;
830
    1: // a*PV^b
831
    begin
832
      if (CBUnite.ItemIndex = 0) or (CBUnite.ItemIndex = 4)
833
      then // kg (QI ou MS)
834
        PBaPV.Decimals := 4
835
      else // MJ (ED, EM ou EN)
836
        PBaPV.Decimals := 3;
837
      PBbPV.Decimals := 4;
838
    end;
839
    2: // a*(1-exp(-b*PV))
840
    begin
841
      if (CBUnite.ItemIndex = 0) or (CBUnite.ItemIndex = 4)
842
      then // kg (QI ou MS)
843
        PBaPV.Decimals := 3
844
      else // MJ (ED, EM ou EN)
845
        PBaPV.Decimals := 2;
846
      PBbPV.Decimals := 5;
847
    end;
848
  end;
849
  Update := etat;
850
  PCoefPV.Visible := (CBType.ItemIndex = 3) and (CBEqPV.ItemIndex <> -1);
851
  if not Update
852
  then
853
  begin
854
    Modified := True;
855
    PRationP.Rule[NumRule].EqPV := CBEqPV.ItemIndex;
856
    Update := True;
857
    RBIngere.Checked := True;
858
    with PRationP.Rule[NumRule] do
859
    begin
860
      Ing50 := PBIng50.AsFloat * (1 - Gaspillage);
861
      Ing100 := PBIng100.AsFloat * (1 - Gaspillage);
862
      CalcCoef(EqPV, Unite, Ing50, Ing100, aPV, bPV);
863
      PBaPV.AsFloat := aPV / (1 - Gaspillage);
864
      if EqPV = 0
865
      then // a+b*PV
866
        PBbPV.AsFloat := bPV / (1 - Gaspillage)
867
      else
868
        PBbPV.AsFloat := bPV;
869
    end;
870
    Update := False;
871
    LBRule.Repaint;
872
    CBSimChange(nil);
873
  end;
874
end;
875

    
876
procedure TFRationP.PBPercentChange(Sender: TObject);
877
begin
878
  if not Update
879
  then
880
  begin
881
    Modified := True;
882
    PRationP.Rule[NumRule].Percent := PBPercent.AsInteger / 100;
883
    LBRule.Repaint;
884
    CBSimChange(nil);
885
  end;
886
end;
887

    
888
procedure TFRationP.PBQuantiteChange(Sender: TObject);
889
begin
890
  if not Update
891
  then
892
  begin
893
    Modified := True;
894
    PRationP.Rule[NumRule].Quantity := PBQuantite.AsFloat * (1 - PRationP.Rule[NumRule].Gaspillage);
895
    LBRule.Repaint;
896
    CBSimChange(nil);
897
  end;
898
end;
899

    
900
procedure TFRationP.PBaDureeChange(Sender: TObject);
901
begin
902
  if not Update
903
  then
904
  begin
905
    Modified := True;
906
    PRationP.Rule[NumRule].aDuree := PBaDuree.AsFloat * (1 - PRationP.Rule[NumRule].Gaspillage);
907
    LBRule.Repaint;
908
    CBSimChange(nil);
909
  end;
910
end;
911

    
912
procedure TFRationP.PBbDureeChange(Sender: TObject);
913
begin
914
  if not Update
915
  then
916
  begin
917
    Modified := True;
918
    PRationP.Rule[NumRule].bDuree := PBbDuree.AsFloat * (1 - PRationP.Rule[NumRule].Gaspillage);
919
    LBRule.Repaint;
920
    CBSimChange(nil);
921
  end;
922
end;
923

    
924
procedure TFRationP.RBCoefClick(Sender: TObject);
925
begin
926
  PBaPV.Enabled := RBCoef.Checked;
927
  PBbPV.Enabled := RBCoef.Checked;
928
  PBIng50.Enabled := RBIngere.Checked;
929
  PBIng100.Enabled := RBIngere.Checked;
930
end;
931

    
932
procedure TFRationP.PBaPVChange(Sender: TObject);
933
begin
934
  if not Update
935
  then
936
  begin
937
    Modified := True;
938
    PRationP.Rule[NumRule].aPV := PBaPV.AsFloat * (1 - PRationP.Rule[NumRule].Gaspillage);
939
    Update := True;
940
    with PRationP.Rule[NumRule] do
941
    begin
942
      PBIng50.AsFloat := CalcIngere(EqPV, Unite, PBaPV.AsFloat, PBbPV.AsFloat, 50);
943
      PBIng100.AsFloat := CalcIngere(EqPV, Unite, PBaPV.AsFloat, PBbPV.AsFloat, 100);
944
    end;
945
    Update := False;
946
    LBRule.Repaint;
947
    CBSimChange(nil);
948
  end;
949
end;
950

    
951
procedure TFRationP.PBbPVChange(Sender: TObject);
952
begin
953
  if not Update
954
  then
955
  begin
956
    Modified := True;
957
    if CBEqPV.ItemIndex = 0
958
    then // a+b*PV
959
      PRationP.Rule[NumRule].bPV := PBbPV.AsFloat * (1 - PRationP.Rule[NumRule].Gaspillage)
960
    else
961
      PRationP.Rule[NumRule].bPV := PBbPV.AsFloat;
962
    Update := True;
963
    with PRationP.Rule[NumRule] do
964
    begin
965
      PBIng50.AsFloat := CalcIngere(EqPV, Unite, PBaPV.AsFloat, PBbPV.AsFloat, 50);
966
      PBIng100.AsFloat := CalcIngere(EqPV, Unite, PBaPV.AsFloat, PBbPV.AsFloat, 100);
967
    end;
968
    Update := False;
969
    LBRule.Repaint;
970
    CBSimChange(nil);
971
  end;
972
end;
973

    
974
procedure TFRationP.PBIng50Change(Sender: TObject);
975
var
976
  Ing50, Ing100: Double;
977
begin
978
  if not Update
979
  then
980
  begin
981
    Modified := True;
982
    Update := True;
983
    with PRationP.Rule[NumRule] do
984
    begin
985
      Ing50 := PBIng50.AsFloat * (1 - Gaspillage);
986
      Ing100 := PBIng100.AsFloat * (1 - Gaspillage);
987
      CalcCoef(EqPV, Unite, Ing50, Ing100, aPV, bPV);
988
      PBaPV.AsFloat := aPV / (1 - Gaspillage);
989
      if EqPV = 0
990
      then // a+b*PV
991
        PBbPV.AsFloat := bPV / (1 - Gaspillage)
992
      else
993
        PBbPV.AsFloat := bPV;
994
    end;
995
    Update := False;
996
    LBRule.Repaint;
997
    CBSimChange(nil);
998
  end;
999
end;
1000

    
1001
procedure TFRationP.PBIng100Change(Sender: TObject);
1002
var
1003
  Ing50, Ing100: Double;
1004
begin
1005
  if not Update
1006
  then
1007
  begin
1008
    Modified := True;
1009
    Update := True;
1010
    with PRationP.Rule[NumRule] do
1011
    begin
1012
      Ing50 := PBIng50.AsFloat * (1 - Gaspillage);
1013
      Ing100 := PBIng100.AsFloat * (1 - Gaspillage);
1014
      CalcCoef(EqPV, Unite, Ing50, Ing100, aPV, bPV);
1015
      PBaPV.AsFloat := aPV / (1 - Gaspillage);
1016
      if EqPV = 0
1017
      then // a+b*PV
1018
        PBbPV.AsFloat := bPV / (1 - Gaspillage)
1019
      else
1020
        PBbPV.AsFloat := bPV;
1021
    end;
1022
    Update := False;
1023
    LBRule.Repaint;
1024
    CBSimChange(nil);
1025
  end;
1026
end;
1027

    
1028
function TFRationP.StrModeFin(n: integer): String;
1029
begin
1030
  if n = PRationP.NbRule
1031
  then // Fin de simulation
1032
    result := _('End of simulation')
1033
  else
1034
    with PRationP.Rule[n] do
1035
      case ModeFin of
1036
        0, 1, 2, 3 : // Dur?e, Age, Poids vif ou Cumul aliment
1037
          result := Format('%s=%1.0f', [CBModeFin.Items[ModeFin], ValFin]);
1038
        4..8 : // Consommation
1039
          result := Format('%s=%s', [CBModeFin.Items[ModeFin], DblToStr(ValFin, 3)]);
1040
        else
1041
          result := '';
1042
      end;
1043
end;
1044

    
1045
function TFRationP.StrEquation(n: integer): String;
1046
begin
1047
  with PRationP.Rule[n] do
1048
    case RuleType of
1049
      0: // % Ad libitum
1050
        result := Format('%1.0f%% %s', [Percent * 100, StrAdLib]);
1051
      1: // Constant
1052
        if (Unite = 0) or (Unite = 4)
1053
        then // kg (QI ou MS)
1054
          result := Format('%s=%s', [CBUnite.Items[Unite], DblToStr(Quantity / (1 - Gaspillage), 3)])
1055
        else // MJ (ED, EM ou EN)
1056
          result := Format('%s=%s', [CBUnite.Items[Unite], DblToStr(Quantity / (1 - Gaspillage), 2)]);
1057
      2: // f(dur?e)
1058
        case EqDuree of
1059
          0: // a+b*jour
1060
            if (Unite = 0) or (Unite = 4)
1061
            then // kg (QI ou MS)
1062
              result := Format('%s=%s+%s*%s', [CBUnite.Items[Unite], DblToStr(aDuree / (1 - Gaspillage), 3), DblToStr (bDuree / (1 - Gaspillage), 2), _('Day')])
1063
            else // MJ (ED, EM ou EN)
1064
              result := Format('%s=%s+%s*%s', [CBUnite.Items[Unite], DblToStr(aDuree / (1 - Gaspillage), 2), DblToStr (bDuree / (1 - Gaspillage), 3), _('Day')]);
1065
          1: // a+b*semaine
1066
            if (Unite = 0) or (Unite = 4)
1067
            then // kg (QI ou MS)
1068
              result := Format('%s=%s+%s*%s', [CBUnite.Items[Unite], DblToStr(aDuree / (1 - Gaspillage), 3), DblToStr (bDuree / (1 - Gaspillage), 2), _('Week')])
1069
            else // MJ (ED, EM ou EN)
1070
              result := Format('%s=%s+%s*%s', [CBUnite.Items[Unite], DblToStr(aDuree / (1 - Gaspillage), 2), DblToStr (bDuree / (1 - Gaspillage), 3), _('Week')]);
1071
          else
1072
            result := '';
1073
        end;
1074
      3: // f(poids vif)
1075
        case EqPV of
1076
          0: // a+b*PV
1077
            if (Unite = 0) or (Unite = 4)
1078
            then // kg (QI ou MS)
1079
              result := Format('%s=%s+%s*%s', [CBUnite.Items[Unite], DblToStr(aPV / (1 - Gaspillage), 3), DblToStr(bPV / (1 - Gaspillage), 2), _('BW')])
1080
            else // MJ (ED, EM ou EN)
1081
              result := Format('%s=%s+%s*%s', [CBUnite.Items[Unite], DblToStr(aPV / (1 - Gaspillage), 2), DblToStr(bPV / (1 - Gaspillage), 3), _('BW')]);
1082
          1: // a*PV^b
1083
            if (Unite = 0) or (Unite = 4)
1084
            then // kg (QI ou MS)
1085
              result := Format('%s=%s*%s^%s', [CBUnite.Items[Unite], DblToStr(aPV / (1 - Gaspillage), 4), _('BW'), DblToStr(bPV, 4)])
1086
            else // MJ (ED, EM ou EN)
1087
              result := Format('%s=%s*%s^%s', [CBUnite.Items[Unite], DblToStr(aPV / (1 - Gaspillage), 3), _('BW'), DblToStr(bPV, 4)]);
1088
          2: // a*(1-exp(-b*PV))
1089
            if (Unite = 0) or (Unite = 4)
1090
            then // kg (QI ou MS)
1091
              result := Format('%s=%s*(1-exp(-%s*%s))', [CBUnite.Items[Unite], DblToStr(aPV / (1 - Gaspillage), 3), DblToStr(bPV, 5), _('BW')])
1092
            else // MJ (ED, EM ou EN)
1093
              result := Format('%s=%s*(1-exp(-%s*%s))', [CBUnite.Items[Unite], DblToStr(aPV / (1 - Gaspillage), 2), DblToStr(bPV, 5), _('BW')]);
1094
          else
1095
            result := '';
1096
        end;
1097
      else
1098
        result := '';
1099
    end;
1100
end;
1101

    
1102
procedure TFRationP.AffGraph;
1103
var
1104
  j: integer;
1105

    
1106
  // Abscisse
1107
  function X: double;
1108
  begin
1109
    case CBX.ItemIndex of
1110
      0: // Poids vif
1111
        result := PResSimulP.TabResult[2, j];
1112
      1: // Age
1113
        result := PResSimulP.TabResult[1, j];
1114
      2: // Jours
1115
        result := j;
1116
      3: // Semaines
1117
        result := j / 7;
1118
      else
1119
        result := 0;
1120
    end;
1121
  end;
1122

    
1123
  // Ordonn?e
1124
  function Y: double;
1125
  begin
1126
    case CBY.ItemIndex of
1127
      0: // QI
1128
        result := PResSimulP.TabResult[113, j];
1129
      1: // MS
1130
        result := PResSimulP.TabResult[106, j] * PResSimulP.TabResult[113, j];
1131
      2: // ED
1132
        result := PResSimulP.TabResult[109, j] * PResSimulP.TabResult[113, j];
1133
      3: // EM
1134
        result := PResSimulP.TabResult[89, j] * PResSimulP.TabResult[113, j];
1135
      4: // EN
1136
        result := PResSimulP.TabResult[90, j] * PResSimulP.TabResult[113, j];
1137
      else
1138
        result := 0;
1139
    end;
1140
  end;
1141

    
1142
// AffGraph
1143
begin
1144
  Graph.LeftAxis.Title.Caption := CBY.Text;
1145
  Graph.BottomAxis.Title.Caption := CBX.Text;
1146
  SeriesLigne.Clear;
1147
  if (CBSim.ItemIndex <> -1) and RationPValid (PRationP)
1148
  then // Affichage de la ligne
1149
    for j := 1 to PResSimulP.NbJSim do
1150
      SeriesLigne.AddXY (X, Y, '', clTeeColor);
1151
  if CBX.ItemIndex = 3
1152
  then
1153
    Graph.BottomAxis.Increment := 1
1154
  else
1155
    Graph.BottomAxis.Increment := 10;
1156
  AjustEchelle(Graph);
1157
end;
1158

    
1159
procedure TFRationP.CBXChange(Sender: TObject);
1160
begin
1161
  AffGraph;
1162
end;
1163

    
1164
procedure TFRationP.CBYChange(Sender: TObject);
1165
begin
1166
  AffGraph;
1167
end;
1168

    
1169
procedure TFRationP.CBSimChange(Sender: TObject);
1170
begin
1171
  if RationPValid(PRationP) and (CBSim.ItemIndex <> -1)
1172
  then
1173
  begin
1174
    PSimulP := ListSimulP[FindIdxSimulP(CBSim.Text)];
1175
    CBSim.Hint := PSimulP.Memo ;
1176
    LProfilRef.Caption := Format(StrRationProfil, [FindNomProfilP(PSimulP.Profil)]);
1177
    LSeqAliRef.Caption := Format(StrRationSeqAli, [FindNomSeqAliP(PSimulP.SeqAli)]);
1178
    CalcSimulP(PSimulP.Num, -1, -1, PRationP.Num, -1, 1, {1,} PResSimulP);
1179
  end
1180
  else
1181
  begin
1182
    CBSim.Hint := '';
1183
    LProfilRef.Caption := '';
1184
    LSeqAliRef.Caption := '';
1185
  end ;
1186
  AffGraph;
1187
end;
1188

    
1189
end.