Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Listview 3 Spalte Progressbar (https://www.delphipraxis.net/160613-listview-3-spalte-progressbar.html)

WizoHulk 22. Mai 2011 20:23

Listview 3 Spalte Progressbar
 
Hallo an alle

ich habe ein Listview mit 3 Spalten. Nun möchte ich ich in der 3. Spalte eine Progessbar createn.
Mit diesen code funktioniert das erstellen ja schon mal ganz gut, aber wie bekomme ich die PB in die dritte Spalte?
Delphi-Quellcode:
procedure TFmTabelle.SetzteProgressBarAufLV(aListView: TListView; aListItem: TListItem);
const
  ProgBarColumnIndex = 1;
  ProgBarMax = 100;
var
  ProgBar : TProgressBar;
  pbRect : TRect;
begin
  ProgBar           := TProgressBar.Create(nil);                              
  ProgBar.Style     := pbstMarquee;                                          
  ProgBar.Parent    := aListView;                                            
  aListItem.data    := ProgBar;                                              
  pbRect            := aListItem.DisplayRect(drBounds);
  pbRect.Left       := pbRect.Left + aListView.Columns[-1 + ProgBarColumnIndex].Width;
  pbRect.Right      := pbRect.Left + aListView.Columns[ProgBarColumnIndex].Width;
  ProgBar.BoundsRect := pbRect;
end;
Listview füllen der Spalten

Delphi-Quellcode:
      Screen.Cursor := crHourGlass;
      {* Value in Listeditor *}
      li        := ListView.Items.Add;
      li.Caption := sName;            //erste Spalte Name
      li.SubItems.Add(sPfad);         //zweite Spalte Pfad
      li.SubItems.Add(sDateigroesse); //dritte Spalte Größe
      SetzteProgressBarAufLV(ListView,li);

NickelM 22. Mai 2011 22:11

AW: Listview 3 Spalte Progressbar
 
So geht es:
Delphi-Quellcode:
procedure TFmTabelle.SetzteProgressBarAufLV(aListView: TListView; aListItem: TListItem);
const
  ProgBarMax = 100;
var
  ProgBar : TProgressBar;
  pbRect : TRect;
  //I: Integer;
begin
  ProgBar := TProgressBar.Create(nil);
  ProgBar.Style := pbstMarquee;
  ProgBar.Parent := aListView;
  aListItem.data := ProgBar;
  pbRect := aListItem.DisplayRect(drBounds);

  //Index geht ja mit 0 los xD Falls es max 3 sind.
  pbRect.Left := pbRect.Left + aListView.Columns[0].Width;
  pbRect.Left := pbRect.Left + aListView.Columns[1].Width;
  pbRect.Right := pbRect.Left + aListView.Columns[2].Width;
 
  //Wenn du es in die Letze Spalten immer haben willst mach es so:
  {
  for I := 0 to aListView.Columns.Count - 2 do
  pbRect.Left := pbRect.Left + aListView.Columns[I].Width;

  pbRect.Right := pbRect.Left + aListView.Columns[aListView.Columns.Count-1].Width;
  }

  ProgBar.BoundsRect := pbRect;
end;

WizoHulk 28. Mai 2011 01:57

AW: Listview 3 Spalte Progressbar
 
hallo,

das erstellen der Progressbar in der drittenspalten klappt prima.

Jetzt habe ich aber das Problem das wenn ich diese wieder freigeben will mit

Delphi-Quellcode:
TProgressbar(Li.Data).Free
Das ListItem verweist auf die 2 Spalte, obwohl die PB auf der Dritten Liegt.
Wie kann ich das ListItem in der 3. Spalte anknüpfen, das wenn ich die PB frei geben.

hoika 28. Mai 2011 06:01

AW: Listview 3 Spalte Progressbar
 
Hallo,

Zitat:

Das ListItem verweist auf die 2 Spalte, obwohl die PB auf der Dritten Liegt.
Ein ListItem verweist nicht auf eine Spalte,
sondern auf eine Zeile.


Heiko

Luckie 28. Mai 2011 11:00

AW: Listview 3 Spalte Progressbar
 
Und ist der Index der Spalten nicht null basierend? Ich bin mir jetzt nicht sicher, ob die erste Spalte als Caption bezeichnet wird und dann die zweite Spalte als erste Subitemspalte oder gar als nullte Subitemspalte oder ob die erste Spalte Spalte null ist und dann die zweite als erste Spalte bezeichnet wird.

jaenicke 29. Mai 2011 14:58

AW: Listview 3 Spalte Progressbar
 
Columns im Header ist genauso nullbasiert wie SubItems bei jedem Item.

Ich würde hier allerdings nicht so viele ProgressBars erzeugen. Man kann viel einfacher (einfacher u.a. wegen der nicht notwendigen Neupositionierung beim Scrollen) einfach Windows sagen, dass an der Stelle eine ProgressBar gezeichnet werden soll.
(Unit Themes, Befehl: ThemeServices.DrawElement mit teProgress als Element, ...)

WizoHulk 30. Mai 2011 09:34

AW: Listview 3 Spalte Progressbar
 
huhu

So viele PB's sollten es nicht werden.

Der sinn dahinter ist:

Es soll für DCPlusPlus einen Konfigurationsassistenten werden.
Der User muss Ordner Freigeben was in der ListView angezeigt wird.(also: Pfad Virtueller Name und Ordnergröße)
Die Ordnergröße muss noch berechnet werden was in einen Thread geschied. Und so lange der Thread läuft, läuft auch die PB.
Habe jetzt herausgefunden das beim Freigeben der PB auf eine Falsche adresse gezeigt wird was dadurch mir eine Exception bringt.

Kann man irgendwie nach den Namen der ProgressBar suchen und diese dann freigeben?
oder gibt es andere Möglichkeiten?

WizoHulk 31. Mai 2011 08:37

AW: Listview 3 Spalte Progressbar
 
Das Problem hat sich erledigt.
Mann kann nur die Progressbar in einen Thread freigeben mit synchronize().


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz