Автор: log1stable
Дата сообщения: 12.12.2013 02:59
В общем, пытаюсь сделать свое дерево файлов на label'ах. Смог пока что сделать следующее: найти диски (на которые возможна установка, привязать процедуры наведения, снятия, клика(по которому создается дерево подпапок данной папки)). Нужно сделать так, чтобы в случае, когда уже раскрыта папка, при раскрытии папки этого же уровня удалялись подпапки предыдущей (на изображении более понятно выражено). У меня уже мозг кипит, я не знаю, как именно РЕАЛИЗОВАТЬ это. Авось, у кого-нибудь из вас получится.
[more=Код]var CurrentFile, CurrentDisc, Path: string;
Number, NumberDir, Discs, FirstTop, FirstLeft: Integer;
FindRec: TFindRec;
CreatedLabels: string;
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
const
DRIVE_UNKNOWN = 0;
DRIVE_NO_ROOT_DIR = 1;
DRIVE_REMOVEABLE = 2;
DRIVE_FIXED = 3;
DRIVE_REMOTE = 4;
DRIVE_CDROM = 5;
DRIVE_RAMDISK = 6;
Функция определения типа диска:
function GetDriveType(nDrive: string): Longint; external 'GetDriveTypeW@kernel32.dll stdcall';
procedure TreeLabelEnter(Sender: TObject); forward;
procedure TreeLabelLeave(Sender: TObject); forward;
procedure TreeLabelClick(Sender: TObject); forward;
procedure ShowMessage(Name: String);
begin
MsgBox(Name,MbInformation,MB_OK);
end;
function GetDiscs(): TStringList;
var
i: integer;
buk: array[0..26] of char;
begin
for i:=1 to 26 do
begin
buk[i] := Chr(i+64)
if (GetDriveType(PChar(buk[i]+':\')) <> 1) and not (GetDriveType(PChar(buk[i]+':\')) = 5) then
begin
with TLabel.Create(WizardForm) do
begin
Parent:=WizardForm;
AutoSize:=True;
Top:=FirstTop+Number*Height+4;
Left:=FirstLeft;
Caption:=buk[i]+':\';
Cursor:=crHand;
Hint:=Caption; //Например "D:\"
OnMouseEnter:=@TreeLabelEnter;
OnMouseLeave:=@TreeLabelLeave;
OnClick:=@TreeLabelClick;
Discs:=Discs+1;
end;
Number:=Number+1;
end;
end;
end;
procedure TreeLabelEnter(Sender: TObject);
begin
if Sender is TLabel then
begin
TLabel(Sender).Font.Style:=[fsBold];
end;
end;
procedure TreeLabelLeave(Sender: TObject);
begin
if Sender is TLabel then
begin
TLabel(Sender).Font.Style:=[];
end;
end;
var MyTop: integer;
procedure DeleteTreeLabels(Sender: TObject);
var i: integer;
begin
end;
procedure TreeLabelClick(Sender: TObject);
var
i, j: integer;
begin
for i:=1 to Length(TLabel(Sender).Hint) do
begin
if TLabel(Sender).Hint[i]='\' then j:=j+1;
end;
WizardForm.Caption:=Путь установки: '+TLabel(Sender).Hint;
WizardForm.DirEdit.Text:=TLabel(Sender).Hint;
if FindFirst(TLabel(Sender).Hint+'\*', FindRec) then begin
try
repeat
if (FindRec.Attributes) and (FILE_ATTRIBUTE_DIRECTORY) <> 0 then
if (FindRec.Name<>'.') and (FindRec.Name<>'..') and (FindRec.Name<>'$Recycle.Bin')
and (FindRec.Name<>'Boot') and (FindRec.Name<>'Recovery') and (FindRec.Name<>'ProgramData')
and (FindRec.Name<>'System Volume Information') and (FindRec.Name<>'$RECYCLE.BIN')
and (FindRec.Name<>'msdownld.tmp') then
begin
Number:=Number+1;
with TLabel.Create(WizardForm) do
begin
AutoSize:=True;
Parent:=WizardForm;
Left:=j*10;
Top:=Number*Height+4;
Caption:=FindRec.Name;
Cursor:=crHand;
Name:='Label_'+IntToStr(Number);
CreatedLabels:=CreatedLabels+','+Name;
Tag:=Number;
Hint:=TLabel(Sender).Hint+Caption+'\'; Например "Диск\Родительска папка\Эта подпапка" "(D:\1\2)"
OnMouseEnter:=@TreeLabelEnter;
OnMouseLeave:=@TreeLabelLeave;
OnClick:=@TreeLabelClick;
end;
end;
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end;
end;
На создании формы:
begin
FirstTop:=10;
FirstLeft:=10;
GetDiscs;
end;[/more]