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

 



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

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

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

Понимая, что вопрос малоинформативный даю как я это делаю и что не получается:
Код 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  
Старый 11.02.2020, 04:09
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 636
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

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

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

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

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  
Старый 17.02.2020, 19:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,544
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

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



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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2020

ВКонтакте   Facebook   Twitter