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)
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
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;
// 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.