Dopisywanie do elementu stalej wartosci

2013-11-15 23:05
0

Nie wiem jak w sumie nazwać ten temat. Chodzi mi o coś takiego,że np mam wskaźnik "Temp",
i on moze odwoływać się do

Temp^.A, Temp^.B, Temp^.C

. I moje pytanie czy można jakoś tak zrobić, że np. Zmienna='C' i Temp^.Zmienna ? Albo cos w tym stylu?

edytowany 1x, ostatnio: andrzejbodziuzbychujarek, 2013-11-15 23:06

Pozostało 580 znaków

2013-11-15 23:22
0

Można, tablica się nazywa:

Temp^.ABC[0], Temp^.ABC[1], Temp^.ABC[2];
Zmeinna:=2;
Temp^.ABC[Zmeinna]

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2013-11-15 23:22

Pozostało 580 znaków

2013-11-15 23:38
0

a da się bez tablicy, zalezy mi zeby bylo bez...?

edytowany 1x, ostatnio: andrzejbodziuzbychujarek, 2013-11-16 00:05

Pozostało 580 znaków

2013-11-17 21:55
0

@andrzejbodziuzbychujarek - może tak wyjaśnij dokładnie co masz i co chcesz zrobić;

andrzejbodziuzbychujarek napisał(a)

I moje pytanie czy można jakoś tak zrobić, że np. Zmienna='C' i Temp^.Zmienna ? Albo cos w tym stylu?

Bez urazy, ale z Twojego bełkotu niewiele można wywnioskować... Kodu pokaż więcej, a zawsze znajdzie się jakieś rozwiązanie (chyba że oczekujesz jakiegoś dziwactwa sprzecznego ze składnią).


Pozostało 580 znaków

2013-11-17 22:02
0

No bo się uczę wszystkiego w ekspresowym tempie...;/ Nie mam czasu by wszystko dokładnie ogarniać, tego języka uczę sie tylko do zaliczenia pozniej nie bede mial juz z nim stycznosci.
Nie wiem w sumie jak napisać o co mi chodzi:
Mam zrobiony record, oraz wskaznik na ten rekord. I np do jakiegoś pola odwołuję się:

Temp^.Imie 

i chodzi mi czy moge to przy Temp^ . jakos zapisac z drugą zmienna, a ta druga zmienna ma zawierać string 'Imie', czyli np:

Temp^ .Zmienna  czy Temp^ .'Zmienna'

.. czy wgl jest to możliwe.

edytowany 2x, ostatnio: andrzejbodziuzbychujarek, 2013-11-17 22:03

Pozostało 580 znaków

2013-11-17 22:07

Mam zrobiony record, oraz wskaznik na ten rekord.

Pokaż ich kod.

Już rozumiem, nie możesz czegoś takiego zrobić - musisz znać nazwę pola, nie możesz jej podstawić ze zmiennej łańcuchowej.


edytowany 1x, ostatnio: furious programming, 2013-11-17 22:08
no szkoda, ale dzieki:) - andrzejbodziuzbychujarek 2013-11-17 22:19
Nie ma takiej możliwości, bo jaki niby kod miałby wygenerować kompilator? Nie wiadomo by było do jakiego pola się odwoływać (jaki adres w pamięci) i czy w ogóle takie pole istnieje, więc opcji nie ma; - furious programming 2013-11-17 22:23

Pozostało 580 znaków

2013-11-17 23:19
0

Jeżeli zmienna jest właściwością typu published to da się z nazwy.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
W strukturze...? BTW: pochwal się przykładem dla klas :) - furious programming 2013-11-17 23:24
W strukturze oczywiście nie, ale może to urządza pytającego. Jeżeli tak i spyta o to to się naskrobie przykład. - _13th_Dragon 2013-11-17 23:48

Pozostało 580 znaków

2013-11-18 00:03
1

Heh, sprawdziłem bo myślałem, że znasz jakąś magiczną sztuczkę, ale raczej nie ma możliwości tego dokonać dla struktur (chyba że magia ze wskaźnikami - kiedyś coś w tym stylu pokazywał @Patryk27 o ile dobrze pamiętam);

Dla klas oczywiście że można, ale nie tak jak chciał pytacz; Za pomocą funkcji GetPropInfo można pobrać wskaźnik do struktury z informacjami o polu danej właściwości i odpowiednią funkcją ustawić jej nową wartość, ale właściwość tak jak wspomniałeś - musi być w sekcji Published;

Przykład dla właściwości łańcuchowej:

uses
  TypInfo;

type
  TFoo = class(TObject)
  private
    FName: AnsiString;
  public
    constructor Create(AName: AnsiString);
  published
    property Name: AnsiString read FName write FName;
  end;

  constructor TFoo.Create(AName: AnsiString);
  begin
    inherited Create();
    FName := AName;
  end;

var
  fooItem: TFoo;
  piName: PPropInfo;
begin
  fooItem := TFoo.Create('_13th_Dragon');
  try
    WriteLn('Name: ', fooItem.Name);
    piName := GetPropInfo(fooItem.ClassInfo, 'Name');

    if Assigned(piName) then
      SetStrProp(fooItem, piName, 'Furious Programming');

    WriteLn('Name: ', fooItem.Name);
  finally
    fooItem.Free();
    ReadLn;
  end;
end.

na wyjściu dostaniemy:

Name: _13th_Dragon
Name: Furious Programming

Jest więcej funkcji pozwalających na ustalanie nowych wartości dla właściwości (a raczej pól tych właściwości):

i jeszcze kilka innych, ale nie chce mi się ich wszystkich wymieniać.


edytowany 3x, ostatnio: furious programming, 2013-11-18 00:08
Pokaż pozostałe 6 komentarzy
Ja bym zrobił inaczej jedna tablica i kilka właściwości z index 0, index 1, index 2 - _13th_Dragon 2013-11-18 00:42
Można wykorzystać GetPropInfo wewnętrznie i odwoływać się w nawiasach klamrowych po ich nazwie, ale tylko jeśli są tego samego typu: http://ideone.com/nps7kr - bo jak inaczej zadeklarować właściwość niewiadomego typu (Pointer nie wchodzi w grę)? - furious programming 2013-11-18 00:46
No właśnie o tym mówiłem, oczywiście dla niewiadomego typu nie da rady, aczkolwiek można zrobić dla kilku różnych: fooItem['StrProp1']:='Str'; fooItem.AsInteger['IntProp1']:=12; - _13th_Dragon 2013-11-18 00:52
Jako właściwość nie da rady (przynajmniej ja takiego rozwiązania nie znam), ale jako metoda tak - argument bez typu + RTTI + GetPropInfo i Set*Prop - trochę zabawy i da się i w tę stronę ;) - furious programming 2013-11-18 00:56
Dodatkowa klasa z domyślnym indeksem. - _13th_Dragon 2013-11-18 01:22

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0