[Delphi] recordy

0

Mam cos takiego:

type
  RecImage1 = record
    Left, Top : Integer;
   end;

Co zrobić, żeby jak zmienie Left lub Top recordu, odpowiednio zmieniał się Left i Top Image1??

Ps; Ale jeżeli zmienię Top i Left Image1, to record nie musi się zmieniać ale może.
Jakby co...

PPS: Wiem że można

 Image1.Left := RecImage1.Left;
 Image1.top := RecImage1.Top

Ale chciałbym to zrobić bardziej, 'profesjoanlnie'

0

Po co używasz do tego rekordu ?
Nie wystarczy zwykła zmienna ?

0

Ok. Niech będzie z tablicami.
Ustaw timer na milisekundę, a w tymże timerze:

 Image1.Left := RecImage1.Left;
 Image1.top := RecImage1.Top
0

Patryk27: Timer to takie sobie rozwiązanie, bo faktycznie jego
minimalny Interval może wynosić 100 milisekund, jak już to w
celu wykonywania czegoś w tle skorzystal bym raczej z wątku.

0
Patryk27 napisał(a)

Ok. Niech będzie z tablicami.
Ustaw timer na milisekundę, a w tymże timerze:

 Image1.Left := RecImage1.Left;
 Image1.top := RecImage1.Top

Boże drogi czy w serwisie nie ma możliwości oznaczania pomysłów jako nad wyraz głupi??? Albo chociaż jakiś future, który by pozwalał porazić takowego user prądem... Cokolwiek.

@TomRiddle to co chcesz osiągnąć jest, hm jakby to delikatnie ująć - głupie. Tak się nie robi, rekordy nie są do tego. Po co dublować wartości? Po co dodatkowa zmienne - przecież masz Image1.Left - dlaczego nie podstawiasz wartości tutaj od razu?

Można rozwiązać Twój problem na dwa sposoby (znaczy ja widzę dwa sposoby), oba mają swoje ograniczenia. Pierwszy to wskaźniki - zamiast Left, Top: Integer; daj Left, Top: PInteger; i przypisz do nich adres zmiennych z Image1 RecImage1.Left := @Image1.Left; a potem jak zmieniasz RecImage1.Left^ := 100; to tak naprawdę zmieniasz Image1.Left. Jego ograniczeniem/wadą jest to, że jak zrobisz RecImage1 := RecImage2 to się wszytko posypie. Drugi to klasa zamiast rekordu

type
  TRecImage = class
  private
    FLeft: Integer;
    procedure SetLeft(const Value: Integer);
  public
    property Left: Integer read FLeft write SetLeft;
  end;

procedure TRecImage.SetLeft(const Value: Integer);
begin
  FLeft := Value;
  Image1.Left := Value;
end;

wadą jest to, że jest to klasa więc najpierw trzeba stworzyć jej obiekt a później go zniszczyć. Dodatkowo trzeba jakoś pożenić settery z obiektami, którym mają ustawiać właściwości. No i na koniec takie coś też nie zadziała

var
  a, b: TRecImage;
begin
  a.Left := 10;
  b := a;
end;
0

@olesio
@Patryk27

Nie o to mi chodziło, RecImage1 ma inne właściwości których nie ma Image1. W tym jedną właściwość z nowym typem.
Już wpadłem na ten pomysł, i na końcu procedury która zmienia wartości Left i Top, dodaje ten kodzik

Image1.Left := RecImage1.Left;
Image1.Top := RecImage1.Top;

Ale przecież lepiej napisać:

var
 X: Integer = 1;

niż

var
 X: Integer;
begin
 X := 1;
end;

Myślałem że podobnie jest z recordami.

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