www.pudn.com > yrsCapture.zip > SelFolder.pas
{******************************************************************************}
{* *}
{* Adirondack Software & Graphics Select Folder Unit *}
{* (C) Copyright Adirondack Software & Graphics 1997 *}
{* *}
{******************************************************************************}
unit SelFolder;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, Outline, DirOutln, ExtCtrls, ComCtrls, xShlTree;
type
TSelectFolder = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
xShellTreeView1: TxShellTreeView;
procedure Button1Click(Sender: TObject);
procedure xShellTreeView1Change(Sender: TObject; Node: TTreeNode);
private
{ Private declarations }
function EllipsifyText(AsPath: boolean; const Text: string;
const Canvas: TCanvas; MaxWidth: integer): string;
public
{ Public declarations }
SelectedFolder: String;
end;
var
SelectFolder: TSelectFolder;
implementation
{$R *.DFM}
{==============================================================================}
function TSelectFolder.EllipsifyText(AsPath: boolean; const Text: string;
const Canvas: TCanvas; MaxWidth: integer): string;
{==============================================================================}
procedure CutFirstDirectory(var S: string);
var
Root: Boolean;
P: Integer;
begin
if S = '' then exit;
if S = '\' then
S := ''
else begin
if S[1] = '\' then begin
Root := True;
Delete(S, 1, 1);
end else
Root := False;
if S[1] = '.' then
Delete(S, 1, 4);
P := Pos('\',S);
if P <> 0 then begin
Delete(S, 1, P);
S := '...\' + S;
end else
S := '';
if Root then
S := '\' + S;
end;
end;
function MinimizeName(const Filename: string; const Canvas: TCanvas;
MaxLen: Integer): string;
var
Drive: String;
Dir: String;
Name: String;
begin
Result := FileName;
Dir := ExtractFilePath(Result);
Name := ExtractFileName(Result);
if (Length(Dir) >= 2) and (Dir[2] = ':') then begin
Drive := Copy(Dir, 1, 2);
Delete(Dir, 1, 2);
end else
Drive := '';
while ((Dir <> '') or (Drive <> '')) and (Canvas.TextWidth(Result) > MaxLen) do begin
if Dir = '\...\' then begin
Drive := '';
Dir := '...\';
end else if Dir = '' then
Drive := ''
else
CutFirstDirectory(Dir);
Result := Drive + Dir + Name;
end;
end;
{$IFNDEF WIN32}
procedure SetLength(var s: string; NewLen: byte);
begin
S[0] := chr(NewLen);
end;
{$ENDIF}
var
Temp: String;
AvgChar: integer;
TLen,
Index: integer;
Metrics: TTextMetric;
begin
try
if AsPath then begin
Result := MinimizeName(Text, Canvas, MaxWidth);
end else begin
Temp := Text;
if (Temp <> '') and (Canvas.TextWidth(Temp) > MaxWidth) then begin
GetTextMetrics(Canvas.Handle, Metrics);
AvgChar := Metrics.tmAveCharWidth;
if (AvgChar * 3) < MaxWidth then begin
Index := (MaxWidth div AvgChar) - 1;
Temp := Copy(Text, 1, Index);
if Canvas.TextWidth(Temp + '...') > MaxWidth then begin
repeat
dec(Index);
SetLength(Temp, Index);
until (Canvas.TextWidth(Temp + '...') < MaxWidth) or (Index < 1);
{ delete chars }
end else begin
TLen := Length(Text);
repeat
inc(Index);
Temp := Copy(Text, 1, Index);
until (Canvas.TextWidth(Temp + '...') > MaxWidth) or (Index >= TLen);
SetLength(Temp, Index-1);
end;
Temp := Temp + '...';
end else
Temp := '.';
end;
Result := Temp;
end;
except
Result := '';
end;
end;
procedure TSelectFolder.Button1Click(Sender: TObject);
begin
SelectedFolder := LowerCase(xShellTreeView1.Directory);
end;
procedure TSelectFolder.xShellTreeView1Change(Sender: TObject;
Node: TTreeNode);
begin
Label1.Caption := LowerCase(EllipsifyText(True,
xShellTreeView1.Directory, Canvas, 240));
end;
end.