![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Delphi 7 CLX.
1. В компоненте TFilleListView, как узнать атрибуты файловв, находящихся в текущей активной директории? Для изменения Canvas.Font.Color в отрисовщике в зависимости от этого атрибута файла. Как отрисовать в зависимости от атрибута знаю. 2. В компоненте TFilleListView не видны файлы с атрибутом Hidden. Как сделать чтобы были всё же видны? |
|
#2
|
|||
|
|||
|
Цитата:
Понимая, что вопрос малоинформативный даю как я это делаю и что не получается: Код DoCustomDrawViewItem из TFilleListView немного доработанный мной: Код:
function TFileListViewColor.DoCustomDrawViewItem(Item: TCustomViewItem;
Canvas: TCanvas; const Rect: TRect; State: TCustomDrawState;
Stage: TCustomDrawStage): Boolean;
var
R: TRect; IL: TCustomImageList; ListItem: TListItem; i:integer;
pFile:PSearchRec;
begin
Result := False;
if Stage = cdPostPaint then Result := inherited DoCustomDrawViewItem(Item, Canvas, Rect, State, cdPrePaint);
if Result then
begin
R := Rect; Canvas.FillRect(R);
if list.Count>0 then
begin
if DOWN_UP then i:=Selected.Index-1
else
i:=Selected.Index+1;
if (isSelect(i)) then
begin
Canvas.Brush.Color :=Color;
Canvas.Font.Color :=clRed;
end;
end
else
begin
Canvas.Brush.Color :=Color;
Canvas.Font.Color :=clBlack;
pFile:=PSearchRec(Item);
case pFile^.Attr of
faSysFile:Font.Color:=clRed;//ColorError;
faHidden: Font.Color:=clBlue;//ColorTransl;
end;
end;
ListItem := TListItem(Item);
with ListItem do
begin
if Assigned(Images) then
IL := Images
else
IL := FIconProvider;
Inc(R.Top, (R.Bottom - R.Top - IL.Height) div 2);
IL.Draw(Canvas, R.Left, R.Top, ImageIndex);
{$IFDEF LINUX}
if (Data <> nil) and (PFileInfo(Data).SR.Attr and faSymLink <> 0)
and (IL = FIconProvider) then
FIconProvider.DrawLinkOverlay(Canvas, R.Left, R.Top, PFileInfo(Data));
{$ENDIF}
Inc(R.Left, IL.Width + 2);
if (Data <> nil) and (EditingItem <> Item) then
DrawTruncatedText(Canvas, R, PFileInfo(Data).SR.Name)
else
Result := True;
end;
end;
if Stage = cdPostPaint then
begin
inherited DoCustomDrawViewItem(Item, Canvas, Rect, State, Stage);
Result := False;
end;
end;В pFile:=PSearchRec(Item);case pFile^.Attr of pFile^.Attr почему-то всегда равен 1, хотя файлы в директории 100% faSysFile |
|
#3
|
||||
|
||||
|
Потому что Item: TCustomViewItem не является указателем на TSearchRec, и Ваше преобразование pFile:=PSearchRec(Item) не работает от слова "совсем".
Для получения атрибутов файла используйте FileGetAttr. |
|
#4
|
|||
|
|||
|
Цитата:
СПАСИБО. Попробую, а пока решил таким вот образом, может кому пригодится: 1. Для выделения файлов списком в FileListView, его и составляем (List) Код:
procedure TFileListViewColor.SelectFile(var Key: Word; Shift: TShiftState);
var
i:integer;
pFile:PSearchRec;
begin
if (PFileInfo(Selected.Data)^.SR.Attr and faDirectory = 0) then
begin
i:=list.IndexOf(inttostr(Selected.Index));
if (i=-1) then
begin
if (Directory.Location+items.Item[Selected.Index].Caption<>fileNameZaxvat) then
begin
list.Add(inttostr(Selected.Index));
Inc(FItemIndex);
fLengthFiles:=fLengthFiles+PFileInfo(Selected.Data)^.SR.size;
end;
end
else
begin
list.Delete(i);
Dec(FItemIndex);
fLengthFiles:=fLengthFiles-PFileInfo(Selected.Data)^.SR.size;
end;
Key:=4117;
inherited KeyDown(Key, Shift);
if Assigned(fOnSelectFile) then
fOnSelectFile(self);
end;
end;и вызываем в KeyDown Код:
procedure TFileListViewColor.KeyDown(var Key: Word; Shift: TShiftState);
var
i:integer;
begin
inherited KeyDown(Key, Shift);
if Key = Key_F5 then
Refresh;
if Key = Key_Insert then
SelectFile(Key, Shift);
if (Selected<>nil) then
if (Key=4117) then //Down
begin
DOWN_UP :=true;
i:=ItemFocused.Index;
if (i+1)<=Items.Count-1 then
FFileName:=Items.Item[i+1].Caption;
a_MCaption.Caption:=FFileName;
end;
if (Key=4115) then //Up
begin
DOWN_UP :=false;
i:=ItemFocused.Index;
if (i-1)>=0 then
FFileName:=Items.Item[i-1].Caption;
a_MCaption.Caption:=FFileName;
end;
end;2. При открытии папки или её обновлении составляем список listfiles_Attr атрибутов файлов: Код:
procedure TFileListViewColor.Update;
var
i:integer;
pFile:PSearchRec;
begin
listfiles_Attr.Clear;
for i:=0 to Items.Count-1 do
begin
pFile:=Items.Item[i].Data;
listfiles_Attr.Add(pFile);
end;
end;
3. И отображаем по списку List -выделенные файлы и атрибуты файлов цветом (PSearchRec(Listfiles_Attr.Items[ListItem.Index]).Attr): Код:
function TFileListViewColor.DoCustomDrawViewItem(Item: TCustomViewItem;
Canvas: TCanvas; const Rect: TRect; State: TCustomDrawState;
Stage: TCustomDrawStage): Boolean;
var
R: TRect; IL: TCustomImageList; ListItem: TListItem; i:integer;
pFile:PSearchRec;
FFileName_:string;
j: integer;
begin
Result := False;
if Stage = cdPostPaint then Result := inherited DoCustomDrawViewItem(Item, Canvas, Rect, State, cdPrePaint);
if Result then
begin
R := Rect;
Canvas.FillRect(R);
ListItem := TListItem(Item); //
if list.Count>0 then
begin
if DOWN_UP then
i:=Selected.Index-1
else
i:=Selected.Index+1;
if (isSelect(i)) then
begin
Canvas.Brush.Color :=Color;
Canvas.Font.Color :=clLime;
end;
end
else
begin
Canvas.Brush.Color :=Color;
case PSearchRec(Listfiles_Attr.Items[ListItem.Index]).Attr of
faSysFile : Canvas.Font.Color:=clRed;
faHidden : Canvas.Font.Color:=clBlue;
faArchive : Canvas.Font.Color:=clBlack;
faAnyFile : Canvas.Font.Color:=clAqua;
end;
end;
with ListItem do
begin
if Assigned(Images) then
IL := Images
else
IL := FIconProvider;
Inc(R.Top, (R.Bottom - R.Top - IL.Height) div 2);
IL.Draw(Canvas, R.Left, R.Top, ImageIndex);
{$IFDEF LINUX}
if (Data <> nil) and (PFileInfo(Data).SR.Attr and faSymLink <> 0)
and (IL = FIconProvider) then
FIconProvider.DrawLinkOverlay(Canvas, R.Left, R.Top, PFileInfo(Data));
{$ENDIF}
Inc(R.Left, IL.Width + 2);
if (Data <> nil) and (EditingItem <> Item) then
DrawTruncatedText(Canvas, R, PFileInfo(Data).SR.Name)
else
Result := True;
end;
end;
if Stage = cdPostPaint then
begin
inherited DoCustomDrawViewItem(Item, Canvas, Rect, State, Stage);
Result := False;
end;
end;Работает... 4. И всё же может кто-то знает, как заставить FileListView показывать и скрытые файлы с атрибутом faHidden. Они просто не видны в списке FileListView. Так выглядит: https://photos.google.com/photo/AF1Q...yREoi24pnLEYU6 Последний раз редактировалось basilcat, 11.02.2020 в 19:16. |
|
#5
|
|||
|
|||
|
Походу, никак. Этот уомпонент является просто оберткой над системным компонентом, соответсвенно, использует те же настойки, что и Explorer. А его мне не удалось заставить показывать системные и скрытые файлы (я так понимаю, что тебе надо именно это, для просто скрытых, вроде, есть возможность настроить их показ - там есть свойство какие объекты отображать). Соотвтественно, если тебе все-таки надо показывать ВСЁ, то придется писать самому на основе стандартного TListView (благо это не так и сложно).
|