foobarmain.pas

来自「Drag files and Drop to delphi forms 0402」· PAS 代码 · 共 282 行

PAS
282
字号
unit FoobarMain;

interface

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

type
  TFormFileList = class(TForm)
    Panel1: TPanel;
    MemoFileList: TMemo;
    MainMenu1: TMainMenu;
    MenuFile: TMenuItem;
    MenuFileOpen: TMenuItem;
    MenuFileSave: TMenuItem;
    N1: TMenuItem;
    MenuFileExit: TMenuItem;
    MenuSetup: TMenuItem;
    MenuSetupRegister: TMenuItem;
    MenuSetupUnregister: TMenuItem;
    Memo1: TMemo;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    MenuFileSaveAs: TMenuItem;
    MenuFileNew: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure MenuSetupRegisterClick(Sender: TObject);
    procedure MenuFileExitClick(Sender: TObject);
    procedure MenuSetupUnregisterClick(Sender: TObject);
    procedure MenuFileOpenClick(Sender: TObject);
    procedure MenuFileSaveClick(Sender: TObject);
    procedure MenuFileSaveAsClick(Sender: TObject);
    procedure MemoFileListChange(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure MenuFileNewClick(Sender: TObject);
  private
    FDirty: boolean;
    FFileName: string;
    procedure SetDirty(const Value: boolean);
    procedure SetFileName(const Value: string);
  public
    property FileName: string read FFileName write SetFileName;
    property Dirty: boolean read FDirty write SetDirty;
    procedure LoadFile(const AFilename: string);
    function SaveFile(const AFilename: string): boolean;
    function Clear: boolean;
  end;

var
  FormFileList: TFormFileList;

implementation

{$R *.DFM}

uses
  ComObj;

resourcestring
  sFileClass = 'FoobarFile';
  sFileType = 'Foobar File List';
  sFileExtension = '.foobar';

  sTitle = 'Foobar List Editor - %s';
  sNewFile = 'new list';
  sSaveMods = 'Your modifications has not been saved.'+#13+'Save now?';
  sUnregisterNotice = 'Remember to also unregister the drop handler DLL';
  sRegisterNotice = 'Remember to also register the drop handler DLL';

{$ifndef VER13_PLUS}
function GetRegStringValue(const Key, ValueName: string): string;
var
  Size: DWord;
  RegKey: HKEY;
begin
  Result := '';
  if RegOpenKey(HKEY_CLASSES_ROOT, PChar(Key), RegKey) = ERROR_SUCCESS then
  try
    Size := 256;
    SetLength(Result, Size);
    if RegQueryValueEx(RegKey, PChar(ValueName), nil, nil, PByte(PChar(Result)), @Size) = ERROR_SUCCESS then
      SetLength(Result, Size - 1) else
      Result := '';
  finally
    RegCloseKey(RegKey);
  end;
end;
{$endif}

procedure TFormFileList.FormCreate(Sender: TObject);
var
  i: integer;

  procedure LoadFileList(const List: string);
  var
    Files: TStringList;
  begin
    Files := TStringList.Create;
    try
      Files.LoadFromFile(List);
      MemoFileList.Lines.AddStrings(Files);
    finally
      Files.Free;
    end;
  end;

begin
  FileName := '';

  // Display command line (for debug purposes).
  Memo1.Lines.Text := CmdLine;

  if (ParamCount > 0) then
  begin
    // First parameter is file list.
    LoadFile(ParamStr(1));

    // Additional parameters are file names which should be added to the list.
    // If a filename starts with @ it indicates that the file contains a list of
    // file names which should be added to the list.
    for i := 2 to ParamCount do
      if (Copy(ParamStr(i), 1, 1) = '@') then
        LoadFileList(Copy(ParamStr(i), 2, MaxInt))
      else
        MemoFileList.Lines.Add(ParamStr(i));
  end;

  // Determine if the file association has already been registered and modify
  // the register menu items accordingly.
  MenuSetupRegister.Enabled := (GetRegStringValue(sFileClass+'\DefaultIcon', '') = '');
  MenuSetupUnregister.Enabled := not MenuSetupRegister.Enabled;
end;

procedure TFormFileList.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  CanClose := Clear;
end;

procedure TFormFileList.MenuSetupRegisterClick(Sender: TObject);
begin
  // Register file association.
  CreateRegKey(sFileExtension, '', sFileClass);
  CreateRegKey(sFileExtension+'\ShellNew', 'NullFile', '');
  CreateRegKey(sFileClass, '', sFileType);
  CreateRegKey(sFileClass+'\shell\open\command', '', Application.ExeName+' "%1"');
  CreateRegKey(sFileClass+'\DefaultIcon', '', Application.ExeName+',0');
  MenuSetupRegister.Enabled := False;
  MenuSetupUnregister.Enabled := True;
  if (GetRegStringValue(sFileClass+'\shellex\DropHandler', '') = '') then
    ShowMessage(sRegisterNotice);
end;

procedure TFormFileList.MenuSetupUnregisterClick(Sender: TObject);
begin
  // Unregister file association.
  DeleteRegKey(sFileClass+'\DefaultIcon');
  DeleteRegKey(sFileClass+'\shell\open\command');
  DeleteRegKey(sFileClass+'\shell\open');
  DeleteRegKey(sFileClass+'\shell');
  DeleteRegKey(sFileClass);
  DeleteRegKey(sFileExtension+'\ShellNew');
  DeleteRegKey(sFileExtension);
  MenuSetupRegister.Enabled := True;
  MenuSetupUnregister.Enabled := False;
  if (GetRegStringValue(sFileClass+'\shellex\DropHandler', '') <> '') then
    ShowMessage(sUnregisterNotice);
end;

procedure TFormFileList.MenuFileExitClick(Sender: TObject);
begin
  Close;
end;

procedure TFormFileList.MenuFileNewClick(Sender: TObject);
begin
  Clear;
end;

procedure TFormFileList.MenuFileOpenClick(Sender: TObject);
begin
  if (Clear) then
  begin
    OpenDialog1.Filename := FileName;
    if (OpenDialog1.Execute) then
      LoadFile(OpenDialog1.Filename);
  end;
end;

procedure TFormFileList.MenuFileSaveAsClick(Sender: TObject);
begin
  SaveFile('');
end;

procedure TFormFileList.MenuFileSaveClick(Sender: TObject);
begin
  SaveFile(FileName);
end;

procedure TFormFileList.LoadFile(const AFilename: string);
begin
  MemoFileList.Lines.LoadFromFile(AFilename);
  FileName := AFilename;
  Dirty := False;
end;

function TFormFileList.SaveFile(const AFilename: string): boolean;
begin
  Result := True;
  if (AFilename = '') then
  begin
    SaveDialog1.Filename := FileName;
    if (SaveDialog1.Execute) then
      FileName := SaveDialog1.Filename
    else
      Result := False;
  end else
    FileName := AFilename;

  if (Result) then
  begin
    MemoFileList.Lines.SaveToFile(Filename);
    Dirty := False;
  end;
end;

function TFormFileList.Clear: boolean;
var
  Answer: word;
begin
  Result := True;
  // Check for unsaved changes and prompt.
  if (Dirty) then
  begin
    Answer := MessageDlg(sSaveMods, mtConfirmation, [mbYes, mbNo, mbCancel], 0);
    case Answer of
      mrYes:
        Result := SaveFile(FileName);
      mrCancel:
        Result := False;
    end;
  end;

  if (Result) then
  begin
    MemoFileList.Lines.Clear;
    FileName := '';
    Dirty := False;
  end;
end;

procedure TFormFileList.MemoFileListChange(Sender: TObject);
begin
  Dirty := True;
end;

procedure TFormFileList.SetDirty(const Value: boolean);
begin
  // Enable the "Save" menu item if the file has been modified and we have a
  // file name for it.
  FDirty := Value;
  MenuFileSave.Enabled := FDirty and (FileName <> '');
end;

procedure TFormFileList.SetFileName(const Value: string);
begin
  FFileName := Value;
  if (FFileName <> '') then
  begin
    Caption := Format(sTitle, [FFileName]);
    MenuFileSave.Enabled := Dirty;
  end else
  begin
    Caption := Format(sTitle, [sNewFile]);
    MenuFileSave.Enabled := False;
  end;
end;

end.

⌨️ 快捷键说明

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