Operateur "is" pour record

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 - 14 nov. 2006 à 12:21
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 15 nov. 2006 à 21:45
salut delphifriens, une question toute bete, est ce qu'il existe un equivalent de l'operateur is des classes pour les records.

on peut faire
if MonObjet is TObject

mais comment faire
if MonRecord is TMyRecord
ou
if PMonRecord is ^TMyRecord

je suis sur que delphiprog va me dire que je dois connaitre le type de mes records , et je les connai, c'est juste pour blinder un petit peu plus ma liberation memoire.

merci.

6 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
14 nov. 2006 à 22:12
un pointeur sur record s'effectue de la sorte :

type
  pTest = ^TTest;
  TTest = record
    A,B,C,D : integer;
  end;

procedure Test(const pT : pTest; const aA, aB, aC, aD : integer);
begin
  if pT = nil then exit;
  pT^.A := aA;
  pT^.B := aB;
  pT^.C := aC;
  pT^.D := aD;
end;

function TestToStr(const pT : pTest) : string;
begin
  if pT = nil then Exit;
  result := format('%d, %d, %d, %d',[pT^.A,pT^.B,pT^.C,pT^.D]);
end;

procedure AddTest(const iA,iB, Ret : pTest);
begin
  Ret^.A := iA^.A + iB^.D;
  Ret^.B := iA^.B + iB^.C;
  Ret^.C := iA^.C + iB^.B;
  Ret^.D := iA^.D + iB^.A;
end;

var
   A1,A2,A3 : pTest;

procedure TForm1.FormCreate(Sender: TObject);
begin
  New(A1);
  New(A2);
  New(A3);

  Test(A1,1000,2000,3000,4000);
  Test(A2,5000,6000,7000,8000);
  AddTest(A1,A2,A3);

  label1.Caption := TestToStr(A1);
  label2.Caption := TestToStr(A2);
  label3.Caption := TestToStr(A3);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Dispose(A1);
  Dispose(A2);
  Dispose(A3);
end;

<hr size="2" width="100%" />Croc (click me)
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
15 nov. 2006 à 01:02
Salut,

je ne crois pas que c'est ce qu'il demandait

il voulais savoir si l'on pouvait utiliser l'opérateur " IS " avec les Record
Ex.  If (A1 IS TTest) Then ...

 
@+
Cirec

<hr size="2" />
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
15 nov. 2006 à 04:26
ben on peu pas ... a moins d'enregistrer le nouveau type avec la classe TCustumVariant ou un truc du genre ...
mais c'est relou et inutile.

<hr size="2" width="100%" />Croc (click me)
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
15 nov. 2006 à 08:31
Je voix pas de cas ou un opérateur "is" m'aurait été utile pour une var de type record. vu que c'est des var et que les mécanisme de la POO ne s'applique aux records...... as-tu un exemple? C'est dans quel but?

des idées de pistes pour ce type de problème:

si t'as bcp de type de record différent que tu voudrais différencier, tu peux tous leur donné un champ avec un nom du genre RecordType dans le quelle tu sauve un integer que tu utilise comme identifiant.

C'est lourd (32 bits pour rien par record), moche et dangereux (car modifiable), mais ça marche.

Si ils ont des taille différentes, et si t'as peu de type différent, une autre solution serrait de comparer leur taille avec sizeof (j'ai comme un doute, je sais plus si cela marche aussi pour les var, je crois que oui, mais vérifie).

Sinon, peut-être que de compiler avec des pointeur typé te suffirait?..?..
0

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

Posez votre question
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
15 nov. 2006 à 09:10
merci des infos,
en fait je manipule un paquet de TList, et elles ne contiennent normalement qu'un seul type de record chacune.
le bloc en question est :

for i := 0 to MaTList.count -1 do
begin
    if MaTList[i] is PTMonRecord then //je veux tester pour ne pas aller liberer un truc qui le devrait pas
       PTMonRecord(MaTList[i])^.ChampObjet.Free;
end;

donc, si vous ne voyez pas de moyen de resoudre mon probleme, je vais tout simplement virer le test, etant donné qu'il n'y a aucune raison que le type ne soit pas celui que j'attend.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
15 nov. 2006 à 21:45
Voila la conclusion que j'avais envie d'entendre .
En effet, dans un langage fortement typé comme le Pascal, on doit pouvoir se dispenser de tester trop souvent le type de données que l'on emploie.


Bonne continuation.

May Delphi be with you !


<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.afipa.net
0
Rejoignez-nous