Listview : items et subitems

sp40 Messages postés 1276 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 1276 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 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
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 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
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 13
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 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
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
Rejoignez-nous