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

📄 expqu.pas

📁 条码控件: 一维条码控件 二维条码控件 PDF417Barcode MaxiCodeBarcode
💻 PAS
字号:
(* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is TurboPower SysTools
 *
 * The Initial Developer of the Original Code is
 * TurboPower Software
 *
 * Portions created by the Initial Developer are Copyright (C) 1996-2002
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * ***** END LICENSE BLOCK ***** *)

unit ExPQU;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,

  StBase, StPQueue;

const
  InitSize =  50;
  Delta    = 100;
  DefJobs  =  15;

type
  TPQRec = record
    Priority : LongInt;
    Name : string[10];
  end;
  PPQRec = ^TPQRec;

  TStDlg = class(TForm)
    CreateBtn: TButton;
    ClearBtn: TButton;
    LoadBtn: TButton;
    SaveBtn: TButton;
    InsertBtn: TButton;
    DeleteMinBtn: TButton;
    DeleteMaxBtn: TButton;
    LB1: TListBox;
    OD1: TOpenDialog;
    SD1: TSaveDialog;
    ActionEdit: TEdit;
    ActionLabel: TLabel;
    QueueLabel: TLabel;
    JobEdit: TEdit;
    JobLabel: TLabel;

    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure CreateBtnClick(Sender: TObject);
    procedure ClearBtnClick(Sender: TObject);
    procedure LoadBtnClick(Sender: TObject);
    procedure SaveBtnClick(Sender: TObject);
    procedure InsertBtnClick(Sender: TObject);
    procedure DeleteMinBtnClick(Sender: TObject);
    procedure DeleteMaxBtnClick(Sender: TObject);
    procedure JobSpinDownClick(Sender: TObject);
    procedure JobSpinUpClick(Sender: TObject);
  private
    MyPQ : TStPQueue;
    procedure FillListBox;
    function InsertItem : PPQRec;
  end;

var
  StDlg: TStDlg;

implementation

{$R *.DFM}

function MyCompare(Data1, Data2 : Pointer) : Integer; far;
begin
  Result := PPQRec(Data1)^.Priority-PPQRec(Data2)^.Priority;
end;

procedure MyDelNodeData(Data : pointer); far;
begin
  Dispose(PPQRec(Data));
end;

function MyLoadData(Reader : TReader) : Pointer; far;
var
  pn : PPQRec;
begin
  New(pn);
  pn^.Priority := Reader.ReadInteger;
  pn^.Name := Reader.ReadString;
  Result := pn;
end;

procedure MyStoreData(Writer : TWriter; Data : Pointer); far;
begin
  Writer.WriteInteger(PPQRec(Data)^.Priority);
  Writer.WriteString(PPQRec(Data)^.Name);
end;

function JobString(pn : PPQRec) : string;
begin
  with pn^ do
    Result := IntToStr(Priority)+'      '+Name;
end;

function MyListBoxAdd(Container : TStContainer;
  Data, OtherData : Pointer) : Boolean; far;
begin
  TListBox(OtherData).Items.Add(JobString(PPQRec(Data)));
  Result := true;
end;

{--------------------------------------------------------------}

procedure TStDlg.FormCreate(Sender: TObject);
begin
  RegisterClasses([TStPQueue]);
  ClearBtn.Enabled := false;
  SaveBtn.Enabled := false;
  LoadBtn.Enabled := false;
  InsertBtn.Enabled := false;
  DeleteMinBtn.Enabled := false;
  DeleteMaxBtn.Enabled := false;
  JobEdit.Text := IntToStr(DefJobs);
end;

procedure TStDlg.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(MyPQ) then
    MyPQ.Free;
end;

procedure TStDlg.FillListBox;
var
  benabled : boolean;
begin
  Screen.Cursor := crHourGlass;
  LB1.Clear;
  LB1.Perform(WM_SETREDRAW, 0, 0);
  if Assigned(MyPQ) then
    MyPQ.Iterate(MyListBoxAdd, LB1);
  LB1.Perform(WM_SETREDRAW, 1, 0);
  LB1.Update;
  benabled := Assigned(MyPQ) and (MyPQ.Count > 0);
  DeleteMinBtn.Enabled := benabled;
  DeleteMaxBtn.Enabled := benabled;
  Screen.Cursor := crDefault;
end;

function TStDlg.InsertItem : PPQRec;
var
  i : integer;
  pn : PPQRec;
begin
  {create a new item}
  new(pn);
  with pn^ do begin
    {give it a random priority and a random name}
    priority := 100+random(100);
    name := 'job ';
    for i := 1 to 8 do
      name := name+Char(random(26)+Byte('A'));
  end;
  {insert item into priority queue}
  MyPQ.Insert(pn);
  Result := pn;
end;

procedure TStDlg.CreateBtnClick(Sender: TObject);
var
  i, jobs : integer;
begin
  if Assigned(MyPQ) then
    MyPQ.Free;

  MyPQ := TStPQueue.Create(InitSize, Delta);
  MyPQ.Compare := MyCompare;
  MyPQ.DisposeData := MyDelNodeData;
  MyPQ.LoadData := MyLoadData;
  MyPQ.StoreData := MyStoreData;

  {determine how many jobs to add}
  try
    jobs := StrToInt(JobEdit.Text);
    if (jobs < 1) then
      jobs := 1
    else if (jobs > 1000) then
      jobs := 1000;
  except
    jobs := DefJobs;
  end;
  JobEdit.Text := IntToStr(jobs);

  {add random jobs}
  Randomize;
  for i := 1 to jobs do
    InsertItem;

  {update form display}
  FillListBox;
  ActionEdit.Text := 'created';
  ClearBtn.Enabled := true;
  SaveBtn.Enabled := true;
  InsertBtn.Enabled := true;
end;

procedure TStDlg.ClearBtnClick(Sender: TObject);
begin
  MyPQ.Clear;
  FillListBox;
  ActionEdit.Text := 'cleared';
end;

procedure TStDlg.InsertBtnClick(Sender: TObject);
var
  pn : PPQRec;
begin
  pn := InsertItem;
  ActionEdit.Text := JobString(pn)+' inserted';
  FillListBox;
end;

procedure TStDlg.DeleteMinBtnClick(Sender: TObject);
var
  pn : PPQRec;
begin
  pn := PPQRec(MyPQ.DeleteMin);
  ActionEdit.Text := JobString(pn)+' deleted';
  MyPQ.DisposeData(pn);
  FillListBox;
end;

procedure TStDlg.DeleteMaxBtnClick(Sender: TObject);
var
  pn : PPQRec;
begin
  pn := PPQRec(MyPQ.DeleteMax);
  ActionEdit.Text := JobString(pn)+' deleted';
  MyPQ.DisposeData(pn);
  FillListBox;
end;

procedure TStDlg.JobSpinDownClick(Sender: TObject);
var
  jobs : integer;
begin
  try
    jobs := StrToInt(JobEdit.Text);
  except
    jobs := DefJobs;
  end;
  if (jobs > 1) then
    dec(jobs);
  JobEdit.Text := IntToStr(jobs);
end;

procedure TStDlg.JobSpinUpClick(Sender: TObject);
var
  jobs : integer;
begin
  try
    jobs := StrToInt(JobEdit.Text);
  except
    jobs := DefJobs;
  end;
  if (jobs < 1000) then
    inc(jobs);
  JobEdit.Text := IntToStr(jobs);
end;

procedure TStDlg.LoadBtnClick(Sender: TObject);
begin
  if (OD1.Execute) then begin
    MyPQ.LoadFromFile(OD1.FileName);
    FillListBox;
    ActionEdit.Text := 'loaded';
  end;
end;

procedure TStDlg.SaveBtnClick(Sender: TObject);
begin
  if (SD1.Execute) then begin
    MyPQ.StoreToFile(SD1.FileName);
    LoadBtn.Enabled := true;
    ActionEdit.Text := 'saved';
  end;
end;

end.

⌨️ 快捷键说明

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