Intervertir deux lignes d'un ListView

Résolu
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 - 16 oct. 2008 à 09:21
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 17 oct. 2008 à 11:19
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

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
16 oct. 2008 à 20:34
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="" />
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
16 oct. 2008 à 18:52
bonsoir,
ça nous dit pas ce que tu veux faire !

cantador
0
informatixo Messages postés 129 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 25 juillet 2012 1
16 oct. 2008 à 23:17
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 !
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
17 oct. 2008 à 11:19
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
0
Rejoignez-nous