Création d'un struct

Résolu
cyberleon Messages postés 5 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 8 février 2006 - 21 déc. 2005 à 17:54
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 22 déc. 2005 à 18:26
Bonjours tout le monde,
voila j'ai une question. es-t-il possible de créer une structure chez delphi comme dans le C .
exemple:
toto.nom
toto.premon

en vous remerciant

9 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 déc. 2005 à 18:07
oui.comme ceci:



type

MonType = record

nom: string;

prenom: string;

end;
3
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
22 déc. 2005 à 08:44
oui comme dit CptPingu :

<HR>

type
ToTo= record
nom: string;
prenom: string[20];

end;
<HR>

J'ai juste modifié le string car il faut lui donner une taille exacte (j'ai mis "20" mais on met la taille qu'on veut si on veut plus long ou plus court) ...ou alors on peut mettre un shorstring mais ça paraît excessif juste pour un prénom

DrJerome
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
22 déc. 2005 à 08:45
j'ai oublié de corriger, mais pour "nom" c'est pareil il faut donner la taille exacte du string

DrJerome
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
22 déc. 2005 à 10:01
salut

--> Drjerome la declaration de longueur pour un string dans un
record n'est pas obligatoire dans ce cas la variable string est
un pointeur sur un variable dynamique (même si c'est transparent pour
l'utilisateur)

@+

jlen
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
22 déc. 2005 à 12:09
Pour mettre tout le monde d'accord : tant que vous travaillez en mémoire, vous n'êtes pas obligés de spécifier la taille des chaines dans la structure.
En revanche, si vous devez utiliser un stockage sur disque, là ça devient obligatoire surtout au moment des opérations de lecture...

<hr color="#008000">Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
22 déc. 2005 à 12:51
--> Delphiprog : Si tu enregistres par l'intermédiaire d'un FileStream tu n'es pas obligé de spécifier la taille du string ce qui est bien plus pratique pour écrire des String de toutes tailles.
Conclusion obligatoire pas obligatoire tout dépend de la méthode utilisé. Donc on a tous raison



@+
Cirec
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
22 déc. 2005 à 13:28
je vous donne un petit exemple de ce que j'avance :


procedure TForm1
.WriteToStreamClick
(Sender
: TObject
);
Var FS
: TFileStream
;
Taille
: byte
;
Str
:
String;
begin
Try
FS
:= TFileStream
.Create
('Teste.dat', fmCreate
or fmOpenReadWrite
);
Taille
: = Length
(Edit1
.Text
); // on récupere sa taille
FS
.Write
(Taille
, SizeOf
(Byte
)); // on l'écris
Str
:= Edit1
.Text
; // on recupere le texte
FS
.Write
(Pointer
(Str
)^,Taille
); // on l'écris
finally
FS
.Free; // comme toujours on libère la mémoire

End ;
Edit1
.Clear
; // on efface le contenu de l'Edit
end;


procedure TForm1
.ReadFromStreamClick
(Sender
: TObject
);
Var FS
: TFileStream
;
Taille : byte
;
Str
:
String;
begin
Try
FS
: = TFileStream
.Create
('Teste.dat', fmOpenReadWrite
);
FS
.Read
(Taille
, SizeOf
(Byte
)); // on commence par lire la taille
SetLength
(Str
, Taille
); // on l'affecte à Str
FS
.Read
(Pointer
(Str
)^,Taille
); // on lis le contenu
finally
FS
.Free; // comme toujours on libère la mémoire

End;
Edit1
.Text
:= Str
; // et on affecte le Str à Edit
end;

Voilà comme ça vous avez la théorie et la pratique



@+
Cirec
0
cyberleon Messages postés 5 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 8 février 2006
22 déc. 2005 à 18:15
mercie bien pour toutes ces reponses.j'ai essayé et ca marche.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
22 déc. 2005 à 18:26
Ok avec toi Cirec. Mais quid si tu veux enregistrer un ou plusieurs records ?

Exemple de code

Soit un type enregistrement défini ainsi
type
  TMyRecord =  record
    Firstname, LastName :  string [30];
    BirthDay : TDateTime;
    Age: integer;
  end;

Soit le code qui l'exploite pour la partie enregistrement et lecture sur disque :

const
  FileName  = 'records.Dat';

{Initialise les valeurs d'un enregistrement avec le contenu
des contr&#244;les de saisie}
procedure TForm1.SetRecordValues(var ARecord: TMyRecord);
begin
with ARecord do
begin
    FirstName :=  edFirstName.Text;
    LastName := edLastName.Text;
    TryStrToDate(edBirthDay.Text, BirthDay);
    Age := StrToIntDef(edAge.Text, 0);
   end ;
end;

{Remplit les contr&#244;les de saisie avec les valeurs
d'un enregistrement}
procedure TForm1.GetRecordValues(const ARecord: TMyRecord);
begin
with ARecord do
begin
    edFirstName.Text : = FirstName;
    edLastName.Text :=  LastName;
    try
      edBirthDay.Text := DateToStr(BirthDay);
    except
      edBirthDay.Text := 'Date incorrecte';
     end ;
    edAge.Text : = IntToStr(Age);
  end;
end;

procedure TForm1.btnWriteToStreamClick(Sender: TObject);
var
  Stream: TFileStream;
  MyRecord: TMyRecord;
begin
  SetRecordValues(MyRecord);

  Stream :=  TFileStream.Create(FileName, fmCreate  or  fmShareDenyNone);
  try
    Stream.Write(MyRecord, SizeOf(MyRecord));
  finally
    Stream.Free;
  end; {try..finally}

end;

{Efface le contenu de tous les contr&#244;les d'&#233;dition}
procedure TForm1.ClearEdits;
var
  i: integer;
begin
for i : = 0to ComponentCount - 1do
if Components[i] is TEdit then
      TEdit(Components[i]).Clear;
end;

procedure TForm1.btnLoadFromStreamClick(Sender: TObject);
var
  Stream: TFileStream;
  MyRecord: TMyRecord;
begin
  ClearEdits;
  
  Stream :=  TFileStream.Create(FileName, fmOpenRead  or  fmShareDenyNone);
  try
    Stream.Read(MyRecord, SizeOf(MyRecord));
  finally
    Stream.Free;
  end; {try..Finally}

  GetRecordValues(MyRecord);
end;

Attention : ce code n'est valable que pour l'enregistrement d'un seul record dans le fichier.

Bon, ben je pense qu'on a fait le tour de la question maintenant.

<HR color =#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
Rejoignez-nous