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

📄 makepy02.pas

📁 在查询汉字拼音首字母时需要取得汉字的拼音
💻 PAS
字号:
unit MakePY02;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Clipbrd, Dialogs, DB, ADODB, StdCtrls, ComCtrls, Grids, DBGridEh;

type
  TPYForm = class(TForm)
    PYBase: TADOConnection;
    Data00: TADOQuery;
    Memo1: TRichEdit;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    SB: TStatusBar;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Data00S: TDataSource;
    DBGridEh1: TDBGridEh;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Memo2: TMemo;
    Button10: TButton;
    Button11: TButton;
    procedure ProdMSPYCode(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure TurnOnMSPYCode(Sender: TObject);
    procedure CloseForm(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure ReadMSPYFromFile(Sender: TObject);
    procedure ProdGBPYCode(Sender: TObject);
    procedure TurnOnGBPYCode(Sender: TObject);
    procedure ReadGBPYFromFile(Sender: TObject);
  private
    { Private declarations }
    MSPYCode: string;
    GBPYCode: string;
    function GetMSPYStr(HZStr: WideString): string;
    function GetGBPYStr(HZStr: WideString): string;
  public
    { Public declarations }
  end;

Const
  HZ0001: string
  =
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +
    '1234567890~!@#$%^&*()-+=\|/?<><>"""''[]{}:;,..';
  HZ0002: WideString
  =
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +
    'abcdefghijklmnopqrstuvwxyz' +
    '1234567890~!@#$%^&*()-+=\|'+
    '/?<>《》“”"'[]{}:;,.。';
var
  PYForm: TPYForm;

implementation

uses Xeduser;

{$R *.dfm}

procedure TPYForm.FormCreate(Sender: TObject);
begin
  MSPYCode := '';
  GBPYCode := '';
  Data00.Open;
end;

procedure TPYForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Data00.Close;
end;

procedure TPYForm.ReadMSPYFromFile(Sender: TObject);
var
  TS: TStringList;
begin
  TS := TStringList.Create;
  TS.LoadFromFile('MSPYCode.TXT');
  MSPYCode := TS.Text;
  TS.Free;
  Memo1.Text := MSPYCode;
  Memo1.SetFocus;
  SB.Panels[1].Text := Format('拼音字库长度:%d', [Length(MSPYCode)]);
  SB.Update;
end;

function TPYForm.GetMSPYStr(HZStr: WideString): string;
var
  n, i: integer;
  C: Char;
  PYStr: string;
begin
  Memo2.Clear;
  PYStr := '';
  for i := 1 to Length(HZStr) do begin
    C := string(HZStr[i])[1]; //取 ASCII 码判断是否汉字
    if C < #128 then begin
      PYStr := PYStr + UpperCase(HZStr[i]);
    end else begin
      N := Integer(HZStr[i]);
      N := N - 19967; //UniCode 汉字开始于19967
      try
        PYStr := PYStr + MSPYCode[N];
      except
        Memo2.Lines.Add(IntToStr(N) + WideChar(N + 19967));
        PYStr := PYStr + '?'; //非汉字的那些符号
      end;
    end;
  end;
  result := PYStr;
end;

procedure TPYForm.ReadGBPYFromFile(Sender: TObject);
var
  TS: TStringList;
begin
  TS := TStringList.Create;
  TS.LoadFromFile('GBPYCode.TXT');
  GBPYCode := TS.Text;
  TS.Free;
  Memo1.Text := GBPYCode;
  Memo1.SetFocus;
  SB.Panels[1].Text := Format('拼音字库长度:%d', [Length(MSPYCode)]);
  SB.Update;
end;

function TPYForm.GetGBPYStr(HZStr: WideString): string;
var
  n, i: integer;
  C: Char;
  PYStr: string;
  D: string;
  P, Q, W: integer;
  PCStr: Char;
begin
  if GBPYCode = '' then ReadGBPYFromFile(nil);
  PYStr := '';
  for i := 1 to Length(HZStr) do begin
    C := string(HZStr[i])[1]; //取 ASCII 码判断是否汉字
    if C < #128 then begin
      PCStr := UpperCase(HZStr[i])[1];
    end else begin
      D := string(HZStr[I]);
      P := Pos(D, hz0002);
      if P > 0 then begin
         PCStr := HZ0001[P];
      end else begin
        Q := Ord(D[1]) - 176;
        W := Ord(D[2]) - 160;
        if (Q < 0) or (W <= 0) then PYStr := PYStr + '?' else
        try
          N := Q * 94 + W;
          PCStr := GBPYCode[N];
        except
          PCStr := '?'; //非汉字的那些符号
        end;
      end;
    end;
    PYStr:= PYStr + PCStr;
  end;
  result := PYStr;
end;

procedure TPYForm.ProdMSPYCode(Sender: TObject);
var
  FF: TFileStream;
  FN: string;
  BB: PWideChar;
  SS: WideString;
  RR, R2: integer;
  MM, NN: integer;
  LL: integer;
//  P1, P2: integer;
begin
  FN := 'WinPY.MB';
  FF := TFileStream.Create(FN, fmOpenRead);
  RR := $3B0A;
  R2 := $7E300;
  FF.Seek(RR, 0);
  MM := 0;
  GetMem(BB, 100);
  SetLength(SS, 20902);
  LL := 1;
  MSPYCode := '';
  repeat
    NN := FF.Read(BB^, 24);
    if BB^ = #0 then Break; //判断拼音结束码
    //SS := SS + BB + #32#32; //得到汉字全拼音
    MSPYCode := MSPYCode + BB[0]; //得到拼音首字母
    MM := MM + 1; //汉字计数
    if MM mod 500 = 0 then begin
      SB.Panels[1].Text := Format('进度:%d/20000', [MM]);
      SB.Update;
      Application.ProcessMessages;
    end;
  until {(MM > 21000) or}(BB^ = #0);
  FF.Free;
  SB.Panels[1].Text := Format('进度:%d/20902', [MM]);
  SB.Update;
  FreeMem(BB, 100);
//  Memo1.Text := SS;
  MSPYCode := UpperCase(MSPYCode);
  Clipboard.AsText := MSPYCode; //将拼音字母放到剪贴板
  Memo1.Text := MSPYCode;
end;

procedure TPYForm.ProdGBPYCode(Sender: TObject);
var
  S: WideString;
  P: WideString;
  i, j: Byte;
begin
  ReadMSPYFromFile(nil);
  S := '';
  for i := 176 to 247 do begin
    for j := 161 to 254 do begin
      S := S + WideString(Char(I) + Char(J));
    end;
  end;
  Memo1.SetFocus;
  P := GetMSPYStr(S);
  GBPYCode := P;
  Memo1.PlainText := True;
  Memo1.Text := P;
  Memo1.Lines.SaveToFile(ExePath + 'GBPYCode.TXT');
  SB.Panels[1].Text := Format('拼音字库长度:%d', [Length(P)]);
  SB.Update;
end;

procedure TPYForm.TurnOnMSPYCode(Sender: TObject);
var
  S: WideString; //注意为方便最好使用 WideString.
//  S: String;   //注意为方便最好不用 string.
  C: Char;
  i: integer;
  N: integer;
begin
  if MSPYCode = '' then ReadMSPYFromFile(nil);
//  TellME('汉字拼音字母长度:' + IntToStr(Length(MSPYCode)));
  Edit2.Text := '';
  S := Edit1.Text;
  Edit2.Text := GetMSPYStr(S);
end;

procedure TPYForm.TurnOnGBPYCode(Sender: TObject);
var
  S: string;
begin
  if GBPYCode = '' then ProdGBPYCode(nil);
  Edit2.Text := '';
  S := Edit1.Text;
  Edit2.Text := GetGBPYStr(S);
end;

procedure TPYForm.CloseForm(Sender: TObject);
begin
  Close;
end;

procedure TPYForm.Button5Click(Sender: TObject);
var
  MB: TBlobField;
  MS: TADOBlobStream;
  RR: integer;
  TS: TStringStream;
begin
  TS := TStringStream.Create(MSPYCode);
  Data00.Open;
  if not Data00.Locate('编码名称', '全拼', []) then begin
    Data00.Append;
    Data00['编码名称'] := '全拼';
  end else begin
    Data00.Edit;
  end;
  MB := Data00.FieldByName('编码内容') as TBlobField;
  MS := TADOBlobStream.Create(MB, bmWrite);
  TS.Position := 0;
  MS.LoadFromStream(TS);
  MS.Free;
  Data00.Post;
  TS.Free;
  Data00.Close;
end;

procedure TPYForm.Button6Click(Sender: TObject);
var
  MB: TBlobField;
  MS: TADOBlobStream;
  RR: integer;
  PP: string;
  MM: TMemoryStream;
begin
  MM := TMemoryStream.Create;
  Data00.Open;
  if not Data00.Locate('编码名称', '全拼', []) then Exit;
  MB := Data00.FieldByName('编码内容') as TBlobField;
  MS := TADOBlobStream.Create(MB, bmRead);
  MS.SaveToStream(MM);
  MS.Free;
  MM.SaveToFile(ExePath + 'MSPYCode.TXT');
  MM.Free;
  Data00.Close;
end;

procedure TPYForm.Button7Click(Sender: TObject);
begin
  Data00.Open;
  if not Data00.Locate('编码名称', '全拼', []) then begin
    Data00.Append;
    Data00['编码名称'] := '全拼';
  end else begin
    Data00.Edit;
  end;
  Data00['编码文本'] := MSPYCode;
  Data00.Post;
  Data00.Close;
end;

procedure TPYForm.Button8Click(Sender: TObject);
begin
  Data00.Open;
  if not Data00.Locate('编码名称', '全拼', []) then Exit;
  MSPYCode := '';
  MSPYCode := Data00['编码文本'];
  Data00.Close;
  Memo1.Text := MSPYCode;
  Memo1.PlainText := True;
  Memo1.Lines.SaveToFile(ExePath + 'MSPYCode.TXT');
  Memo1.SetFocus;
  SB.Panels[1].Text := Format('拼音字库长度:%d', [Length(MSPYCode)]);
  SB.Update;
  Memo1.Text := '[开始]'#13#10 + MSPYCode + '[结束]';
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -