StringGrid單元格繫結ComboBox、DateTimePicker或視窗傳值

沧江魅影發表於2024-08-20

一、初始化控制元件狀態

複製程式碼
procedure TForm7.FormCreate(Sender: TObject);
begin
  with StringGrid1 do
  begin
    ColWidths[0] := 15;
    Cells[1, 0] := 'Combobox';
    ColWidths[1] := 100;
    Cells[2, 0] := 'DateTimePicker';
    ColWidths[2] := 100;
    Cells[3, 0] := 'Form';
    ColWidths[3] := 100;
  end;
  ComboBox1.visible := False;
  DateTimePicker1.Visible := False;
end;
複製程式碼

二、選擇單元格顯示控制元件

複製程式碼
procedure TForm7.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
var
  R: TRect;
  org: TPoint;
begin
  if Form8 = nil then
    Application.CreateForm(TForm8, Form8);
  with Sender as TStringGrid do
  begin
    //第一列
    if ACol = 1 then
    begin
      Perform(WM_CANCELMODE, 0, 0);
      R := CellRect(ACol, ARow);
      org := Self.ScreenToClient(ClientToScreen(R.topleft));
      with ComboBox1 do
      begin
        SetBounds(org.X, org.Y, R.right - R.left, Height);
        itemindex := Items.IndexOf(Cells[ACol, ARow]);
        Show;
        BringToFront;
        SetFocus;
        DroppedDown := True;
      end;
    end;
    if ACol = 2 then
    begin
      Perform(WM_CANCELMODE, 0, 0);
      R := CellRect(ACol, ARow);
      org := Self.ScreenToClient(ClientToScreen(R.topleft));
      with DateTimePicker1 do
      begin
        SetBounds(org.X, org.Y, R.right - R.left, Height);
        if Cells[ACol, ARow] <> '' then
          Date := StrToDate(Cells[ACol, ARow]);
        Show;
        BringToFront;
        SetFocus;
      end;
    end;
    if ACol = 3 then
    begin
      Perform(WM_CANCELMODE, 0, 0);
      Form8.Caption := VarToStr(ARow) + '-' + VarToStr(ACol);
      Form8.ShowModal;
      with StringGrid1 do
        StringGrid1.cells[ACol, ARow] := Form8.Caption;
    end;
  end;
end;
複製程式碼

三、DateTimePicker1失去焦點

複製程式碼
procedure TForm7.DateTimePicker1Exit(Sender: TObject);
begin
  with Sender as TDateTimePicker do
  begin
    Hide;
    with StringGrid1 do
      cells[Col, Row] := DateToStr(DateTimePicker1.Date);
  end;
end;
複製程式碼

四、ComboBox1失去焦點

複製程式碼
procedure TForm7.ComboBox1Exit(Sender: TObject);
begin
  with Sender as TComboBox do
  begin
    Hide;
    if itemindex >= 0 then
    begin
      with StringGrid1 do
        cells[Col, Row] := items[itemindex];
    end;
  end;
end;
複製程式碼

效果展示

Demo下載

本文來自部落格園,作者:liessay,轉載請註明原文連結:https://www.cnblogs.com/liessay/p/16228372.html

相關文章