📄 mainform.pas
字号:
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ExtCtrls, Menus, Buttons, StdCtrls, DelphiTwain, ExtDlgs, jpeg,
clipbrd;
type
TFormMain = class(TForm)
Toolbar: TPanel;
StatusBar1: TStatusBar;
Menu: TMainMenu;
Menu1: TMenuItem;
ListSources: TComboBox;
Twain: TDelphiTwain;
ItemExit: TMenuItem;
Divider4: TMenuItem;
ItemSave: TMenuItem;
Divider3: TMenuItem;
ItemShowInterface: TMenuItem;
ItemAcquire: TMenuItem;
ItemSelect: TMenuItem;
ItemCopy: TMenuItem;
ItemStatus1: TMenuItem;
ItemStatus2: TMenuItem;
Divider5: TMenuItem;
ItemStatus3: TMenuItem;
ItemStatus4: TMenuItem;
ItemStatus5: TMenuItem;
Divider6: TMenuItem;
ItemStatus7: TMenuItem;
ItemStatus8: TMenuItem;
ItemStatus9: TMenuItem;
ItemFlipVertical: TMenuItem;
ItemFlipHorizontal: TMenuItem;
Menu4: TMenuItem;
Menu3: TMenuItem;
Menu2: TMenuItem;
Divider2: TMenuItem;
ItemStatus6: TMenuItem;
Divider7: TMenuItem;
Transfer1: TMenuItem;
Transfer2: TMenuItem;
Transfer3: TMenuItem;
Label1: TLabel;
Image1: TImage;
ContainImage: TScrollBox;
Image: TImage;
Bevel1: TBevel;
Label2: TLabel;
GoBack: TSpeedButton;
GoForward: TSpeedButton;
Current: TLabel;
SavePic: TSavePictureDialog;
GoTimer: TTimer;
{Loads the library in memory}
procedure ItemStatus1Click(Sender: TObject);
{Loads the source manager}
procedure ItemStatus2Click(Sender: TObject);
{Loads the source}
procedure ItemStatus3Click(Sender: TObject);
{Send a command to the source}
procedure ItemStatus4Click(Sender: TObject);
{Enable source}
procedure ItemStatus5Click(Sender: TObject);
{Disable source}
procedure ItemStatus6Click(Sender: TObject);
{Unload source}
procedure ItemStatus7Click(Sender: TObject);
{Unload source manager}
procedure ItemStatus8Click(Sender: TObject);
{Source being disabled}
procedure TwainSourceDisable(Sender: TObject; const Index: Integer);
{Current source being changed}
procedure ListSourcesChange(Sender: TObject);
procedure ItemStatus9Click(Sender: TObject);
{Changing file mode}
procedure Transfer1Click(Sender: TObject);
{Checking use interface}
procedure ItemShowInterfaceClick(Sender: TObject);
{Allow user to select the source}
procedure ItemSelectClick(Sender: TObject);
{Acquire source}
procedure ItemAcquireClick(Sender: TObject);
{Image acquired using memory and handle transferences}
procedure TwainTwainAcquire(Sender: TObject; const Index: Integer;
Image: TBitmap; var Cancel: Boolean);
{Image acquired file transferences}
procedure TwainSourceFileTransfer(Sender: TObject;
const Index: Integer; Filename: TW_STR255; Format: TTwainFormat;
var Cancel: Boolean);
{Previous image}
procedure GoBackClick(Sender: TObject);
{Next image}
procedure GoForwardClick(Sender: TObject);
{Flip the current image vertically}
procedure ItemFlipVerticalClick(Sender: TObject);
{Flip the current image horizontally}
procedure ItemFlipHorizontalClick(Sender: TObject);
{Dragging the image}
procedure ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
{Click on the image}
procedure ImageMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
{Being resized}
procedure ContainImageResize(Sender: TObject);
{Saving the current image}
procedure ItemSaveClick(Sender: TObject);
{User released one of the navigation buttons}
procedure GoMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
{Navigate between items}
procedure GoNavigation(Sender: TObject);
{User pressed one of the navigation buttons}
procedure GoMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
{Defines the place to save the file}
procedure TwainSourceSetupFileXfer(Sender: TObject;
const Index: Integer);
{Save image to clipboard}
procedure ItemCopyClick(Sender: TObject);
{Closing the application}
procedure ItemExitClick(Sender: TObject);
public
{Current loaded source}
LoadedSource: Integer;
private
{Position when the user clicks over the image}
ClickPos: TPoint;
{Image list}
ImageList: TList;
{Transference mode}
TransferMode: TTwainTransferMode;
{Current selected source}
CurrentSource: Integer;
{Current image}
CurrentImage: Integer;
{Returns the checked item position in the status}
function CheckedItem: Byte;
{Used when changing the state to check if it's possible and}
{to check the new item}
function ChangeState(CanChange: Boolean; Item: TMenuItem;
Error: String): Boolean;
{Clear the list of images}
procedure ClearImageList;
{Selects the first item}
procedure SelectFirst;
{Adjust the buttons to navigate thru the image}
procedure AdjustNavigate;
{Returns the current image, if any}
function GetCurrent(var Image: TBitmap): Boolean;
public
{Form being created}
constructor Create(AOwner: TComponent); override;
{Form being destroyed}
destructor Destroy; override;
end;
var
FormMain: TFormMain;
implementation
uses FormSendCommand;
const
HANDDRAGCURSOR = 3778;
{$R *.DFM}
{Returns the checked item position in the status}
function TFormMain.CheckedItem: Byte;
var
i: Integer;
begin
Result := 0; {Default result}
FOR i := 0 TO Menu3.Count - 1 DO
{The item should not be a separator item}
if (Menu3.Items[i].Caption <> '-') AND
(Menu3.Items[i].Checked) then
Result := Menu3.Items[i].Tag;
end;
{Used when changing the state to check if it's possible and}
{to check the new item}
function TFormMain.ChangeState(CanChange: Boolean; Item: TMenuItem;
Error: String): Boolean;
begin
Result := CanChange;
if Result then Item.Checked := TRUE else ShowMessage(Error)
end;
{Loads the library in memory}
procedure TFormMain.ItemStatus1Click(Sender: TObject);
begin
//Library must be unloaded to be loaded
if ChangeState(CheckedItem = 9, Sender as TMenuItem,
'The library must be unloaded to be loaded') then
begin
{Try loading the library}
if not Twain.LoadLibrary then
begin
{Library could not be loaded}
ItemStatus9.Checked := TRUE;
ShowMessage('Twain library could not be loaded. Check if ' +
'TWAIN is installed !');
end {if not Twain.LoadLibrary}
end {if ChangeState...}
end;
{Loads the source manager}
procedure TFormMain.ItemStatus2Click(Sender: TObject);
var
i: Integer;
begin
//Library must be loaded and the source
if ChangeState(CheckedItem = 1, Sender as TMenuItem,
'The library must be loaded and no source be loaded') then
begin
Twain.SourceManagerLoaded := TRUE;
{Fill source list}
ListSources.Items.Clear;
FOR i := 0 TO Twain.SourceCount - 1 DO
ListSources.Items.Add(Twain.Source[i].ProductName);
{Select the first item}
ListSources.ItemIndex := 0;
CurrentSource := -1;
end {if ChangeState...}
end;
{Loads the source}
procedure TFormMain.ItemStatus3Click(Sender: TObject);
begin
//Source manager must be loaded
if ChangeState(CheckedItem in [2, 6], Sender as TMenuItem,
'Source manager must be loaded and no source enabled') then
begin
LoadedSource := CurrentSource;
{Try loading source}
if not Twain.Source[LoadedSource].LoadSource then
begin
{In case the source was not loaded}
ShowMessage('The source "' + Twain.Source[LoadedSource].ProductName +
'" could not be loaded');
ItemStatus2.Checked := TRUE;
end
end {if ChangeState..}
end;
{Send a command to the source}
procedure TFormMain.ItemStatus4Click(Sender: TObject);
begin
//Source must be loaded
if ChangeState(CheckedItem in [3, 4, 6, 5], Sender as TMenuItem,
'The source must be loaded') then
SendCommandForm.ShowModal;
end;
{Enable source}
procedure TFormMain.ItemStatus5Click(Sender: TObject);
begin
//Source must be loaded
if ChangeState(CheckedItem in [3, 4, 5, 6], Sender as TMenuItem,
'The source must be loaded') then
begin
Twain.Source[LoadedSource].TransferMode := Self.TransferMode;
ClearImageList; {Clear list of images}
Twain.Source[LoadedSource].EnableSource(ItemShowInterface.Checked, TRUE);
end {if ChangeState...};
end;
{Disable source}
procedure TFormMain.ItemStatus6Click(Sender: TObject);
begin
//Source must be loaded
ChangeState(CheckedItem in [3, 4], Sender as TMenuItem,
'Source must be in loaded state');
end;
{Unload source}
procedure TFormMain.ItemStatus7Click(Sender: TObject);
begin
//Source must be loaded
if ChangeState(CheckedItem in [3, 4, 5, 6], Sender as TMenuItem,
'The source must be loaded') then
Twain.Source[LoadedSource].Loaded := FALSE;
end;
{Unload source manager}
procedure TFormMain.ItemStatus8Click(Sender: TObject);
begin
//Source must be loaded
if ChangeState(CheckedItem in [2, 7], Sender as TMenuItem,
'The source must be unloaded and source manager loaded') then
begin
{Unload source}
Twain.SourceManagerLoaded := FALSE;
{Clears source list}
ListSources.Items.Clear;
end
end;
{Unload source}
procedure TFormMain.ItemStatus9Click(Sender: TObject);
begin
//Source must be loaded
if ChangeState(CheckedItem in [1, 8], Sender as TMenuItem,
'The source must be loaded and source manager unloaded') then
Twain.LibraryLoaded := FALSE;
end;
{Form being created}
constructor TFormMain.Create(AOwner: TComponent);
begin
{Call inherited}
inherited Create(AOwner);
{Create object}
ImageList := TList.Create;
{Avoid flickering by using double-buffering}
ContainImage.DoubleBuffered := TRUE;
ToolBar.DoubleBuffered := TRUE;
{Select first source}
TransferMode := ttmMemory;
CurrentSource := -1;
LoadedSource := CurrentSource;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -