Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.02.2020, 18:58
basilcat basilcat вне форума
Прохожий
 
Регистрация: 27.04.2017
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Компонент TFilleListView

Delphi 7 CLX.
1. В компоненте TFilleListView, как узнать атрибуты файловв, находящихся в текущей активной директории? Для изменения Canvas.Font.Color в отрисовщике в зависимости от этого атрибута файла.
Как отрисовать в зависимости от атрибута знаю.
2. В компоненте TFilleListView не видны файлы с атрибутом Hidden.
Как сделать чтобы были всё же видны?
Ответить с цитированием
  #2  
Старый 10.02.2020, 20:18
basilcat basilcat вне форума
Прохожий
 
Регистрация: 27.04.2017
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от basilcat
Delphi 7 CLX.
1. В компоненте TFilleListView, как узнать атрибуты файловв, находящихся в текущей активной директории? Для изменения Canvas.Font.Color в отрисовщике в зависимости от этого атрибута файла.
Как отрисовать в зависимости от атрибута знаю.
2. В компоненте TFilleListView не видны файлы с атрибутом Hidden.
Как сделать чтобы были всё же видны?

Понимая, что вопрос малоинформативный даю как я это делаю и что не получается:
Код DoCustomDrawViewItem из TFilleListView немного доработанный мной:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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  
Старый 11.02.2020, 04:09
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Потому что Item: TCustomViewItem не является указателем на TSearchRec, и Ваше преобразование pFile:=PSearchRec(Item) не работает от слова "совсем".
Для получения атрибутов файла используйте FileGetAttr.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #4  
Старый 11.02.2020, 17:04
basilcat basilcat вне форума
Прохожий
 
Регистрация: 27.04.2017
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию TFileListView CLX Delphi 7

Цитата:
Сообщение от dr. F.I.N.
Потому что Item: TCustomViewItem не является указателем на TSearchRec, и Ваше преобразование pFile:=PSearchRec(Item) не работает от слова "совсем".
Для получения атрибутов файла используйте FileGetAttr.

СПАСИБО.
Попробую, а пока решил таким вот образом, может кому пригодится:

1. Для выделения файлов списком в FileListView, его и составляем (List)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
            <b>list.Add</b>(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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
   <b>SelectFile(Key, Shift);</b>
 
if (Selected<>nil) then
if (Key=4117then          //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 атрибутов файлов:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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):

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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 <b>PSearchRec(Listfiles_Attr.Items[ListItem.Index]).Attr</b> 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  
Старый 17.02.2020, 19:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Походу, никак. Этот уомпонент является просто оберткой над системным компонентом, соответсвенно, использует те же настойки, что и Explorer. А его мне не удалось заставить показывать системные и скрытые файлы (я так понимаю, что тебе надо именно это, для просто скрытых, вроде, есть возможность настроить их показ - там есть свойство какие объекты отображать). Соотвтественно, если тебе все-таки надо показывать ВСЁ, то придется писать самому на основе стандартного TListView (благо это не так и сложно).
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:29.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025