Page 1 sur 1

une structure dans une liste

Publié : mar. 01/mai/2007 14:49
par lepiaf31
salut je n'arrive pas a mettre une structure dans une liste:

Code : Tout sélectionner

Structure Fichier
  Name.s
  Type.c
  Size.f
EndStructure

a.Fichier
a\Name = "test"
a\Type = 1
a\Size = 19

NewList Liste.Fichier()

AddElement(Liste())
Liste() = a
j'ai une erreure: "can't assign a value to a structure"

Publié : mar. 01/mai/2007 15:20
par minirop
il faut faire membres à membres :

Code : Tout sélectionner

Structure Fichier
  Name.s
  Type.c
  Size.f
EndStructure

NewList Liste.Fichier()

AddElement(Liste())
Liste()\Name = "test"
Liste()\Type = 1
Liste()\Size = 19

Publié : mar. 01/mai/2007 15:38
par Gratteur
Ou pour copier a rapidement dans l'élément courant de la liste (ça peut etre chiant de tout faire membre à membre) :

Code : Tout sélectionner

Structure Fichier
  Name.s
  Type.c
  Size.f
EndStructure

a.Fichier
a\Name = "test"
a\Type = 1
a\Size = 19

NewList Liste.Fichier()

AddElement(Liste())
CopyMemory(@a, Liste(), SizeOf(Fichier))

Debug Liste()\Name
Debug Liste()\Type
Debug Liste()\Size

Publié : mar. 01/mai/2007 17:57
par Guimauve
Gratteur a écrit :Ou pour copier a rapidement dans l'élément courant de la liste (ça peut etre chiant de tout faire membre à membre) :

Code : Tout sélectionner

Structure Fichier
  Name.s
  Type.c
  Size.f
EndStructure

a.Fichier
a\Name = "test"
a\Type = 1
a\Size = 19

NewList Liste.Fichier()

AddElement(Liste())
CopyMemory(@a, Liste(), SizeOf(Fichier))

Debug Liste()\Name
Debug Liste()\Type
Debug Liste()\Size
Étant donnée la chaîne de caractère (champs Name) un CopyMemory() va simplement copier le pointeur de la chaîne et non le data de la chaîne.

J'ai pas de code de démonstration mais je sais par expérience que les modifications faites dans la variable 'a' aura le même effet sur l'élément courant de la 'Liste()' au moment de l'appel de la commande CopyMemory(). Je ne suis pas sûr mais si la variable a est local dans une procédure je pense que le champ Name dans la liste deviendra null.

Le code de minirop est le meilleur moyen pour initialiser l'élément d'une liste chaînée.

A+
Guimauve

Publié : mar. 01/mai/2007 20:35
par Jacobus
Exemple pour passer le contenu de plusieurs strings dans une listicon en les classant dans l'ordre en passant par une structure. (extrait d'un de mes codes sans détails)

Code : Tout sélectionner

;-structure htaccess
Structure ht_access
  NomAcc.s            
  AdresseAcc.s 
  TelAcc.s
  EmailAcc.s
  RepAcc.s
  FileAcc.s 
  IdAcc.s 
  PassAcc.s
EndStructure 
Global NewList ItemsAc.ht_access()

;-clearlist
Procedure.b item_clearAc() 
  ClearList(ItemsAc()) 
  ProcedureReturn 1 
EndProcedure

Procedure.b AddItem_Access()
  If AddElement(ItemsAc()) 
    ItemsAc()\NomAcc    = GetGadgetText(#String_NomAcc)  
    ItemsAc()\TelAcc    = GetGadgetText(#String_TelAcc)
    ItemsAc()\AdresseAcc= GetGadgetText(#String_AdresseAcc)
    ItemsAc()\EmailAcc  = GetGadgetText(#String_EmailAcc)
    ItemsAc()\RepAcc    = GetGadgetText(#String_RepAcc)
    ItemsAc()\FileAcc   = GetGadgetText(#String_FileAcc)
    ItemsAc()\IdAcc     = GetGadgetText(#String_IdAcc) 
    ItemsAc()\PassAcc   = GetGadgetText(#String_PassAcc)
    AddGadgetItem(#ListIcon_Acc, -1,ItemsAc()\NomAcc +Chr(10)+ ItemsAc()\TelAcc +Chr(10)+ItemsAc()\AdresseAcc +Chr(10)+ ItemsAc()\EmailAcc +Chr(10)+ ItemsAc()\RepAcc +Chr(10)+ItemsAc()\FileAcc+Chr(10)+ItemsAc()\IdAcc+Chr(10)+ItemsAc()\PassAcc) 
  EndIf 
  ProcedureReturn 1  
EndProcedure