📄 main.pas
字号:
Str := SysUtils.Format('%2.2d', [ACol]);
Self.DrawGrid.Canvas.Font.Color := clBlack;
end;
cfReservedBmpCell, cfDiscardedBmpCell:
begin
DrawAnalyzedCellBitmap(Sender, ACol, ARow, Rect, State, CellFlag);
exit;
end;
end;
Self.DrawGrid.Canvas.FillRect(Rect);
if Str <> '' then
begin
CX := (Rect.Right - Rect.Left - Self.DrawGrid.Canvas.TextWidth(Str)) div 2;
CY := (Rect.Bottom - Rect.Top - Self.DrawGrid.Canvas.TextHeight(Str)) div 2 + 1;
Self.DrawGrid.Canvas.TextOut(Rect.Left + CX, Rect.Top + CY, Str);
end;
Self.DrawGrid.Canvas.Font.Assign(OldFont);
FreeAndNil(OldFont);
Self.DrawGrid.Canvas.Brush.Assign(OldBrush);
FreeAndNil(OldBrush);
end;
begin
if (ARow = 0) and (ACol = 0) then // Draw headline info 'Hits'
DrawCell(Sender, ACol, ARow, Rect, State, cfHeadlineInfoCell)
else if (ARow = 0) and (ACol > 0) then // Draw headline row
DrawCell(Sender, ACol, ARow, Rect, State, cfHeadlineRowCell)
else if (ARow > 0) and (ACol = 0) then // Draw headline col
DrawCell(Sender, ACol, ARow, Rect, State, cfHeadlineColCell)
else if (ARow > 0) and (ARow <= High(Self.FStakeHits) + 1) then // Draw all stakes in hit history
begin
if ARow mod 2 <> 0 then // Draw odd rows
begin
if ACol in Self.FStakeSets[ARow - 1] then // Draw normal hit cell
DrawCell(Sender, ACol, ARow, Rect, State, cfNormalHitCell)
else if ACol = Self.FStakeHits[ARow - 1].Elements[LOT_NUM_OF_SERIES + 1] then // Draw special hit cell
DrawCell(Sender, ACol, ARow, Rect, State, cfSpecialHitCell)
else // Draw odd blank cell
DrawCell(Sender, ACol, ARow, Rect, State, cfOddBlankCell)
end
else // Draw even rows
begin
if ACol in Self.FStakeSets[ARow - 1] then // Draw normal hit cell
DrawCell(Sender, ACol, ARow, Rect, State, cfNormalHitCell)
else if ACol = Self.FStakeHits[ARow - 1].Elements[LOT_NUM_OF_SERIES + 1] then // Draw special hit cell
DrawCell(Sender, ACol, ARow, Rect, State, cfSpecialHitCell)
else // Draw even blank cell
DrawCell(Sender, ACol, ARow, Rect, State, cfEvenBlankCell)
end
end
else if (ARow > High(Self.FStakeHits) + 1) then // Draw 10 blank rows for analyzing
begin
Self.FAnalyzedMinRow := Length(Self.FStakeHits) + 1;
// if (ACol >= 1) and (ACol <= 36) then
// Self.FAnalyzedRects[ARow - Length(Self.FStakeHits) - 1, ACol] := Rect;
if ACol in Self.FAnalyzedStakes[ARow - Length(Self.FStakeHits) - 1].ReservedSet then // Draw reserved cell in analyzed row
DrawCell(Sender, ACol, ARow, Rect, State, cfReservedBmpCell)
else if ACol in Self.FAnalyzedStakes[ARow - Length(Self.FStakeHits) - 1].DiscardedSet then // Draw discarded cell in analyzed row
DrawCell(Sender, ACol, ARow, Rect, State, cfDiscardedBmpCell)
else if ARow mod 2 <> 0 then // Draw odd blank rows
DrawCell(Sender, ACol, ARow, Rect, State, cfOddBlankCell)
else
DrawCell(Sender, ACol, ARow, Rect, State, cfEvenBlankCell)
end
end;
procedure TFormMain.InitDrawGrid;
begin
Self.DrawGrid.FixedColor := clPercent296077; // Headline Color
Self.DrawGrid.RowCount := System.Length(Self.FStakeHits) + LOT_BLANK_LINES + 1; Self.DrawGrid.ColCount := LOT_MAX_ELEMENT + 1; Self.DrawGrid.ColWidths[0] := 50;
end;
procedure TFormMain.SetTopRowOfDrawGrid;
var
TopRow: Integer;
begin
TopRow := System.Length(Self.FStakeHits) - Self.DrawGrid.VisibleRowCount + LOT_BLANK_LINES + 1;
Self.DrawGrid.TopRow := Math.IfThen(Self.FStakeNo <= TopRow, Self.FStakeNo + 1, TopRow);
end;
procedure TFormMain.RaiseFileNotFoundError(const FileName: string);
begin
raise SysUtils.Exception.CreateResFmt(@SBFSFileNotFoundErr, [FileName]);
end;
procedure TFormMain.UpdateStatusBar(const Info: string; Curr, Total: Integer);
begin
Self.StatusBar.Panels[0].Text := Info;
Self.StatusBar.Panels[1].Text := Format(SBFSRecInfo, [Curr, Total]); Self.StatusBar.Panels[2].Text := JuUtils.IfThen(Self.FModified, 'Modified', 'Consistent');end;
procedure TFormMain.DrawGridMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
Col, Row, Index: Integer;
Rect: TRect;
begin
Self.DrawGrid.MouseToCell(X, Y, Col, Row);
if (Row >= Self.FAnalyzedMinRow) and (Col > 0) then
begin
Index := Row - System.Length(Self.FStakeHits) - 1;
case Button of
mbLeft: // reserve or discard the cell
begin
if Col in Self.FAnalyzedStakes[Index].ReservedSet then
begin
System.Exclude(Self.FAnalyzedStakes[Index].ReservedSet, Col);
System.Include(Self.FAnalyzedStakes[Index].DiscardedSet, Col);
end
else
begin
System.Exclude(Self.FAnalyzedStakes[Index].DiscardedSet, Col);
System.Include(Self.FAnalyzedStakes[Index].ReservedSet, Col);
end;
end;
mbRight: // Uncheck the cell
begin
if Col in Self.FAnalyzedStakes[Index].ReservedSet then
System.Exclude(Self.FAnalyzedStakes[Index].ReservedSet, Col)
else if Col in Self.FAnalyzedStakes[Index].DiscardedSet then
System.Exclude(Self.FAnalyzedStakes[Index].DiscardedSet, Col);
end;
end;
// Self.DrawGrid.Repaint();
Rect := Self.DrawGrid.CellRect(Col, Row);
Windows.InvalidateRect(Self.DrawGrid.Handle, @Rect, True);
end;
end;
{
procedure TFormMain.PageControlDrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);
procedure RenderTitles(PageControl: TPageControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
Index, CX, CY: Integer;
Title: string;
Bmp: TBitmap;
begin
Title := PageControl.Pages[TabIndex].Caption;
CX := Rect.Left + (Rect.Right - Rect.Left - PageControl.Canvas.TextWidth(Title)) div 2;
CY := Rect.Top + (Rect.Bottom - Rect.Top - PageControl.Canvas.TextHeight(Title)) div 2;
Index := PageControl.Pages[TabIndex].ImageIndex;
JuUtils.DrawBitmapFromImageList(PageControl.Canvas, CX, CY, Self.ImageList, Index);
CX := CX + Bmp.Width + 2;
PageControl.Canvas.Font.Color := clPercent183149;
PageControl.Canvas.TextOut(CX, CY, Title);
end;
begin
if Control is TPageControl then
begin
RenderTitles((Control as TPageControl), TabIndex, Rect, Active);
end;
end;
}
procedure TFormMain.GetStake(const StakeNo: Integer);
begin
Self.FStakeNo := StakeNo;
Self.FStake := Self.FStakeHits[StakeNo];
end;
function TFormMain.StakeToStr(const Stake: TLotElementArr): string;
const
Fmt = '%2.2d%2.2d%2.2d%2.2d%2.2d%2.2d%2.2d%2.2d';
begin
Result := SysUtils.Format(Fmt, [Stake[1], Stake[2], Stake[3], Stake[4], Stake[5], Stake[6], Stake[7], Stake[8]]);
end;
function TFormMain.StakeToStrFmt(const Fmt: string; const Stake: TLotElementArr): string;
begin
Result := SysUtils.Format(Fmt, [Stake[1], Stake[2], Stake[3], Stake[4], Stake[5], Stake[6], Stake[7], Stake[8]]);
end;
function TFormMain.StrToStake(const StakeStr: string): TLotElementArr;
var
TmpStr: string;
I: Integer;
begin
TmpStr := '';
for I := 1 to System.Length(StakeStr) do
if (StakeStr[I] >= '0') and (StakeStr[I] <= '9') then
TmpStr := TmpStr + StakeStr[I];
for I := 1 to System.Length(TmpStr) div 2 do
if I <= LOT_NUM_OF_SERIES + 1 then
Result[I] := SysUtils.StrToInt(System.Copy(TmpStr, I * 2 - 1, 2));
end;
procedure TFormMain.CopyStakeToWorkspace();
var
DateStr: string;
begin
Self.EditID.Text := Self.FStake.ID;
SysUtils.DateTimeToString(DateStr, 'yyyy-mm-dd', Self.FStake.Date);
Self.EditDate.Text := DateStr;
Self.EditStake.Text := Self.StakeToStrFmt(LOT_STAKE_FMT, Self.FStake.Elements);
end;
procedure TFormMain.CopyWorkspaceToStake;
begin
Self.FStake.ID := Self.EditID.Text;
Self.FStake.Date := SysUtils.StrToDate(Self.EditDate.Text);
Self.FStake.Elements := Self.StrToStake(Self.EditStake.Text);
end;
procedure TFormMain.ClearWorkspace;
var
I: Integer;
E: TLotElementArr;
begin
Self.EditID.Text := '00000';
Self.EditDate.Text := '2002-01-01';
for I := 1 to LOT_NUM_OF_SERIES + 1 do E[I] := 0;
Self.EditStake.Text := Self.StakeToStrFmt(LOT_STAKE_FMT, E);
end;
procedure TFormMain.ButtonFirstClick(Sender: TObject);
begin
Self.GetStake(0);
Self.CopyStakeToWorkspace();
Self.SetTopRowOfDrawGrid();
Self.UpdateStatusBar(SBFSReady, Self.FStakeNo + 1, Length(Self.FStakeHits));
end;
procedure TFormMain.ButtonLastClick(Sender: TObject);
begin
Self.GetStake(System.High(Self.FStakeHits));
Self.CopyStakeToWorkspace();
Self.SetTopRowOfDrawGrid();
Self.UpdateStatusBar(SBFSReady, Self.FStakeNo + 1, System.Length(Self.FStakeHits));
end;
procedure TFormMain.ButtonPrevClick(Sender: TObject);
var
StakeNo: Integer;
begin
StakeNo := Math.IfThen(Self.FStakeNo = 0, System.High(Self.FStakeHits), Self.FStakeNo - 1);
Self.GetStake(StakeNo);
Self.CopyStakeToWorkspace();
Self.SetTopRowOfDrawGrid();
Self.UpdateStatusBar(SBFSReady, Self.FStakeNo + 1, System.Length(Self.FStakeHits));
end;
procedure TFormMain.ButtonNextClick(Sender: TObject);
var
StakeNo: Integer;
begin
StakeNo := Math.IfThen(Self.FStakeNo = System.High(Self.FStakeHits), 0, Self.FStakeNo + 1);
Self.GetStake(StakeNo);
Self.CopyStakeToWorkspace();
Self.SetTopRowOfDrawGrid();
Self.UpdateStatusBar(SBFSReady, Self.FStakeNo + 1, System.Length(Self.FStakeHits));
end;
procedure TFormMain.ButtonClearClick(Sender: TObject);
begin
Self.ClearWorkspace();
Self.UpdateStatusBar(SBFSReady, 0, System.Length(Self.FStakeHits));
end;
procedure TFormMain.UpdateStakes(Flag: TUpdatingFlag);
var
I, Len: Integer;
begin
Len := System.Length(Self.FStakeHits);
case Flag of
ufAppending:
begin
System.Inc(Len);
SetLength(Self.FStakeHits, Len);
SetLength(Self.FStakeSets, Len);
Self.FStakeHits[High(Self.FStakeHits)] := Self.FStake;
for I := 1 to LOT_NUM_OF_SERIES do
System.Include(Self.FStakeSets[High(Self.FStakeSets)], Self.FStakeHits[High(Self.FStakeHits)].Elements[I]);
Self.FStakeNo := System.High(Self.FStakeHits);
end;
ufInserting:
begin
System.Inc(Len);
SetLength(Self.FStakeHits, Len);
SetLength(Self.FStakeSets, Len);
for I := High(Self.FStakeHits) - 1 downto Self.FStakeNo do
begin
Self.FStakeHits[I + 1] := Self.FStakeHits[I];
Self.FStakeSets[I + 1] := Self.FStakeSets[I];
end;
Self.FStakeHits[Self.FStakeNo] := Self.FStake;
for I := 1 to LOT_NUM_OF_SERIES do
System.Include(Self.FStakeSets[Self.FStakeNo], Self.FStakeHits[Self.FStakeNo].Elements[I]);
end;
ufModifying:
begin
Self.FStakeHits[Self.FStakeNo] := Self.FStake;
Self.FStakeSets[Self.FStakeNo] := [];
for I := 1 to LOT_NUM_OF_SERIES do
System.Include(Self.FStakeSets[Self.FStakeNo], Self.FStakeHits[Self.FStakeNo].Elements[I]);
end;
ufDeleting:
begin
if Self.FStakeNo = System.High(Self.FStakeHits) then
begin
System.Dec(Self.FStakeNo);
Self.FStake := Self.FStakeHits[Self.FStakeNo];
end
else
begin
for I := Self.FStakeNo + 1 to System.High(Self.FStakeHits) do
begin
Self.FStakeHits[I - 1] := Self.FStakeHits[I];
Self.FStakeSets[I - 1] := Self.FStakeSets[I];
end;
Self.FStake := Self.FStakeHits[Self.FStakeNo];
end;
System.Dec(Len);
Self.FStakeHits := System.Copy(Self.FStakeHits, 0, Len);
Self.FStakeSets := System.Copy(Self.FStakeSets, 0, Len);
end;
end;
end;
procedure TFormMain.SetModifiedFlag(Flag: Boolean);
begin
Self.FModified := Flag;
end;
procedure TFormMain.ButtonAppendClick(Sender: TObject);
begin
Self.CopyWorkspaceToStake();
Self.UpdateStakes(ufAppending);
Self.InitDrawGrid();
Self.SetTopRowOfDrawGrid();
Self.SetModifiedFlag();
Self.UpdateStatusBar(SBFSReady, Self.FStakeNo + 1, System.Length(Self.FStakeHits));
end;
procedure TFormMain.ButtonInsertClick(Sender: TObject);
begin
Self.CopyWorkspaceToStake();
Self.UpdateStakes(ufInserting);
Self.InitDrawGrid();
Self.SetTopRowOfDrawGrid();
Self.SetModifiedFlag();
Self.UpdateStatusBar(SBFSReady, Self.FStakeNo + 1, System.Length(Self.FStakeHits));
end;
procedure TFormMain.ButtonModifyClick(Sender: TObject);
begin
Self.CopyWorkspaceToStake();
Self.UpdateStakes(ufModifying);
Self.InitDrawGrid();
Self.SetTopRowOfDrawGrid();
Self.SetModifiedFlag();
Self.UpdateStatusBar(SBFSReady, Self.FStakeNo + 1, System.Length(Self.FStakeHits));
end;
procedure TFormMain.ButtonDeleteClick(Sender: TObject);
begin
Self.UpdateStakes(ufDeleting);
Self.CopyStakeToWorkspace();
Self.InitDrawGrid();
Self.SetTopRowOfDrawGrid();
Self.SetModifiedFlag();
Self.UpdateStatusBar(SBFSReady, Self.FStakeNo + 1, System.Length(Self.FStakeHits));
end;
procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure DoYes(var CanClose: Boolean);
begin
Self.StreamOut(Self.StreamIOProgress);
Self.SetModifiedFlag(False);
CanClose := True;
end;
var
Text: string;
begin
if Self.FModified then
begin
Text := SysUtils.Format(SDataModificationInfo, [LOT_FILE_NAME]);
case Application.MessageBox(PChar(Text), 'Notification', MB_YESNOCANCEL) of
IDYES: DoYes(CanClose);
IDNO: CanClose := True;
IDCANCEL: CanClose := False;
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -