Intervertir deux lignes d'un ListView [Résolu]

Signaler
Messages postés
129
Date d'inscription
mercredi 4 février 2004
Statut
Membre
Dernière intervention
25 juillet 2012
-
cs_cantador
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
-
Bonjour le forum,


J'ai un petit souci avec le code suivant :


procedure TForm2.Button1Click(Sender: TObject);

var

  ItemTampon: TListItem;


begin

  ItemTampon := ListView1.Items[1];

  ListView1.Items[1] := ListView1.Items[0];

  ListView1.Items[0] := ItemTampon;

end;


Le problème avec ce code c'est que j'ai deux fois la même ligne dans le ListView après l'inversion.


Dès que la deuxième instruction est passée, "ItemTampon" prend aussi la
nouvelle valeur. Ce qui me fait dire que c'est c'est n'est pas une
affectation de valeur mais de référence, j'ai l'impression que
"ItemTampon" pointe vers la valeur de "ListView1.Items[1]".


Quelqu'un pourrait-il me venir en aide SVP ? Je n'arrive pas à
retrouver le message du forum qui expliquait le mécanisme pour copier
en valeur et non par référence.


Je vous remercie par avance et bonne journée.

Que la force soit avec vous !

4 réponses

Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
Salut,

essaye comme ça:

var aItem: TListItem;
begin
  aItem := TListItem.Create(ListView1.Items);
  try
    with ListView1 do
    begin
      aItem.Assign(Items[0]);
      Items.BeginUpdate;
      Items[0] := Items[1];
      Items[1] := aItem;
      Items.EndUpdate;
    end;
  finally
    aItem.Free;
  end;
end;

 
@+
Cirec

<hr siz="" />
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
bonsoir,
ça nous dit pas ce que tu veux faire !

cantador
Messages postés
129
Date d'inscription
mercredi 4 février 2004
Statut
Membre
Dernière intervention
25 juillet 2012
1
Je suis désolé si je n'ai pas été assez clair mais je crois que cirec a compris ce que je voulais faire.

Imaginons que j'ai une simple ListView avec deux colonnes et trois lignes, je veux pouvoir intervertir deux lignes en cliquant sur un bouton par exemple. Ceci est un problème simpliste mais il me permettras de régler mon problème plus complexe.

Cirec ton code fonctionne parfaitement. De mon côté j'avais essayé avec le "Create" mais comme je ne faisait pas le "Assign" après ça ne marchait pas.

Quelqu'un pourrait-il m'expliquer pourquoi même après un "Create" l'instruction "ItemTampon := ListView1.Items[1];" ne fonctionne pas comme une affectation de variable traditionnelle et qu'il faut impérativement faire un "Assign" ? En effet, si je change "ListView1.Items[1]" à l'instruction suivante et bien "ItemTampon" change aussi alors que si je prend l'exemple suivant ça fonctionne :

var
  a, b: Integer;

begin
  b := 5;
  a := b;
  b := 7;
  ShowMessage(IntToStr(a)); // Ici a vaut bien 5 et non pas 7.
end;

Certes mon problème est résolu mais je souhaite, ne serais-ce que pour progresser, avoir une réponse à cette dernière question ou du moins une piste pour que je puisse trouver le pourquoi du comment.

En attendant, un grand merci à tous les deux pour votre aide et bonne continuation à tous..

A plus.

Que la force soit avec vous !
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
Je suis désolé si je n'ai pas été assez clair...



Non, non en fait, le titre est réservé au thème et la question doit-être formulée dans le corps du message et du coup j'en ai oublié le titre..
Mais comme cirec, un p'ti gars tout frêle, menu, pauvre et désoeuvré a vu de la lumière allumée il est entré et a pris une bière (lol)

Et il a un gros défaut, il trouve en général les bonne réponses et son code fonctionne nickel chrome.

Tu vas bien cirec ?

cantador