Avatar billede hankster Nybegynder
12. oktober 2001 - 14:03 Der er 15 kommentarer og
1 løsning

Find mit objekts attributter

Jeg har lavet et objekt som normalt:

Type
  MitObjekt = Class
  private
    navn: String;
  .
  .

Jeg skal et andet sted i programmet finde klassens attributnavne (dvs. i dette tilfælde \"navn\")

hvordan gør jeg det?
Avatar billede borrisholt Novice
12. oktober 2001 - 14:06 #1
prøv den her :

procedure ObjectInspector( Obj : TObject;  Items : TStrings );

var
  n        : Integer;
  PropList : TPropList;
begin
  n := 0;
  GetPropList( Obj.ClassInfo, tkProperties + [ tkMethod ],  @PropList );
  while( (Nil <> PropList[ n ]) and (n < High(PropList)) ) do
  begin
    Items.Add( PropList[ n ].Name + \': \' + PropList[ n ].PropType^.Name );
    Inc( n );
  end;
end;


Jens B
Avatar billede hankster Nybegynder
12. oktober 2001 - 14:06 #2
altså attributnavnene på et createt objekt af typen MitObjekt

det er navnet på attributten, ikke hvad den indeholder.
Avatar billede martinlind Nybegynder
12. oktober 2001 - 14:07 #3
Du laver en property der er min public, også skriver du :

VAR
  Obj : MitObject;

begin
  ShowMessage(Obj.Navn);
end;
Avatar billede hankster Nybegynder
12. oktober 2001 - 14:33 #4
borrisholt..

Den vil ikke godtage TPropList.. jeg kan heller ikke finde noget om det under hjælp.

Er det noget med uses?
Avatar billede martinlind Nybegynder
12. oktober 2001 - 14:40 #5
TypInfo i uses
Avatar billede hankster Nybegynder
12. oktober 2001 - 15:06 #6
Den brækker ned i sætningen:

GetPropList( Obj.ClassInfo, tkProperties + [ tkMethod ],  @PropList );

Er der fejl her?

er der andre måder at gøre det på?
Avatar billede stoney Nybegynder
14. oktober 2001 - 10:14 #7
Drop en listbox og lad dit objects onclick pege på listbox1.click så får du listet dine attributter.
Det virker i hvertfald med en  label og en checkbox som jeg lige tjekkede.

procedure TForm1.ListBox1Click(Sender: TObject);

var
  Count, i : integer;
  PropList : PPropList;
begin
  ListBox1.Clear;
  Count := GetPropList(Sender.ClassInfo, tkProperties, nil);
  GetMem(PropList, Count*sizeof(PPropInfo));
  try
    GetPropList(Sender.ClassInfo, tkProperties, PropList);
    for i := 0 to Count - 1 do
      ListBox1.Items.Add(PropList[i].Name);
  finally
    FreeMem(PropList, Count*sizeof(PPropInfo));

  end;
end;


Stoney
Avatar billede hankster Nybegynder
14. oktober 2001 - 12:52 #8
Stoney.. jeg laver lige et eksempel udfra din kode:
Jeg har et klasseerklæring:
  TKunde = Class
  Private
    Navn: String;
  end;

Jeg vil gerne udskrive attributnavnet \"Navn\", og jeg ved ikke hvilket objekt jeg får udleveret.

procedure TForm1.Button1Click(Sender: TObject);
var
  Count, i : integer;
  PropList : PPropList;
begin
  ListBox1.Clear;
  Count := GetPropList(Kunde.ClassInfo, tkProperties, nil); /////Her går det galt
  GetMem(PropList, Count*sizeof(PPropInfo));
  try
    GetPropList(Kunde.ClassInfo, tkProperties, PropList);
    for i := 0 to Count - 1 do
      ListBox1.Items.Add(PropList[i].Name);
  finally
    FreeMem(PropList, Count*sizeof(PPropInfo));
  end;
end;

Den vil altså ikke
Avatar billede martinlind Nybegynder
14. oktober 2001 - 17:47 #9
Hankster >> Hvis du vil lave kode der kan bruge RTTI til at finde dine property, SKAL de være published ellers finder du dem ikke. Så hvis du bruger samme kode og flytter navn ned i Published så vil det virke

/Martin
Avatar billede hankster Nybegynder
15. oktober 2001 - 11:35 #10
At flytte attributterne ned under Public er ikke en acceptabel løsning, da det ødelægger indkapslingen.

Er der evt. en anden måde at gøre det på?
Avatar billede hankster Nybegynder
15. oktober 2001 - 11:37 #11
Desuden ved jeg ikke hvad objekter jeg får, og jeg skal ikke selv kode dem, så det er slet ikke muligt at ændre på dem
Avatar billede martinlind Nybegynder
15. oktober 2001 - 11:39 #12
Som jeg skriver er det Published de skal ned under hvis du vil bruge RTTI, som det eks. du har fået gør. Bede om at få et COM object, så kan du bruge std. COM funktioner, og evt. lade delphi pakke det ind i en comp. ( import typelib )
Avatar billede hankster Nybegynder
15. oktober 2001 - 11:53 #13
Martinlind >> Jeg lytter, men er ikke helt med...
ingen af de forrige eksempler har virket..

Jeg ved ikke hvad du mener med at flytte navn ned i published.. kan du lave et lille kodet eksempel?
Avatar billede martinlind Nybegynder
15. oktober 2001 - 11:58 #14
Type
  MitObjekt = Class
private
    fnavn: String;
published
  property Navn : string read FNavn write FNavn;
end;

Sådan, du kan læse mere om Published i online hjælpen
Avatar billede hankster Nybegynder
15. oktober 2001 - 12:07 #15
Det du mener er at jeg skal ændre i objektet så det står således?

Det kan jeg ikke.. Jeg får bare objekterne udleveret, så de ser således ud:
Type
  MitObjekt = Class
  Private
    AttributNavn: Attributtype;
  end;

og kan ikke ændre i dem..

Jeg skal bruge AttributNavnene.
Avatar billede hankster Nybegynder
17. oktober 2001 - 17:11 #16
Ingen svar var brugbare.. men tak for indsatsen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester