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

📄 main.pas

📁 電子看板的物件程式
💻 PAS
字号:
unit Main;

interface

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

type
  TForm1 = class(TForm)
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    Panel1: TPanel;
    btLoad_: TButton;
    btSave_: TButton;
    btDone_: TButton;
    Bevel13: TBevel;
    Bevel14: TBevel;
    Bevel15: TBevel;
    Bevel16: TBevel;
    Bevel17: TBevel;
    Bevel18: TBevel;
    Panel5: TPanel;
    Bevel8: TBevel;
    bb_ruler: TBillBoard;
    ScrollBar: TScrollBar;
    Panel6: TPanel;
    bb_editing: TBillBoard;
    btExit_: TButton;
    HeaderControl: THeaderControl;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btSave_Click(Sender: TObject);
    procedure btLoad_Click(Sender: TObject);
    procedure HeaderControlSectionClick(HeaderControl: THeaderControl;
      Section: THeaderSection);
    procedure ScrollBarScroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    procedure btExit_Click(Sender: TObject);
    procedure bb_editingMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure bb_editingMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure btDone_Click(Sender: TObject);
    procedure ScrollBarChange(Sender: TObject);
  private
    { Private declarations }
    function 	CheckCharset: Word;
		function 	GetDecimal( Value: string ): integer;
    procedure LoadList;
    procedure RulerFromChar( Value: integer );
    procedure SetCell( Value: TPoint );
  public
    { Public declarations }
  end;

const

	HexCode: array[ 0..15 ] of char = '0123456789ABCDEF';
  Title: string = 'Charset Generator - ';

var
  Form1: TForm1;
  List: TStringList;
  CSFile: Textfile;
  FileName: string;
  CurrentChar: integer;
  CurrentPos: integer;
  PointClicked: TPoint;
  CharSetChanged : Boolean;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin

	List := TStringList.Create;
	LoadList;
  FileName := 'untitled.txt';
  Caption := Title + FileName;
  CurrentChar := 0;
  CurrentPos := 0;
  ScrollBar.Position := CurrentPos;
	RulerFromChar( CurrentPos );
	bb_editing.Text := Chr( CurrentChar );
  PointClicked := Point( -1, -1 );
  CharSetChanged := false;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin

	if( Assigned( List ) ) then
  	List.Free;

end;

procedure TForm1.btExit_Click(Sender: TObject);
begin

	Close;

end;

procedure TForm1.btDone_Click(Sender: TObject);
begin

  if( CheckCharset = id_Cancel ) then
  	Exit
	else
  	Close;

end;

procedure TForm1.btLoad_Click(Sender: TObject);
var
	i,j,p: integer;
  s: string;
begin

  if( CheckCharset = id_Cancel ) then
  	Exit;

	if( OpenDialog.Execute ) then
  	begin
      AssignFile( CSFile, OpenDialog.FileName );
      Reset( CSFile );
      i := 0;
    	List.Clear;
      while( ( i < 256 ) and ( not( Eof( CSFile ) ) ) ) do
      	begin
      		Readln( CSFile, s );
      		List.Add( UpperCase( s ) );
          inc( i );
        end;
      FileName := OpenDialog.FileName;
      CloseFile( CSFile );
      for i := 0 to 255 do
        begin
          s := List.Strings[ i ];
          for j := 8 downto 0 do
            begin
              p := LastDelimiter( '$', s );
              bb_editing.Charset.Item[ i, j ] := byte( GetDecimal( Copy( s, p + 1, 2 ) ) );
              s := Copy( s, 1, p - 1 );
            end;
        end;
      CharSetChanged := false;
    end;

  bb_ruler.Charset := bb_editing.Charset;
  bb_editing.Refresh;
  bb_ruler.Refresh;
  Caption := Title + FileName;

end;

procedure TForm1.btSave_Click(Sender: TObject);
var
	i: integer;
begin

	SaveDialog.FileName := FileName;

	if( SaveDialog.Execute ) then
  	begin
      AssignFile( CSFile, SaveDialog.FileName );
      Rewrite( CSFile );
      LoadList;
      for i := 0 to 255 do
      	Writeln( CSFile, List.Strings[ i ] );
      FileName := SaveDialog.FileName;
      CloseFile( CSFile );
  		CharSetChanged := false;
    end;

  Caption := Title + FileName;

end;

procedure TForm1.ScrollBarChange(Sender: TObject);
begin

	CurrentPos := ScrollBar.Position;
	RulerFromChar( CurrentPos );

end;

procedure TForm1.ScrollBarScroll(Sender: TObject; ScrollCode: TScrollCode;
																	var ScrollPos: Integer);
begin

	case ScrollCode of

  	scLineUp		:	dec( CurrentPos );
    scLineDown	:	inc( CurrentPos );
    scPageUp		:	dec( CurrentPos, 8 );
    scPageDown	:	inc( CurrentPos, 8 );
    scTop				:	CurrentPos := 0;
    scBottom		:	CurrentPos := 248;

  end;

  	if( CurrentPos < 0 ) then
    	CurrentPos := 0
    else
    	if( CurrentPos > 248 ) then
      	CurrentPos := 248;

  bb_ruler.Charset := bb_editing.Charset;
  RulerFromChar( CurrentPos );

end;

procedure TForm1.HeaderControlSectionClick(HeaderControl: THeaderControl;
																						Section: THeaderSection);
begin

	CurrentChar := GetDecimal( Copy( Section.Text, 2, 2 ) );
	bb_editing.Text := Chr( CurrentChar );
  bb_ruler.Charset := bb_editing.Charset;
  RulerFromChar( CurrentPos );
  bb_ruler.Refresh;

end;

procedure TForm1.bb_editingMouseDown(Sender: TObject; Button: TMouseButton;
  																		Shift: TShiftState; X, Y: Integer);
begin

	PointClicked.x := X div bb_editing.CellSize;
  PointClicked.y := Y div bb_editing.CellSize;

end;

procedure TForm1.bb_editingMouseUp(Sender: TObject; Button: TMouseButton;
  																	Shift: TShiftState; X, Y: Integer);
begin

	if( ( PointClicked.x = ( X div bb_editing.CellSize ) ) and
  		( PointClicked.y = ( Y div bb_editing.CellSize ) ) ) then
		begin
    	SetCell( PointClicked );
    end
  else
  	begin
      PointClicked.y := -1;
      PointClicked.x := -1;
    end;

end;

procedure TForm1.LoadList;
var
	i,j,n	: integer;
  s			: string;
begin

	List.Clear;

  for i := 0 to 255 do
  	begin
    	s := '( ';
  		for j := 0 to 8 do
      	begin
        	s := s + '$';
          n := integer( bb_editing.Charset.Item[ i,j ] );
          s := s + HexCode[ n div 16 ] + HexCode[ n mod 16 ];
          if( j < 8 ) then
          	s := s + ', ';
        end;
      if( i < 255 ) then
      	s := s + ' ),'
      else
      	s := s + ' )';
      List.Add( s );
    end;

end;

function TForm1.GetDecimal( Value: string ): integer;
var
	i: integer;
begin

  if( ( Value[ 1 ] >= '0' ) and ( Value[ 1 ] <= '9' ) ) then
    i := integer( ( Ord( Value[ 1 ] ) - 48 ) * 16 )
  else
    i := integer( ( Ord( Value[ 1 ] ) - 55 ) * 16 );

  if( ( Value[ 2 ] >= '0' ) and ( Value[ 2 ] <= '9' ) ) then
    i := i + integer( Ord( Value[ 2 ] ) - 48 )
  else
    i := i + integer( Ord( Value[ 2 ] ) - 55 );

  Result := i;

end;

procedure TForm1.RulerFromChar( Value: integer );
var
	i,j: integer;
  s,s1: string;
begin

	s := '';
  j := 0;
	for i := Value to Value + 7 do
  	begin
  		s := s + Char( i );
      s1 := '$' + HexCode[ i div 16 ] + HexCode[ i mod 16 ];
      HeaderControl.Sections[ j ].Text := s1;
      inc( j );
    end;

  bb_ruler.Text := s;

end;

procedure TForm1.SetCell( Value: TPoint );
var
	b,c: Byte;
begin

	b := $40 shr Value.x;
  c := bb_editing.Charset.Item[ CurrentChar, Value.y ];

	if( ( c and b ) <> 0 ) then
  	bb_editing.Charset.Item[ CurrentChar, Value.y ] := ( c and not( b ) )
  else
  	bb_editing.Charset.Item[ CurrentChar, Value.y ] := ( c or b );

	bb_editing.Refresh;
  CharSetChanged := true;

end;

function TForm1.CheckCharset: Word;
begin

	Result := id_No;

	if( CharSetChanged ) then
		begin
    	Result := MessageDlg('Charset changed. Save?', mtWarning, mbYesNoCancel, 0);
  		Case Result of
        id_Yes		:	btSave_Click( Self );
      end;
    end;

end;

end.

⌨️ 快捷键说明

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