[Delphi] recordy

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 23 godziny
  • Lokalizacja:Koszalin
  • Postów:10094
0

Mam cos takiego:

Kopiuj
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

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

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

edytowany 2x, ostatnio: Riddle
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

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


Zobacz pozostały 1 komentarz
Patryk27
Czy ja wiem...Chyba lepiej 9 zmiennych, a przecież na jedno wychodzi.
Riddle
to po co w ogóle są recordy, skoro można je zastąpić zmiennymi?
Patryk27
Recordy można zapisywać łatwiej do pliku, w porównaniu do zmiennych. I tylko po to są (chyba ?).
Riddle
Przeczytałem cały artykuł i nie ma tam słowa na ten temat.
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

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

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

olesio
  • Rejestracja:około 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
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.


Pozdrawiam.
Misiekd
olesio nie podsycaj jeszcze bardziej ognia głupich pomysłów - gaś je!!! Potem się wykluwają różne dziwne twory, które zabijają jak się tylko na nie spojrzy...
olesio
Misiekd: szczerze pisząć nie wczytałem się specjalnie w treść wątku, zobaczyłem tylko że polecany jest Timer z niskim Intervalem, dlatego napisałem to co widać, a tak jak teraz widzę nie miewałem takich problemow, jak tu TomRiddle opisał, wskaźniki też używam zwykle rzadko.
Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 13 lat
  • Postów:7923
0
Patryk27 napisał(a)

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

Kopiuj
 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

Kopiuj
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

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

- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
Patryk27
Już dzisiaj oberwałem prądem...I chyba wystarczy ;)
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 23 godziny
  • Lokalizacja:Koszalin
  • Postów:10094
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

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

Ale przecież lepiej napisać:

Kopiuj
var
 X: Integer = 1;

niż

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

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

edytowany 1x, ostatnio: Riddle

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.