问题来源: https://blog.51cto.com/u_14617575/2745132

本例效果图:

回复_程序开发


代码文件:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Grids;

type
  TForm1 = class(TForm)
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    LabeledEdit3: TLabeledEdit;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure LabeledEdit2KeyPress(Sender: TObject; var Key: Char);
    procedure LabeledEdit3KeyPress(Sender: TObject; var Key: Char);
    procedure LabeledEdit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  end;

  {自定义的类, 用于显示字符列表}
  TMyClass = class(TStringGrid)
  private
    FCharList: string;
    procedure SetCharList(const str: string);
  public
    constructor Create(AOwner: TComponent); override;
    procedure SetChar(ind: Integer; char: Char);
    property CharList: string read FCharList write SetCharList;
    procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  MyTable: TMyClass;

procedure TForm1.FormCreate(Sender: TObject);
begin
  LabeledEdit1.EditLabel.Caption := '字符列表';
  LabeledEdit2.EditLabel.Caption := '插入位置(数字)';
  LabeledEdit3.EditLabel.Caption := '要插入的字符(字母)';

  MyTable := TMyClass.Create(Self);
  MyTable.Parent := Self;
  MyTable.Left := 8;
  MyTable.Top := 12;
end;

procedure TForm1.LabeledEdit2KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9']) then Key := #0;
end;

procedure TForm1.LabeledEdit3KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['A'..'Z', 'a'..'z']) then
    Key := #0
  else TLabeledEdit(Sender).SelectAll;
end;

procedure TForm1.LabeledEdit1Change(Sender: TObject);
begin
  MyTable.CharList := LabeledEdit1.Text;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  c: Char;
begin
  if LabeledEdit3.Text = '' then Exit;
  i := StrToIntDef(LabeledEdit2.Text, 0);
  c := LabeledEdit3.Text[1];
  MyTable.SetChar(i, c);
  LabeledEdit1.Text := MyTable.FCharList;
end;


{ 下面是 TMyClass 的代码 }

//建立时调整 StringGrid 的外观
constructor TMyClass.Create(AOwner: TComponent);
begin
  inherited;
  FixedCols := 0;
  FixedRows := 0;
  RowCount := 1;
  ColCount := 3;
  Font.Size := 10;
  Font.Color := clRed;
  Font.Style := [fsBold];

  DefaultColWidth := DefaultRowHeight;
  Height := DefaultRowHeight + 4;
  Width := (DefaultColWidth + 1) * ColCount + 3;
end;

//赋予字符列表
procedure TMyClass.SetCharList(const str: string);
var
  i: Integer;
begin
  if str = '' then Rows[0][0] := '' else
  begin
    FCharList := str;
    ColCount := Length(str);
    for i := 0 to ColCount - 1 do Rows[0][i] := str[i+1];
    Width := (DefaultColWidth + 1) * ColCount + 3;
  end;
end;

//让字符居中
procedure TMyClass.DrawCell(ACol, ARow: Integer; ARect: TRect;
  AState: TGridDrawState);
var
  str: string;
begin
  inherited;
  Canvas.FillRect(ARect);
  str := Cells[ACol,ARow];
  Canvas.TextRect(ARect, str, [tfSingleLine, tfCenter, tfVerticalCenter]);
end;

//插入字符
procedure TMyClass.SetChar(ind: Integer; char: Char);
var
  s1,s2: string;
  i: Integer;
begin
  if ind > Length(FCharList) then
    i := Length(FCharList)
  else i := ind;

  s1 := Copy(FCharList, 0, i);
  s2 := Copy(FCharList, i+1, Length(FCharList));
  FCharList := s1 + char + s2;
  SetCharList(FCharList);
end;

end.
窗体设计:
object Form1: TForm1
  Left = 384
  Top = 206
  Caption = 'Form1'
  ClientHeight = 202
  ClientWidth = 255
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesigned
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object LabeledEdit1: TLabeledEdit
    Left = 8
    Top = 75
    Width = 227
    Height = 21
    EditLabel.Width = 61
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit1'
    TabOrder = 0
    OnChange = LabeledEdit1Change
  end
  object LabeledEdit2: TLabeledEdit
    Left = 8
    Top = 123
    Width = 121
    Height = 21
    EditLabel.Width = 61
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit2'
    TabOrder = 1
    OnKeyPress = LabeledEdit2KeyPress
  end
  object LabeledEdit3: TLabeledEdit
    Left = 8
    Top = 167
    Width = 121
    Height = 21
    EditLabel.Width = 61
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit3'
    TabOrder = 2
    OnKeyPress = LabeledEdit3KeyPress
  end
  object Button1: TButton
    Left = 160
    Top = 165
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 3
    OnClick = Button1Click
  end
end