⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 《参透Delphi Kylix》通过131个事例
💻 PAS
📖 第 1 页 / 共 2 页
字号:
        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 + -