Listview : items et subitems

sp40
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
- 14 févr. 2012 à 15:01
sp40
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
- 18 févr. 2012 à 11:49
Bonjour,

J'utilise pour la première fois un TListView en ViewStyle vsReport, parce que ça m'avait l'air sympathique et bien présenté.
Petite question, existe-t'il un moyen d’insérer une ligne complète en une ligne de code (avec des séparateurs par exemple, un peu à la manière d'un TLMDListBox pour ceux qui ont eu l'occasion de l'utiliser) au lieu de créer un item, puis des subitems ?
Peut être que je n'utilise pas le composant approprié ?
(j'aimerais éviter de repartir sur les LMD)

Merci d'avance pour vos réponses

Simon

5 réponses

cs_MAURICIO
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
15 févr. 2012 à 11:31
Salut,

je pense que non mais il serait très simple d' en créer une.

A+


Composants Cindy pour Delphi
Faites une donation.
0
sp40
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
15 févr. 2012 à 15:55
Salut Mauricio,

Une bonne idée que tu m'as donnée.
J'ai fait ce petit bout de code rapidement.
Une petite question tout de même, j'appelle ma fonction getLineStrList de la façon suivante :
procedure maform.boutonclick(sender : tobject);
var
myList : TStrings;
begin
myList := getLineStrList(1);
ShowMessage(myList.text);
myList.Free;
end;

Je ne suis cependant pas sûr de ne pas avoir de fuite mémoire. Est-ce qu'en faisant le free, la mémoire allouée au "result" de ma fonction getLineStrList est bien libérée ?

// Delphi XE2
// "Optimisation" du TListView
// Utilise StrBefore et StrAfter de jclAnsiStrings

unit UMdf_ListView;

interface
uses Vcl.ComCtrls, System.Classes, jclAnsiStrings;

type TListView = Class(Vcl.ComCtrls.TListView)

Private
lvSeparator : Char; // Séparateur de chaine

public
Constructor Create (Aowner: Tcomponent); override;
Destructor Destroy;

Published
// nb : Je ne sais pas si ces fonctions présenteront un
// quelconque intéret dans un autre mode que ViewStyle = vsReport
property Separator : char read lvSeparator write lvSeparator default ';'; // séparateur de chaine
function getLineStrList(iIndex : Integer) : TStrings; // Renvoie les valeurs d'une ligne sous forme de stringlist
function getLineString(iIndex : Integer) : string; // Renvoie les valeurs d'une ligne sous forme de string
function AddLine(sLine : string) : integer; // Ajoute une ligne (sous forme d'une chaine séparée par le séparateur) et renvoie son index
End;

implementation

// Creation du composant
Constructor TListView.Create(Aowner: Tcomponent);
begin
inherited;
// initialisation
lvSeparator := ';';
end;

// Destruction du composant
destructor TListView.Destroy;
begin
inherited Destroy;
end;

// Renvoie les valeurs d'une ligne sous forme de stringlist
function TListView.getLineStrList(iIndex : Integer) : TStrings;
var
i : Integer;
begin
Result := TStringList.Create;
// si l'index choisi existe et est supérieur à -1
// sinon retour d'une liste vide
if (iIndex > -1)
and (iIndex < Items.Count) then begin
// Ajout de l'item principal
Result.Add(Items[iIndex].Caption);
for I := 0 To Items[iIndex].SubItems.Count - 1
do Result.Add(Items[iIndex].subItems[i]); // ajout des subitems
end;
end;

// Renvoie les valeurs d'une ligne sous forme de string
function TListView.getLineString(iIndex : Integer) : string;
var
i : Integer;
sReste : string; // reste de la chaine à ajouter
begin
Result := '';
// si l'index choisi existe et est supérieur à -1
// sinon retour d'une chaine vide
if (iIndex > -1)
and (iIndex < Items.Count) then begin
Result := Items[iIndex].Caption;
for I := 0 to Items[iIndex].SubItems.Count - 1
do Result := Result + lvSeparator + Items[iIndex].SubItems[i];
end;
end;

// Ajoute une ligne (sous forme d'une chaine séparée par le séparateur) et renvoie son index
function TListView.AddLine(sLine : string) : Integer;
var
i : Integer;
sReste : string; // reste de la chaine à ajouter
itAjout : TListItem; // item à ajouter
begin
Result := -1;
// Sans effet si la chaine est vide
if sLine <> '' then begin
// Ajout de l'item principal
itAjout := Items.Add;
itAjout.Caption := StrBefore(lvSeparator, sLine);
sReste := StrAfter(lvSeparator, sLine);
// Ajout des subitems
for i := 1 To Columns.Count - 1 do begin
itAjout.SubItems.Add(StrBefore(lvSeparator, sReste));
sReste := StrAfter(lvSeparator, sReste);
end;
// retour de l'index de l'ajout
Result := itAjout.Index;
end;
end;

end.

Simon
0
sp40
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
15 févr. 2012 à 15:57
pfff désolé mais l'indentation a complétement sauté quand j'ai cliqué sur envoyer...

Simon
0
cs_rt15
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
18 févr. 2012 à 11:44
Salut,

Il y a la balise "code" de dispo. Troisième bouton en partant de la gauche.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sp40
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
18 févr. 2012 à 11:49
// Delphi XE2
// "Optimisation" du TListView
// Utilise StrBefore et StrAfter de jclAnsiStrings

unit UMdf_ListView;

interface
uses Vcl.ComCtrls, System.Classes, jclAnsiStrings;

type TListView = Class(Vcl.ComCtrls.TListView)

Private
lvSeparator : Char; // Séparateur de chaine

public
Constructor Create (Aowner: Tcomponent); override;
Destructor Destroy;

Published
// nb : Je ne sais pas si ces fonctions présenteront un
// quelconque intéret dans un autre mode que ViewStyle = vsReport
property Separator : char read lvSeparator write lvSeparator default ';'; // séparateur de chaine
function getLineStrList(iIndex : Integer) : TStrings; // Renvoie les valeurs d'une ligne sous forme de stringlist
function getLineString(iIndex : Integer) : string; // Renvoie les valeurs d'une ligne sous forme de string
function AddLine(sLine : string) : integer; // Ajoute une ligne (sous forme d'une chaine séparée par le séparateur) et renvoie son index
End;

implementation

// Creation du composant
Constructor TListView.Create(Aowner: Tcomponent);
begin
inherited;
// initialisation
lvSeparator := ';';
end;

// Destruction du composant
destructor TListView.Destroy;
begin
inherited Destroy;
end;

// Renvoie les valeurs d'une ligne sous forme de stringlist
function TListView.getLineStrList(iIndex : Integer) : TStrings;
var
i : Integer;
begin
Result := TStringList.Create;
// si l'index choisi existe et est supérieur à -1
// sinon retour d'une liste vide
if (iIndex > -1)
and (iIndex < Items.Count) then begin
// Ajout de l'item principal
Result.Add(Items[iIndex].Caption);
for I := 0 To Items[iIndex].SubItems.Count - 1
do Result.Add(Items[iIndex].subItems[i]); // ajout des subitems
end;
end;

// Renvoie les valeurs d'une ligne sous forme de string
function TListView.getLineString(iIndex : Integer) : string;
var
i : Integer;
sReste : string; // reste de la chaine à ajouter
begin
Result := '';
// si l'index choisi existe et est supérieur à -1
// sinon retour d'une chaine vide
if (iIndex > -1)
and (iIndex < Items.Count) then begin
Result := Items[iIndex].Caption;
for I := 0 to Items[iIndex].SubItems.Count - 1
do Result := Result + lvSeparator + Items[iIndex].SubItems[i];
end;
end;

// Ajoute une ligne (sous forme d'une chaine séparée par le séparateur) et renvoie son index
function TListView.AddLine(sLine : string) : Integer;
var
i : Integer;
sReste : string; // reste de la chaine à ajouter
itAjout : TListItem; // item à ajouter
begin
Result := -1;
// Sans effet si la chaine est vide
if sLine <> '' then begin
// Ajout de l'item principal
itAjout := Items.Add;
itAjout.Caption := StrBefore(lvSeparator, sLine);
sReste := StrAfter(lvSeparator, sLine);
// Ajout des subitems
for i := 1 To Columns.Count - 1 do begin
itAjout.SubItems.Add(StrBefore(lvSeparator, sReste));
sReste := StrAfter(lvSeparator, sReste);
end;
// retour de l'index de l'ajout
Result := itAjout.Index;
end;
end;

end. 


Simon
0