Tlistview [Résolu]

Signaler
Messages postés
16
Date d'inscription
dimanche 4 mars 2012
Statut
Membre
Dernière intervention
31 août 2012
-
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
-
Bonsoir je viens de m'inscrir sur ce forum que je ne connaissais pas, il est vraiment splendide, mais pourriez vous peut être m'aider, je l'espère.

Voici ma colle, j'utilise un composant HTTPGet pour pouvoir télécharger un fichier et une listview pour afficher l'avancement en écrivant ce code :

procedure TForm1.HTTPGet1Progress(Sender: TObject; TotalSize,
Readed: Integer);
var
LI : TListItem;
begin

LI := ListViewEx1.Items.Add;
LI.Caption := edit1.text; // Nom du fichier
LI.SubItems.Add (IntToStr(TotalSize)); // Taille total du fichier
LI.SubItems.Add (IntToStr(Readed)); // Taille téléchargé en cour
LI.SubItems.Add ('Téléchargement'); // Etat du téléchargement

Progress.Max:=TotalSize; // Taille max de la progressbar
Progress.Position:=Readed; // Positionnement de la progressbar
end;


Hors il m'affiche une nouvelle ligne à chaque fois.
Pourriez vous me montrer le bon chemin à prendre!

Salutation,


Débutante amatrice merci pour toute l aide que vous pourrez m apporter

Un grand merci d avance

6 réponses

Messages postés
16
Date d'inscription
dimanche 4 mars 2012
Statut
Membre
Dernière intervention
31 août 2012

Merci pour vos réponse mais voici en définitif mon code source qui fonctionne :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Shlobj,Graphics, Controls, Forms,
  Dialogs, shellapi,DSiWin32, ExtCtrls, IdAntiFreezeBase, IdAntiFreeze,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  ComCtrls, HTTPGet, StdCtrls, XPMan, ImgList, WinInet;

type
  TForm1 = class(TForm)
    HTTPGetFile: THTTPGet;
    Edit1: TEdit;
    lv: TListView;
    Button1: TButton;
    Image1: TImage;
    Button3: TButton;
    Button4: TButton;
    Timer1: TTimer;
    Label3: TLabel;
    XPManifest1: TXPManifest;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    _images: TImageList;
    PaneLBTM: TPanel;
    eeeID: TLabel;
    Label4: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    iko_0: TImage;
    Label12: TLabel;
    AA_0505_Label13: TLabel;
    eeOnStata: TLabel;
    Label2: TLabel;
    Label1: TLabel;
    procedure HTTPGetFileProgress(Sender: TObject; TotalSize,
      Readed: Integer);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure lvCustomDrawItem(Sender: TCustomListView; Item: TListItem;
      State: TCustomDrawState; var DefaultDraw: Boolean);
    procedure lvCustomDrawSubItem(Sender: TCustomListView; Item: TListItem;
      SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
//Etats connexion interent
function IsConnectedToInternet: Boolean;
var
  dwConnectionTypes: DWORD;
begin
  dwConnectionTypes :=
    INTERNET_CONNECTION_MODEM +
    INTERNET_CONNECTION_LAN +
    INTERNET_CONNECTION_PROXY;
  Result := InternetGetConnectedState(@dwConnectionTypes, 0);
end;
//Extraction du nom de l'url dans l'Edit1
function ExtractUrlFileName(const AUrl: string): string;
var
  i: Integer;
begin
  i := LastDelimiter('/', AUrl);
  Result := Copy(AUrl, i + 1, Length(AUrl) - (i));
end;

//Convertion de la taille du fichier
function BytesToStr(const i64Size: Int64): string;
const
  i64GB = 1024 * 1024 * 1024;
  i64MB = 1024 * 1024;
  i64KB = 1024;
begin
  if i64Size div i64GB > 0 then
    Result := Format('%.2f GB', [i64Size / i64GB])
  else if i64Size div i64MB > 0 then
    Result := Format('%.2f MB', [i64Size / i64MB])
  else if i64Size div i64KB > 0 then
    Result := Format('%.2f KB', [i64Size / i64KB])
  else
    Result := IntToStr(i64Size) + ' Byte(s)';
end;

//Extention du fichier
function GetFileTypeByName(Name: String): String;
var
  ext: ShortString;
begin
  ext := ExtractFileExt(Name);

  // Should return the translated types for gui

  if (ext = '') then
  begin
    Result := 'Tous';
    Exit;
  end;

  if (ext '.mpc') or (ext '.mp4') or (ext = '.aac') or (ext = '.ape') or
    (ext '.mp3') or (ext '.flac') or (ext = '.mp2') or (ext = '.wav') or
    (ext '.au') or (ext '.ogg') or (ext = '.wma') then
      Result := 'Audio';

  if (ext '.jpg') or (ext '.jpeg') or (ext = '.bmp') or (ext = '.gif') or
    (ext '.tif') or (ext '.png') then
      Result := 'Images';

  if (ext '.avi') or (ext '.mpg') or (ext = '.mpeg') or (ext = '.ram') or
    (ext '.rm') or (ext '.asf') or (ext = '.vob') or (ext = '.divx') or
    (ext '.vivo') or (ext '.ogm') or (ext = '.mov') then
      Result := 'Video';

  if (ext '.gz') or (ext '.zip') or (ext = '.ace') or (ext = '.rar') then
      Result := 'Archive';

  if (ext '.exe') or (ext '.com') then
      Result := 'Programme';

  if (ext '.ccd') or (ext '.sub') or (ext = '.cue') or (ext = '.bin') or
    (ext '.iso') or (ext '.nrg') or (ext = '.img') or (ext = '.bwa') or
    (ext '.bwi') or (ext '.bws') or (ext = '.bwt') or (ext = '.mds') or
    (ext = '.mdf') then
      Result := 'CD Images'
end;

//Télécharger un fichier avec indy
procedure DownloadHTTP(const AUrl : string; out DestStream: TStream);
begin
  with TIdHTTP.Create(Application) do
  try
      try
        Get(AUrl,DestStream);
      except
        On e : Exception do
          MessageDlg(Format('Erreur : %s',[e.Message]), mtInformation, [mbOK], 0);
      end;
  finally
      Free;
  end;
end;

//Répertoire spéciaux windows
function SpecialFolder(Folder: Integer): String;
var
  SFolder : pItemIDList;
  SpecialPath : Array[0..MAX_PATH] Of Char;
begin
  SHGetSpecialFolderLocation(Form1.Handle, Folder, SFolder);
  SHGetPathFromIDList(SFolder, SpecialPath);
  Result := StrPas(SpecialPath);
end;

//Téléchargement du fichier
procedure TForm1.HTTPGetFileProgress(Sender: TObject; TotalSize,
  Readed: Integer);
var
 Node        : integer;
 i           : integer;
 li          : TListitem;
 s           : string;
 perc        : integer;
begin
//affichage des donnée
 perc := round(  readed / totalsize * 100);
 try
 for I:=0 to lv.Items.Count -1 do begin
    begin
 begin
   try
    LV.Items.Item[i].SubItems[0]:=GetFileTypeByName(ExtractUrlFileName(edit1.text));
    LV.Items.Item[i].SubItems[1]:=ExtractUrlFileName(edit1.text);
    LV.Items.Item[i].SubItems[2]:=BytesToStr(Totalsize);
    LV.Items.Item[i].SubItems[3]:=BytesToStr(Readed);
    lV.Items.Item[i].SubItems[4] := IntToStr(Perc);
    lV.Items.Item[i].SubItems[5] := IntToStr(Perc);
   finally;
end;
end;
end;
end;
finally
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 rep : byte;
 li          : TListitem;
begin
 

       HTTPGetFile.URL := Edit1.Text;
       HTTPGetFile.FileName := 'C:\Users\eClem\Pictures\CLEM\divers'+'\'+ExtractUrlFileName( edit1.text);
       HTTPGetFile.GetFile;

end;

procedure TForm1.FormCreate(Sender: TObject);
var
 li          : TListitem;
begin
 li := lv.items.add;
  li.Caption := '';
  li.SubItems.Add('');
  li.SubItems.Add('');
  li.SubItems.Add('');
  li.subitems.add('');
  li.subitems.add('');
  li.subitems.add('');
_images.Draw (iko_0.Canvas, 0,0, 1);
 if IsConnectedToInternet then
    eeOnStata.Caption:='OnLine'
  else
    eeOnStata.Caption:='OffLine';
//ImageList1.Draw(StatusBar1.Canvas, Rect.Left + 2, Rect.Top, ImgIndex);

end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label2.Caption:=TimeToStr(Now);
end;

procedure TForm1.lvCustomDrawItem(Sender: TCustomListView; Item: TListItem;
  State: TCustomDrawState; var DefaultDraw: Boolean);
begin
with Sender as TListView do
  begin
    with Canvas do
    begin
 
           if Item.Selected then
      begin
        Brush.Color := cLBLUE;//ou rgb(220,220,255);
        Pen.Style := psDot;
        Pen.Color := clBLUE;
      end
      else
      begin
        Pen.Style := psSolid;
        Pen.Color := Brush.Color;
      end;
  end;
 end;
end;


procedure TForm1.lvCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var
  v,w,i:integer;
  R: TRect;
  bgColor: TColor;
begin

 if (SubItem=5) then
 begin
   try
     DefaultDraw:=False;
     bgColor := Sender.Canvas.Brush.Color;
     w := Sender.Column[SubItem].Width;
     v:=0;
     if Item.Subitems[5]<>'' then //subitem-1
       v := StrToInt(Item.Subitems[5]);
     R := Item.DisplayRect(drBounds);
     for i:=0 to SubItem-1 do
       R.Left := R.Left+Sender.Column[i].Width;
     R.Right := R.Left+w;

     Sender.Canvas.Brush.Color := bgColor;
     Sender.Canvas.FillRect(R);
     InflateRect(R, -1, 0);
     r.top:=r.top+2;
     Sender.Canvas.Brush.Color := clSKYBLUE;//Silver;
     Sender.Canvas.FillRect(R);
     Sender.Canvas.Brush.Color:= clBLACK;//Black;
     Sender.Canvas.FrameRect(R);
     InflateRect(R, -1, -1);
     R.Right := R.Left + ((R.Right - R.Left) * v) div 100;
     Sender.Canvas.Brush.Color := clBLUE;//clNavy;
     Sender.Canvas.FillRect(R);
     Sender.Canvas.Brush.Color := bgColor;
     sender.canvas.Font.Style:=[];
   except;
   end;
 end;

end;


desolé mais il est pas totalement commenté

merci de votre participation
Débutante amatrice merci pour toute l aide que vous pourrez m apporter

Un grand merci d avance

Salut

Normal qu'il t'affiche une nouvelle ligne : c'est ce que tu lui demandes

Utilises la touche F1 : c'est l'aide de Delphi.

Sinon que veux tu faire car là tu ne le dis pas
Messages postés
16
Date d'inscription
dimanche 4 mars 2012
Statut
Membre
Dernière intervention
31 août 2012

Merci de ta reponse

ben il faudrais qu'il n'y ai qu'une seule ligne qui s affiche durant le telechargement

j'ai regarder ceci mais il n y a rien qui s affiche :

procedure TForm1.HTTPGetFileProgress(Sender: TObject; TotalSize,
Readed: Integer);
var
Node : integer;
i : integer;
li : TListitem;
s : string;
begin
//affichage des donnée

for i := 0 to lv.Items.Count - 1 do
begin
try
LV.Items.Item[i].SubItems[0]:=ExtractUrlFileName( edit1.text);
LV.Items.Item[i].SubItems[1]:=BytesToStr(Totalsize);
LV.Items.Item[i].SubItems[2]:=BytesToStr(Readed);
finally;
//prtogression
Progress.Max:=TotalSize; // Taille max de la progressbar
Progress.Position:=Readed; // Positionnement de la progressbar
end;
end;
end;
Débutante amatrice merci pour toute l aide que vous pourrez m apporter

Un grand merci d avance
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15
Salut,

le problème est que tu utilises incorrectement les méthodes de la TListView, dont le maniement n'est pas aisé (surtout pour un(e) débutant(e)).
Pourquoi n'utilises-tu pas plutôt une TListBox, l'usage en est beaucoup plus simple et me semble mieux adapté à ce que tu veux faire.

Voici un code fonctionnel :

ListViewEx1.Items.Clear;
  LI := ListViewEx1.Items.Add;
  LI.Caption := Edit1.text; // Nom du fichier
  LI := ListViewEx1.Items.Add;
  LI.Caption := (IntToStr(TotalSize)); // Nom du fichier
  LI := ListViewEx1.Items.Add;
  LI.Caption := (IntToStr(Readed)); // Taille téléchargée en cours
  LI := ListViewEx1.Items.Add;
  LI.Caption := ('Téléchargement'); // Etat du téléchargement


Mieux :

with ListViewEx1.Items do
  begin
    Clear;
    LI := Add;
    LI.Caption := Edit1.text; // Nom du fichier
    LI := Add;
    LI.Caption := (IntToStr(TotalSize)); // Nom du fichier
    LI := Add;
    LI.Caption := (IntToStr(Readed)); // Taille téléchargée en cours
    LI := Add;
    LI.Caption := ('Téléchargement'); // Etat du téléchargement
  end;


Mais pourquoi s'embêter avec "LI := Add" à chaque fois ?

with ListViewEx1.Items do
  begin
    Clear;
    Add.Caption := Edit1.text; // Nom du fichier
    Add.Caption := (IntToStr(TotalSize)); // Nom du fichier
    Add.Caption := (IntToStr(Readed)); // Taille téléchargée en cours
    Add.Caption := ('Téléchargement'); // Etat du téléchargement
  end;


Cordialement.

@Tu as raison Korgis : Karen utilise mal les propriétés du TListView et une TListBox serait mieux. Mais si je peux en général on utilise plutot des TLabel pour ce qu'elle veut faire .

Ensuite Karen fait de grosses betises dans son code

HTTPGetFileProgress est appelé à chaque qu'un paquet est récupéré : Hors il n'y a aucun intéret à afficher les données (Nom,taille du fichier,état) à chaque paquet récupéré. Hors en mettant ce code dans le HTTPGetFileProgress c'est ce qu'elle fait.

Les seules fonctions qui doivent etre appelé dans cette procédure sont celles pour afficher la taille téléchargée et la progressbar.

Bref Karen tu es partie dans une mauvaise direction
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
12
Salut Karen
pour simplifier :

if pos(ext,'.mpc.mp4.aac.ape.mp3.flac.mp2.wav.au.ogg.wma')>0 then
Result := 'Audio';

pareil pour les autres

Dubois77