unit UDFSel;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, vStrip,
StdCtrls, ComCtrls;
type
TUDFSelector = class(TForm)
TreeViewFiles: TTreeView;
ComboBoxDrives: TComboBox;
ButtonScan: TButton;
ListBoxFiles: TListBox;
ButtonOK: TButton;
ButtonCancel: TButton;
ButtonClear: TButton;
ButtonRemove: TButton;
procedure FormCreate(Sender: TObject);
procedure ButtonScanClick(Sender: TObject);
procedure ComboBoxDrivesChange(Sender: TObject);
procedure TreeViewFilesDblClick(Sender: TObject);
procedure ButtonOKClick(Sender: TObject);
procedure ButtonCancelClick(Sender: TObject);
procedure ButtonClearClick(Sender: TObject);
procedure ButtonRemoveClick(Sender: TObject);
private
{ Private-Deklarationen }
Drives: array['C'..'Z'] of Cardinal;
DrivesFound: Cardinal;
procedure udf_traverse(address: Cardinal; f: tp_udf_file; parent: TTreeNode; tv: TTreeView);
public
{ Public-Deklarationen }
end;
implementation
{$R *.DFM}
procedure TUDFSelector.FormCreate(Sender: TObject);
begin
ButtonScanClick(Nil);
end;
procedure TUDFSelector.ButtonScanClick(Sender: TObject);
var
i: Char;
address, secsize, maxsec: Cardinal;
f: tp_udf_file;
begin
DrivesFound := 0;
TreeViewFiles.Items.Clear();
ComboBoxDrives.Items.BeginUpdate();
ComboBoxDrives.Items.Clear();
for i := Low(Drives) to High(Drives) do begin
Drives[i] := $ffffffff;
if (aspi_GetDriveAddress(i, address) and aspi_GetSectorInfo(address, secsize, maxsec) and (secsize = fio_SECTOR_SIZE)) then begin
f := udf_get_root(address, 0, True);
if (f <> Nil) then begin
Drives[i] := address;
Inc(DrivesFound);
ComboBoxDrives.Items.Add(i + ':\ [' + f^.name + ']');
udf_free(f);
end;
end;
end;
ComboBoxDrives.Items.EndUpdate();
if (DrivesFound = 1) then begin
ComboBoxDrives.ItemIndex := 0;
ComboBoxDrivesChange(Nil);
end
end;
procedure TUDFSelector.udf_traverse(address: Cardinal; f: tp_udf_file; parent: TTreeNode; tv: TTreeView);
var
name: String;
i: Cardinal;
fs: tp_udf_file;
startlba, endlba: Cardinal;
node: TTreeNode;
begin
while (udf_get_next(address, f) <> Nil) do begin
if (not f^.is_parent) then begin
name := f^.name;
i := 0;
if (not f^.is_dir) then begin
i := Length(name);
if (udf_get_lba(address, f, startlba, endlba)) then
name := name + ' [' + IntToStr((endlba - startlba) shl 1) + ' kb]';
end;
node := tv.Items.AddChildObject(parent, name, Pointer(i));
if (f^.is_dir) then begin
fs := udf_get_sub(address, f);
if (fs <> Nil) then begin
udf_traverse(address, fs, node, tv);
udf_free(fs);
end;
end;
end;
end;
end;
procedure TUDFSelector.ComboBoxDrivesChange(Sender: TObject);
var
address: Cardinal;
f: tp_udf_file;
begin
TreeViewFiles.Items.BeginUpdate();
TreeViewFiles.Items.Clear();
if ((DrivesFound > 0) and (ComboBoxDrives.ItemIndex >= 0)) then begin
address := Drives[ComboBoxDrives.Items[ComboBoxDrives.ItemIndex][1]];
if (address <> $ffffffff) then begin
f := udf_get_root(address, 0, True);
if (f <> Nil) then begin
udf_traverse(address, f, Nil, TreeViewFiles);
udf_free(f);
end;
end;
end;
TreeViewFiles.Items.EndUpdate();
end;
procedure TUDFSelector.TreeViewFilesDblClick(Sender: TObject);
var
item: TTreeNode;
fname: String;
begin
item := TreeViewFiles.Selected;
if ((item <> Nil) and (Integer(item.Data) > 0)) then begin
fname := Copy(item.Text, 0, Integer(item.Data));
item := item.Parent;
while (item <> Nil) do begin
fname := item.Text + '\' + fname;
item := item.Parent;
end;
fname := Copy(ComboBoxDrives.Items[ComboBoxDrives.ItemIndex], 0, 3) + fname;
ListBoxFiles.Items.Add(fname);
end;
end;
procedure TUDFSelector.ButtonOKClick(Sender: TObject);
begin
if (ListBoxFiles.Items.Count > 0) then
ModalResult := ListBoxFiles.Items.Count
else
ModalResult := -1;
end;
procedure TUDFSelector.ButtonCancelClick(Sender: TObject);
begin
ModalResult := -1;
end;
procedure TUDFSelector.ButtonClearClick(Sender: TObject);
begin
ListBoxFiles.Items.Clear();
end;
procedure TUDFSelector.ButtonRemoveClick(Sender: TObject);
begin
if (ListBoxFiles.ItemIndex <> -1) then
ListBoxFiles.Items.Delete(ListBoxFiles.ItemIndex);
end;
end.
syntax highlighted by Code2HTML, v. 0.9.1