constructor TExtShellListView.Create(Sender: TObject);
begin
inherited;
Columns.Add('Datum');
OnFileAdded := @FileAdded;
end;
procedure TExtShellListView.FileAdded(Sender: TObject; NewItem: TListItem);
var
dt: TDateTime;
begin
FileAge(IncludeTrailingPathDelimiter(FRoot) + NewItem.Caption, dt);
NewItem.SubItems.Add(FormatDateTime(dt));
end;
wp_xyz hat geschrieben:Oder weiß jemand, wie man bei einer virtuallen Methode die von den Großeltern geerbte Methode aufruft, also quasi ein "inherited inherited"? Das würde wahrscheinlich das OnResize einfach fixen lassen.
theo hat geschrieben:Statt einer Ableitung für den Hausgebrauch würde man für solche Dinge besser einen Patch auf TCustomShellListView machen.
wp_xyz hat geschrieben:theo hat geschrieben:Statt einer Ableitung für den Hausgebrauch würde man für solche Dinge besser einen Patch auf TCustomShellListView machen.
Das ist schon klar, aber so einen halbseidenen Patch würde ich nicht akzeptieren. Ein richtiger Patch müsste das Problem grundsätzlicher angehen und dem Benutzer eine Schnittstelle zur Verfügung stellen, beliebige Spalten hinzuzufügen; auch die nicht abschaltbare Spaltenbreitenautomatik muss weg. Mein Versuch war eigentlich eher als Motivation gedacht, dass die Leute einmal in den Quellcode schauen sollten, um Ideen für die Lösung ihrer Probleme zu bekommen - auch wenn das nicht so ausgedrückt war.
braunbär hat geschrieben:wp_xyz hat geschrieben:Oder weiß jemand, wie man bei einer virtuallen Methode die von den Großeltern geerbte Methode aufruft, also quasi ein "inherited inherited"? Das würde wahrscheinlich das OnResize einfach fixen lassen.
Vorvorvorfahr(self).create sollte im Create des Typs funktionieren, oder nicht? Create ist ja im Gegensatz zu destroy statisch, wenn ich mich nicht irre.
constructor TCustomShellListView.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
// Initial property values
ViewStyle := vsReport;
ObjectTypes := [otNonFolders];
Self.Columns.Add;
Self.Columns.Add;
Self.Columns.Add;
Self.Columns.Add; //CTR
Self.Column[0].Caption := sShellCtrlsName;
Self.Column[1].Caption := sShellCtrlsSize;
Self.Column[2].Caption := sShellCtrlsType;
Self.Column[3].Caption := 'Date'; //CTR - has to be declared elsewhere
// Initial sizes, necessary under Windows CE
Resize;
end;
destructor TCustomShellListView.Destroy;
begin
ShellTreeView := nil;
inherited Destroy;
end;
procedure TCustomShellListView.PopulateWithRoot();
var
i: Integer;
Files: TStringList;
NewItem: TListItem;
CurFileName, CurFilePath: string;
CurFileSize: Int64;
CurFileDate: TDateTime; //CTR
begin
// avoids crashes in the IDE by not populating during design
if (csDesigning in ComponentState) then Exit;
// Check inputs
if Trim(FRoot) = '' then Exit;
Files := TStringList.Create;
try
Files.OwnsObjects := True;
TCustomShellTreeView.GetFilesInDir(FRoot, FMask, FObjectTypes, Files);
for i := 0 to Files.Count - 1 do
begin
NewItem := Items.Add;
CurFileName := Files.Strings[i];
CurFilePath := IncludeTrailingPathDelimiter(FRoot) + CurFileName;
// First column - Name
NewItem.Caption := CurFileName;
// Second column - Size
// The raw size in bytes is stored in the data part of the item
CurFileSize := FileSize(CurFilePath); // in Bytes
NewItem.Data := Pointer(PtrInt(CurFileSize));
if CurFileSize < 1024 then
NewItem.SubItems.Add(Format(sShellCtrlsBytes, [IntToStr(CurFileSize)]))
else if CurFileSize < 1024 * 1024 then
NewItem.SubItems.Add(Format(sShellCtrlsKB, [IntToStr(CurFileSize div 1024)]))
else
NewItem.SubItems.Add(Format(sShellCtrlsMB, [IntToStr(CurFileSize div (1024 * 1024))]));
// Third column - Type
NewItem.SubItems.Add(ExtractFileExt(CurFileName));
// CTR Fourth column - Date - inserted next two lines
FileAge(CurFilePath, CurFileDate);
NewItem.SubItems.Add(FormatDateTime('DD.MM.YYYY hh:mm', CurFileDate));
if Assigned(FOnFileAdded) then FOnFileAdded(Self,NewItem);
end;
Sort;
finally
Files.Free;
end;
end;
procedure TCustomShellListView.Resize;
begin
inherited Resize;
{$ifdef DEBUG_SHELLCTRLS}
debugln(':>TCustomShellListView.HandleResize');
{$endif}
// The correct check is with count,
// if Column[0] <> nil then
// will raise an exception
if Self.Columns.Count < 4 then Exit; //CTR 3 durch 4 ersetzt
// If the space available is small,
// alloc a larger percentage to the secondary
// fields
if Width < 400 then
begin
Column[0].Width := (30 * Width) div 100; //CTR
Column[1].Width := (25 * Width) div 100;
Column[2].Width := (25 * Width) div 100;
Column[3].Width := (30 * Width) div 100; //CTR
end
else
begin
Column[0].Width := (40 * Width) div 100; //CTR
Column[1].Width := (15 * Width) div 100;
Column[2].Width := (15 * Width) div 100;
Column[3].Width := (25 * Width) div 100; //CTR
end;
{$ifdef DEBUG_SHELLCTRLS}
debugln([':<TCustomShellListView.HandleResize C0.Width=',
Column[0].Width, ' C1.Width=', Column[1].Width,
' C2.Width=', Column[2].Width]);
{$endif}
end;
function TCustomShellListView.GetPathFromItem(ANode: TListItem): string;
begin
Result := IncludeTrailingPathDelimiter(FRoot) + ANode.Caption;
end;
procedure Register;
begin
RegisterComponents('Misc',[TShellTreeView, TShellListView]);
end;
Zurück zu Komponenten und Packages
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast