|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Компонент TFilleListView
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. Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#4
|
|||
|
|||
TFileListView CLX Delphi 7
Цитата:
СПАСИБО. Попробую, а пока решил таким вот образом, может кому пригодится: 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 (благо это не так и сложно).
|