diff --git a/applications/lazstats/source/forms/mainunit.pas b/applications/lazstats/source/forms/mainunit.pas index a6fa8b952..fc0f9808b 100644 --- a/applications/lazstats/source/forms/mainunit.pas +++ b/applications/lazstats/source/forms/mainunit.pas @@ -1342,7 +1342,7 @@ procedure TOS3MainFrm.mnuSimHyperGeomProbClick(Sender: TObject); begin if HyperGeoForm = nil then Application.CreateForm(THyperGeoForm, HyperGeoForm); - HyperGeoForm.ShowModal; + HyperGeoForm.Show; end; // Menu "Simulations" > "z for a given cum. Probability" diff --git a/applications/lazstats/source/forms/simulations/hypergeounit.lfm b/applications/lazstats/source/forms/simulations/hypergeounit.lfm index 87442ca3c..3ac83436a 100644 --- a/applications/lazstats/source/forms/simulations/hypergeounit.lfm +++ b/applications/lazstats/source/forms/simulations/hypergeounit.lfm @@ -1,355 +1,314 @@ -object HyperGeoForm: THyperGeoForm +inherited HyperGeoForm: THyperGeoForm AnchorSideRight.Control = Label8 AnchorSideRight.Side = asrBottom Left = 303 Height = 310 Top = 156 - Width = 339 + Width = 693 Anchors = [akTop] - AutoSize = True - BorderStyle = bsSingle Caption = 'Hypergeometric Probabilities' ClientHeight = 310 - ClientWidth = 339 - OnActivate = FormActivate - OnCreate = FormCreate - OnShow = ResetBtnClick - Position = poMainFormCenter - LCLVersion = '2.1.0.0' - object Label1: TLabel - AnchorSideTop.Control = SampSizeEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = Label8 - AnchorSideRight.Side = asrBottom - Left = 134 - Height = 15 - Top = 12 - Width = 68 - Anchors = [akTop, akRight] - Caption = 'Sample Size: ' - ParentColor = False + ClientWidth = 693 + inherited ParamsPanel: TPanel + Height = 294 + ClientHeight = 294 + inherited CloseBtn: TButton + Top = 269 + TabOrder = 12 + end + inherited ComputeBtn: TButton + Top = 269 + TabOrder = 11 + end + inherited ResetBtn: TButton + Top = 269 + TabOrder = 10 + end + inherited HelpBtn: TButton + Top = 269 + TabOrder = 9 + end + inherited ButtonBevel: TBevel + Top = 253 + end + object SampSizeLabel: TLabel[5] + AnchorSideTop.Control = SampSizeEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Label8 + AnchorSideRight.Side = asrBottom + Left = 116 + Height = 15 + Top = 4 + Width = 68 + Anchors = [akTop, akRight] + Caption = 'Sample Size: ' + ParentColor = False + end + object SampObsLabel: TLabel[6] + AnchorSideTop.Control = SampObsEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Label8 + AnchorSideRight.Side = asrBottom + Left = 32 + Height = 15 + Top = 31 + Width = 152 + Anchors = [akTop, akRight] + Caption = 'Number observed in sample:' + ParentColor = False + end + object PopObsLabel: TLabel[7] + AnchorSideTop.Control = PopObsEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Label8 + AnchorSideRight.Side = asrBottom + Left = 12 + Height = 15 + Top = 85 + Width = 172 + Anchors = [akTop, akRight] + Caption = 'Number observed in population:' + ParentColor = False + end + object PopSizeLabel: TLabel[8] + AnchorSideTop.Control = PopSizeEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Label8 + AnchorSideRight.Side = asrBottom + Left = 103 + Height = 15 + Top = 58 + Width = 81 + Anchors = [akTop, akRight] + Caption = 'Population Size' + ParentColor = False + end + object SampSizeEdit: TEdit[9] + AnchorSideLeft.Control = ProbGEEdit + AnchorSideTop.Control = ParamsPanel + AnchorSideRight.Control = ParamsPanel + AnchorSideRight.Side = asrBottom + Left = 192 + Height = 23 + Top = 0 + Width = 99 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight] + TabOrder = 0 + Text = 'SampSizeEdit' + end + object SampObsEdit: TEdit[10] + AnchorSideLeft.Control = SampSizeEdit + AnchorSideTop.Control = SampSizeEdit + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = ParamsPanel + AnchorSideRight.Side = asrBottom + Left = 192 + Height = 23 + Top = 27 + Width = 99 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 4 + TabOrder = 1 + Text = 'SampObsEdit' + end + object PopSizeEdit: TEdit[11] + AnchorSideLeft.Control = SampSizeEdit + AnchorSideTop.Control = SampObsEdit + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = ParamsPanel + AnchorSideRight.Side = asrBottom + Left = 192 + Height = 23 + Top = 54 + Width = 99 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 4 + TabOrder = 2 + Text = 'PopSizeEdit' + end + object PopObsEdit: TEdit[12] + AnchorSideLeft.Control = SampSizeEdit + AnchorSideTop.Control = PopSizeEdit + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = ParamsPanel + AnchorSideRight.Side = asrBottom + Left = 192 + Height = 23 + Top = 81 + Width = 99 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 4 + TabOrder = 3 + Text = 'PopObsEdit' + end + object Label5: TLabel[13] + AnchorSideTop.Control = ProbXEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Label8 + AnchorSideRight.Side = asrBottom + Left = 100 + Height = 15 + Top = 124 + Width = 84 + Anchors = [akTop, akRight] + Caption = 'Probability of X:' + ParentColor = False + end + object Label6: TLabel[14] + AnchorSideTop.Control = ProbGTEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Label8 + AnchorSideRight.Side = asrBottom + Left = 47 + Height = 15 + Top = 151 + Width = 137 + Anchors = [akTop, akRight] + Caption = 'Probability greater than X:' + ParentColor = False + end + object Label7: TLabel[15] + AnchorSideTop.Control = ProbLEEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Label8 + AnchorSideRight.Side = asrBottom + Left = 32 + Height = 15 + Top = 178 + Width = 152 + Anchors = [akTop, akRight] + Caption = 'Probability less or equal to X:' + ParentColor = False + end + object Label8: TLabel[16] + AnchorSideTop.Control = ProbGEEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = ProbGEEdit + Left = 14 + Height = 15 + Top = 205 + Width = 170 + Anchors = [akTop, akRight] + BorderSpacing.Left = 16 + Caption = 'Probability greater or equal to X:' + ParentColor = False + end + object Label9: TLabel[17] + AnchorSideTop.Control = ProbLTEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Label8 + AnchorSideRight.Side = asrBottom + Left = 65 + Height = 15 + Top = 232 + Width = 119 + Anchors = [akTop, akRight] + Caption = 'Probability less than X:' + ParentColor = False + end + object ProbXEdit: TEdit[18] + AnchorSideLeft.Control = SampSizeEdit + AnchorSideTop.Control = PopObsEdit + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = ParamsPanel + AnchorSideRight.Side = asrBottom + Left = 192 + Height = 23 + Top = 120 + Width = 99 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 16 + Font.Style = [fsBold] + ParentFont = False + ReadOnly = True + TabOrder = 4 + Text = 'ProbXEdit' + end + object ProbGTEdit: TEdit[19] + AnchorSideLeft.Control = SampSizeEdit + AnchorSideTop.Control = ProbXEdit + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = ParamsPanel + AnchorSideRight.Side = asrBottom + Left = 192 + Height = 23 + Top = 147 + Width = 99 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 4 + Font.Style = [fsBold] + ParentFont = False + ReadOnly = True + TabOrder = 5 + Text = 'ProbGTEdit' + end + object ProbLEEdit: TEdit[20] + AnchorSideLeft.Control = ProbGEEdit + AnchorSideTop.Control = ProbGTEdit + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = ParamsPanel + AnchorSideRight.Side = asrBottom + Left = 192 + Height = 23 + Top = 174 + Width = 99 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 4 + Font.Style = [fsBold] + ParentFont = False + ReadOnly = True + TabOrder = 6 + Text = 'ProbLEEdit' + end + object ProbGEEdit: TEdit[21] + AnchorSideLeft.Control = Label8 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = ProbLEEdit + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = ParamsPanel + AnchorSideRight.Side = asrBottom + Left = 192 + Height = 23 + Top = 201 + Width = 99 + Alignment = taRightJustify + Anchors = [akTop, akRight] + BorderSpacing.Left = 8 + BorderSpacing.Top = 4 + Font.Style = [fsBold] + ParentFont = False + ReadOnly = True + TabOrder = 7 + Text = 'ProbGEEdit' + end + object ProbLTEdit: TEdit[22] + AnchorSideLeft.Control = ProbGEEdit + AnchorSideTop.Control = ProbGEEdit + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = ParamsPanel + AnchorSideRight.Side = asrBottom + Left = 192 + Height = 23 + Top = 228 + Width = 99 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 4 + Font.Style = [fsBold] + ParentFont = False + ReadOnly = True + TabOrder = 8 + Text = 'ProbLTEdit' + end end - object Label2: TLabel - AnchorSideTop.Control = SampObsEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = Label8 - AnchorSideRight.Side = asrBottom - Left = 50 - Height = 15 - Top = 39 - Width = 152 - Anchors = [akTop, akRight] - Caption = 'Number observed in sample:' - ParentColor = False - end - object Label3: TLabel - AnchorSideTop.Control = PopObsEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = Label8 - AnchorSideRight.Side = asrBottom - Left = 118 - Height = 15 - Top = 93 - Width = 84 - Anchors = [akTop, akRight] - Caption = 'Population Size:' - ParentColor = False - end - object Label4: TLabel - AnchorSideTop.Control = PopSizeEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = Label8 - AnchorSideRight.Side = asrBottom - Left = 30 - Height = 15 - Top = 66 - Width = 172 - Anchors = [akTop, akRight] - Caption = 'Number observed in population:' - ParentColor = False - end - object Label5: TLabel - AnchorSideTop.Control = ProbXEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = Label8 - AnchorSideRight.Side = asrBottom - Left = 118 - Height = 15 - Top = 132 - Width = 84 - Anchors = [akTop, akRight] - Caption = 'Probability of X:' - ParentColor = False - end - object Label6: TLabel - AnchorSideTop.Control = ProbGTEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = Label8 - AnchorSideRight.Side = asrBottom - Left = 65 - Height = 15 - Top = 159 - Width = 137 - Anchors = [akTop, akRight] - Caption = 'Probability greater than X:' - ParentColor = False - end - object Label7: TLabel - AnchorSideTop.Control = ProbLEEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = Label8 - AnchorSideRight.Side = asrBottom - Left = 50 - Height = 15 - Top = 186 - Width = 152 - Anchors = [akTop, akRight] - Caption = 'Probability less or equal to X:' - ParentColor = False - end - object Label8: TLabel - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = ProbGEEdit - AnchorSideTop.Side = asrCenter - Left = 32 - Height = 15 - Top = 213 - Width = 170 - BorderSpacing.Left = 32 - Caption = 'Probability greater or equal to X:' - ParentColor = False - end - object Label9: TLabel - AnchorSideTop.Control = ProbLTEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = Label8 - AnchorSideRight.Side = asrBottom - Left = 83 - Height = 15 - Top = 240 - Width = 119 - Anchors = [akTop, akRight] - Caption = 'Probability less than X:' - ParentColor = False - end - object ResetBtn: TButton - AnchorSideTop.Control = ReturnBtn - AnchorSideRight.Control = ComputeBtn - Left = 65 - Height = 25 - Top = 276 - Width = 54 - Anchors = [akTop, akRight] - AutoSize = True - BorderSpacing.Left = 16 - BorderSpacing.Right = 12 - BorderSpacing.Bottom = 8 - Caption = 'Reset' - OnClick = ResetBtnClick - TabOrder = 0 - end - object ComputeBtn: TButton - AnchorSideLeft.Control = Owner - AnchorSideLeft.Side = asrCenter - AnchorSideTop.Control = ReturnBtn - Left = 131 - Height = 25 - Top = 276 - Width = 76 - AutoSize = True - Caption = 'Compute' - OnClick = ComputeBtnClick - TabOrder = 1 - end - object ReturnBtn: TButton - AnchorSideLeft.Control = ComputeBtn - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = Bevel1 - AnchorSideTop.Side = asrBottom - Left = 219 - Height = 25 - Top = 276 - Width = 61 - AutoSize = True - BorderSpacing.Left = 12 - BorderSpacing.Top = 8 - BorderSpacing.Right = 16 - BorderSpacing.Bottom = 8 - Caption = 'Return' - ModalResult = 1 - TabOrder = 2 - end - object SampSizeEdit: TEdit - AnchorSideLeft.Control = ProbGEEdit - AnchorSideTop.Control = Owner - AnchorSideRight.Control = ProbGEEdit - AnchorSideRight.Side = asrBottom - Left = 210 - Height = 23 - Top = 8 - Width = 82 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 8 - TabOrder = 3 - Text = 'SampSizeEdit' - end - object SampObsEdit: TEdit - AnchorSideLeft.Control = SampSizeEdit - AnchorSideTop.Control = SampSizeEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = ProbGEEdit - AnchorSideRight.Side = asrBottom - Left = 210 - Height = 23 - Top = 35 - Width = 82 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 4 - TabOrder = 4 - Text = 'Edit1' - end - object PopSizeEdit: TEdit - AnchorSideLeft.Control = SampSizeEdit - AnchorSideTop.Control = SampObsEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = ProbGEEdit - AnchorSideRight.Side = asrBottom - Left = 210 - Height = 23 - Top = 62 - Width = 82 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 4 - TabOrder = 5 - Text = 'Edit1' - end - object PopObsEdit: TEdit - AnchorSideLeft.Control = SampSizeEdit - AnchorSideTop.Control = PopSizeEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = ProbGEEdit - AnchorSideRight.Side = asrBottom - Left = 210 - Height = 23 - Top = 89 - Width = 82 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 4 - TabOrder = 6 - Text = 'Edit1' - end - object ProbXEdit: TEdit - AnchorSideLeft.Control = SampSizeEdit - AnchorSideTop.Control = PopObsEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = ProbLEEdit - AnchorSideRight.Side = asrBottom - Left = 210 - Height = 23 - Top = 128 - Width = 82 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 16 - Font.Style = [fsBold] - ParentFont = False - ReadOnly = True - TabOrder = 7 - Text = 'Edit1' - end - object ProbGTEdit: TEdit - AnchorSideLeft.Control = SampSizeEdit - AnchorSideTop.Control = ProbXEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = ProbGEEdit - AnchorSideRight.Side = asrBottom - Left = 210 - Height = 23 - Top = 155 - Width = 82 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 4 - Font.Style = [fsBold] - ParentFont = False - ReadOnly = True - TabOrder = 8 - Text = 'Edit1' - end - object ProbLEEdit: TEdit - AnchorSideLeft.Control = ProbGEEdit - AnchorSideTop.Control = ProbGTEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = ProbGEEdit - AnchorSideRight.Side = asrBottom - Left = 210 - Height = 23 - Top = 182 - Width = 82 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 4 - Font.Style = [fsBold] - ParentFont = False - ReadOnly = True - TabOrder = 9 - Text = 'Edit1' - end - object ProbGEEdit: TEdit - AnchorSideLeft.Control = Label8 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = ProbLEEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = SampSizeEdit - AnchorSideRight.Side = asrBottom - Left = 210 - Height = 23 - Top = 209 - Width = 82 - Alignment = taRightJustify - BorderSpacing.Left = 8 - BorderSpacing.Top = 4 - BorderSpacing.Right = 32 - Font.Style = [fsBold] - ParentFont = False - ReadOnly = True - TabOrder = 10 - Text = 'Edit1' - end - object ProbLTEdit: TEdit - AnchorSideLeft.Control = ProbGEEdit - AnchorSideTop.Control = ProbGEEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = ProbGEEdit - AnchorSideRight.Side = asrBottom - Left = 210 - Height = 23 - Top = 236 - Width = 82 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 4 - Font.Style = [fsBold] - ParentFont = False - ReadOnly = True - TabOrder = 11 - Text = 'Edit1' - end - object Bevel1: TBevel - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = ProbLTEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - Left = 0 - Height = 9 - Top = 259 - Width = 339 - Anchors = [akTop, akLeft, akRight] - Shape = bsBottomLine + inherited ParamsSplitter: TSplitter + Height = 310 end end diff --git a/applications/lazstats/source/forms/simulations/hypergeounit.pas b/applications/lazstats/source/forms/simulations/hypergeounit.pas index 03db324d4..7376a5108 100644 --- a/applications/lazstats/source/forms/simulations/hypergeounit.pas +++ b/applications/lazstats/source/forms/simulations/hypergeounit.pas @@ -5,19 +5,14 @@ unit HyperGeoUnit; interface uses - Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, - StdCtrls, ExtCtrls, - FunctionsLib, OutputUnit; + Classes, SysUtils, Forms, Controls, Graphics, StdCtrls, ExtCtrls, + FunctionsLib, BasicStatsReportFormUnit; type { THyperGeoForm } - THyperGeoForm = class(TForm) - Bevel1: TBevel; - ResetBtn: TButton; - ComputeBtn: TButton; - ReturnBtn: TButton; + THyperGeoForm = class(TBasicStatsReportForm) SampSizeEdit: TEdit; SampObsEdit: TEdit; PopSizeEdit: TEdit; @@ -27,39 +22,157 @@ type ProbLEEdit: TEdit; ProbGEEdit: TEdit; ProbLTEdit: TEdit; - Label1: TLabel; - Label2: TLabel; - Label3: TLabel; - Label4: TLabel; + SampSizeLabel: TLabel; + SampObsLabel: TLabel; + PopObsLabel: TLabel; + PopSizeLabel: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; - procedure ComputeBtnClick(Sender: TObject); - procedure FormActivate(Sender: TObject); - procedure FormCreate(Sender: TObject); - procedure ResetBtnClick(Sender: TObject); - procedure FisherTable(A,B,C,D, p, SumP : double); private { private declarations } - + procedure FisherTable(A,B,C,D, p, SumP: double; AReport: TStrings); + + protected + procedure AdjustConstraints; override; + procedure Compute; override; + function Validate(out AMsg: String; out AControl: TWinControl): Boolean; override; + public - { public declarations } + procedure Reset; override; + end; var HyperGeoForm: THyperGeoForm; + implementation +{$R *.lfm} + uses Math; + { THyperGeoForm } -procedure THyperGeoForm.ResetBtnClick(Sender: TObject); +procedure THyperGeoForm.AdjustConstraints; begin + inherited; + + ParamsPanel.Constraints.MinHeight := ProbLTEdit.Top + ProbLTEdit.Height + + ButtonBevel.Height + CloseBtn.BorderSpacing.Top + CloseBtn.Height; + ParamsPanel.Constraints.MinWidth := Max( + Max(PopSizeLabel.Width, Label8.Width) + Label8.BorderSpacing.Left + ProbGEEdit.BorderSpacing.Left + ProbGEEdit.Width, + 4*CloseBtn.Width + 3*CloseBtn.BorderSpacing.Left + );; +end; + + +procedure THyperGeoForm.Compute; +var + SampObs, PopObs, SampSize, PopSize: double; + A, B, C, D, APlusB, CPlusD: double; + ProbX, Prob, SumProb, ProbGE, ProbGT, ProbLT, ProbLE: double; + done: boolean; + lReport: TStrings; +begin + lReport := TStringList.Create; + try + lReport.Add('HYPERGEOMETRIC DISTRIBUTION CALCULATIONS'); + lReport.Add('Accumulating Values of the distribution'); + lReport.Add(''); + + label5.Enabled := true; + label6.Enabled := true; + label7.Enabled := true; + label8.Enabled := true; + label9.Enabled := true; + ProbXEdit.Enabled := true; + ProbGEEdit.Enabled := true; + ProbLTEdit.Enabled := true; + ProbLEEdit.Enabled := true; + ProbGTEdit.Enabled := true; + + SampObs := StrToFloat(SampObsEdit.Text); + PopObs := StrToFloat(PopObsEdit.Text); + SampSize := StrToFloat(SampSizeEdit.Text); + PopSize := StrToFloat(PopSizeEdit.Text); + + done := false; + SumProb := 0.0; + + A := SampObs; + B := SampSize - A; + C := PopObs; + D := PopSize - C; + APlusB := A + B; + CPlusD := C + D; + + ProbX := combos(A,C) * combos(B,D) / combos(APlusB,CPlusD); + ProbXEdit.Text := Format('%.4f', [ProbX]); + SumProb := SumProb + ProbX; + FisherTable(A,B,C,D,ProbX,SumProb, lReport); + + // get more extreme probabilities + while not done do + begin + if A = APlusB then + done := true + else + begin + A := A + 1; + B := B - 1; + if (A < 0) or (B < 0) or (C < 0) or (D < 0) then done := true; + end; + if not done then + begin + Prob := combos(A,C) * combos(B,D) / combos(APlusB,CPlusD); + SumProb := SumProb + Prob; + FisherTable(A,B,C,D,Prob,SumProb, lReport); + lReport.Add(''); + end; + end; // end while not done + + ProbGE := SumProb; + ProbGT := SumProb - ProbX; + ProbLT := 1.0 - ProbGE; + ProbLE := ProbLT + ProbX; + ProbGEEdit.Text := Format('%.4f', [ProbGE]); + ProbLEEdit.Text := Format('%.4f', [ProbLE]); + ProbGTEdit.Text := Format('%.4f', [ProbGT]); + ProbLTEdit.Text := Format('%.4f', [ProbLT]); + + FReportFrame.DisplayReport(lReport); + finally + lReport.Free; + end; +end; + + +procedure THyperGeoForm.FisherTable(A,B,C,D, p, SumP: double; AReport: TStrings); +begin + AReport.Add('Table for Hypergeometric Probabilities'); + AReport.Add('----------------------------------'); + AReport.Add(' Row Column '); + AReport.Add(' 1 2 '); + AReport.Add(' --- ---------- -----------'); + AReport.Add(' 1 %8.0f %8.0f', [A, B]); + AReport.Add(' 2 %8.0f %8.0f', [C, D]); + AReport.Add('----------------------------------'); + AReport.Add('Probability: %8.4f', [p]); + AReport.Add('Cumulative Probability: %8.4f', [SumP]); + AReport.Add(''); +end; + + +procedure THyperGeoForm.Reset; +begin + inherited; + SampSizeEdit.Text := ''; SampObsEdit.Text := ''; PopSizeEdit.Text := ''; @@ -81,122 +194,43 @@ begin ProbGTEdit.Enabled := false; end; -procedure THyperGeoForm.ComputeBtnClick(Sender: TObject); -VAR - SampObs, PopObs, SampSize, PopSize, N : double; - A, B, C, D, APlusC, BPlusD, APlusB, CPlusD : double; - ProbX, Prob, SumProb, ProbGE, ProbGT, ProbLT, ProbLE : double; - done : boolean; - outvalue : string; -begin - done := false; - SumProb := 0.0; - label5.Enabled := true; - label6.Enabled := true; - label7.Enabled := true; - label8.Enabled := true; - label9.Enabled := true; - ProbXEdit.Enabled := true; - ProbGEEdit.Enabled := true; - ProbLTEdit.Enabled := true; - ProbLEEdit.Enabled := true; - ProbGTEdit.Enabled := true; - SampObs := StrToFloat(SampObsEdit.Text); - PopObs := StrToFloat(PopObsEdit.Text); - SampSize := StrToFloat(SampSizeEdit.Text); - PopSize := StrToFloat(PopSizeEdit.Text); - A := SampObs; - B := SampSize - A; - C := PopObs; - D := PopSize - C; - APlusC := A + C; - BPlusD := B + D; - APlusB := A + B; - CPlusD := C + D; - N := A + B + C + D; -// largest := 1; - OutputFrm.RichEdit.Clear; - OutputFrm.RichEdit.Lines.Add('Hypergeometric Distribution Calculations'); - OutputFrm.RichEdit.Lines.Add(''); - OutputFrm.RichEdit.Lines.Add('Accumulating Values of the distribution'); - OutputFrm.RichEdit.Lines.Add(''); - ProbX := combos(A,C) * combos(B,D) / combos(APlusB,CPlusD); - outvalue := format('%6.4f',[ProbX]); - ProbXEdit.Text := outvalue; - SumProb := SumProb + ProbX; - FisherTable(A,B,C,D,ProbX,SumProb); - - // get more extreme probabilities - while not done do - begin - if A = APlusB then done := true - else begin - A := A + 1; - B := B - 1; - if (A < 0) or (B < 0) or (C < 0) or (D < 0) then done := true; - end; - if not done then - begin - Prob := combos(A,C) * combos(B,D) / combos(APlusB,CPlusD); - SumProb := SumProb + Prob; - FisherTable(A,B,C,D,Prob,SumProb); - end; - end; // end while not done - OutputFrm.ShowModal; - ProbGE := SumProb; - ProbGT := SumProb - ProbX; - ProbLT := 1.0 - ProbGE; - ProbLE := ProbLT + ProbX; - outvalue := format('%6.4f',[ProbGE]); - ProbGEEdit.Text := outvalue; - outvalue := format('%6.4f',[ProbLE]); - ProbLEEdit.Text := outvalue; - outvalue := format('%6.4f',[ProbGT]); - ProbGTEdit.Text := outvalue; - outvalue := format('%6.4f',[ProbLT]); - ProbLTEdit.Text := outvalue; - OutputFrm.RichEdit.Clear; -end; - -procedure THyperGeoForm.FisherTable(A,B,C,D, p, SumP : double); -VAR - outline : string; -begin - OutputFrm.RichEdit.Lines.Add(''); - OutputFrm.RichEdit.Lines.Add('Table for Hypergeometric Probabilities'); - OutputFrm.RichEdit.Lines.Add(' Column'); - OutputFrm.RichEdit.Lines.Add('Row 1 2'); - outline := format(' 1 %10.0f %10.0f',[A,B]); - OutputFrm.RichEdit.Lines.Add(outline); - outline := format(' 2 %10.0f %10.0f',[C,D]); - OutputFrm.RichEdit.Lines.Add(outline); - outline := format('Probability = %6.4f',[p]); - OutputFrm.RichEdit.Lines.Add(outline); - OutputFrm.RichEdit.Lines.Add(''); - outline := format('Cumulative Probability = %6.4f',[SumP]); - OutputFrm.RichEdit.Lines.Add(outline); - OutputFrm.RichEdit.Lines.Add(''); -end; - -procedure THyperGeoForm.FormActivate(Sender: TObject); +function THyperGeoForm.Validate(out AMsg: String; out AControl: TWinControl): Boolean; var - w: Integer; + n: Integer; begin - w := MaxValue([ResetBtn.Width, ComputeBtn.Width, ReturnBtn.Width]); - ResetBtn.Constraints.MinWidth := w; - ComputeBtn.Constraints.MinWidth := w; - ReturnBtn.Constraints.MinWidth := w; -end; + Result := false; -procedure THyperGeoForm.FormCreate(Sender: TObject); -begin - if OutputFrm = nil then - Application.CreateForm(TOutputFrm, OutputFrm); -end; + if (SampSizeEdit.Text = '') or not TryStrToInt(SampSizeEdit.Text, n) or (n <= 0) then + begin + AMsg := 'Valid positive integer number required.'; + AControl := SampSizeEdit; + exit; + end; -initialization - {$I hypergeounit.lrs} + if (SampObsEdit.Text = '') or not TryStrToInt(SampObsEdit.Text, n) or (n <= 0) then + begin + AMsg := 'Valid positive integer number required.'; + AControl := SampObsEdit; + exit; + end; + + if (PopSizeEdit.Text = '') or not TryStrToInt(PopSizeEdit.Text, n) or (n <= 0) then + begin + AMsg := 'Valid positive integer number required.'; + AControl := PopSizeEdit; + exit; + end; + + if (PopObsEdit.Text = '') or not TryStrToInt(PopObsEdit.Text, n) or (n <= 0) then + begin + AMsg := 'Valid positive integer number required.'; + AControl := PopObsEdit; + exit; + end; + + Result := true; +end; end.