Sign in Join
Wiki copytemporary

Record/pl: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Record/pl

OldNewLine
1+`Rekord` to wysoce ustrukturyzowany [[Type|typ]] danych w [[Pascal|Pascalu]]. Jest on szeroko stosowany w Pascalu do logicznego grupowania elementów danych.
2+
3+Chociaż proste struktury danych, takie jak [[Array|arrays]] lub zbiory składają się z elementów tego samego typu, rekord może składać się z wielu elementów różnych typów i mogą mieć ogromną złożoność. Każda oddzielna część rekordu jest określana jako pole.
4+
5+Słowo `record` jest [[Reserved word|słowem zastrzeżonym]].
6+
7+## Deklaracja
8+
9+### Struktura stała
10+
11+``` pascal
12+type
13+ TMember = record
14+ firstname, surname : string;
15+ address: array [1..3] of string;
16+ phone: string;
17+ birthdate: TDateTime;
18+ paidCurrentSubscription: boolean
19+ end;
20+```
21+
22+### Struktura zmienna
23+
24+Możliwe są też bardziej złożone konstrukcje, np.:
25+
26+``` pascal
27+type
28+ TMaritalState = (unmarried, married, widowed, divorced);
29+ TPerson = record
30+ // CZĘŚĆ STAŁA
31+ // oczywiście rekordy mogą być zagnieżdżone
32+ name: record
33+ first, middle, last: string;
34+ end;
35+ sex: (male, female);
36+ // Data urodzenia
37+ dob: TDateTime;
38+ // CZĘŚĆ ZMIENNA
39+ case maritalState: TMaritalState of
40+ unmarried: ( );
41+ married, widowed: (marriageDate: TDateTime);
42+ divorced: (marriageDateDivorced, divorceDate: TDateTime;
43+ isFirstDivorce: boolean)
44+ end;
45+```
46+
47+Zauważ, że pola w części zmiennej muszą być ujęte w nawiasy. Nie możesz użyć tego samego identyfikatora wiele razy, więc nieco inna nazwa musi być użyta dla `marriageDate` w przypadku *divorced*.
48+
49+Część zmienna współdzieli tę samą pamięć. Zatem `marriageDate` i `marriageDateDivorced` będą miały tę samą wartość niezależnie od `maritalState`. To zachowanie jest szczególnie praktyczne, co pokazuje poniższy przykład:
50+
51+``` pascal
52+type
53+ TSpecialWord = record
54+ case Byte of
55+ 0: (Word_value: Word); // 7
56+ 1: (Byte_low, Byte_high: Byte); // 7, 0
57+ 2: (Bits: bitpacked array [0..15] of 0..1); // 1, 1, 1, 0, 0, ...
58+ end;
59+```
60+
61+Rekord ten ma tylko część zmienną i umożliwia dostęp do wartości słowa, poszczególnych bajtów, a nawet bitów. Identyfikator nie jest koniecznie wymagany w klauzuli `case`, więc nie zajmuje to żadnej pamięci. Rozmiar tego rekordu to dwa bajty. W przypadku tablicy `Bits` jest to możliwe tylko wtedy, gdy użyjemy jej ze słowem `bitpacked`. Zwróć uwagę na kolejność bajtów, gdzie mniej znaczący bajt (LSB) znajduje się na pierwszym miejscu.
62+
63+### Rekord zaawansowany
64+
65+„Rekord zaawansowany” to rekord z [[Method|metodami]] i [[Property|właściwościami]].
66+
67+> **Note:** Pamiętaj, aby dodać dyrektywę kompilatora `{$modeSwitch advancedRecords}` (po ustawieniu trybu).
68+
69+## Adresowanie
70+
71+### Pola
72+
73+Dostęp do poszczególnych pól uzyskuje się poprzez umieszczenie kropki między nazwą rekordu a nazwą pola w ten sposób:
74+
75+``` pascal
76+ a.firstname := 'George';
77+ a.surname := 'Petersen';
78+ a.phone := '789534';
79+ a.paidCurrentSubscription := true;
80+```
81+
82+Alternatywnie, całą serię pól można udostępnić razem za pomocą [[With|konstrukcji with]]:
83+
84+``` pascal
85+with a do
86+begin
87+ firstname := 'George';
88+ surname := 'Petersen';
89+ phone := '789534';
90+ paidCurrentSubscription := true
91+end;
92+```
93+
94+### Instancje
95+
96+Rekord jest traktowany przez program jako pojedynczy byt i np. można skopiować cały rekord (o ile kopia jest tego samego typu) w ten sposób:
97+
98+``` pascal
99+var
100+ a, b: TMember;
101+
102+(* main program *)
103+begin
104+ // ... przypisz wartości pól rekordu a
105+ b := a
106+ // Teraz b przechowuje _kopię_ a.
107+ // Nie pomyl tego z referencjami:
108+ // a i b nadal wskazują na _różne_ _instancje_ TMember.
109+end.
110+```
111+
112+## Rekord stały
113+
114+``` pascal
115+type
116+ // definicja rekordu
117+ TSpecialDay = record
118+ dayName: string;
119+ month: integer;
120+ day: integer;
121+ end;
122+
123+const
124+ // stała typu TSpecialDay
125+ childrensDay: TSpecialDay = (
126+ dayName: 'Dzień Dziecka';
127+ month: 6;
128+ day: 1;
129+ );
130+
131+// od FPC 3.2.0 możesz zdefiniować stałą tablicę rekordów w ten sposób
132+const
133+ SpecialDays: array of TSpecialDay = (
134+ ( dayName: 'Dzień Dziecka' ; month: 6; day: 1),
135+ ( dayName: 'Nowy Rok'; month: 1; day: 1)
136+ );
137+```
138+
139+## Rekordy w porównaniu z innymi typami strukturalnymi
140+
141+## Zobacz także
142+
143+- [[Basic Pascal Tutorial/Chapter 5/Records|Rekordy record]], poradnik dotyczący rekordów
144+- [[Object|Obiekty object]]
145+- [[Class|Klasy class]]
146+- [[FPC New Features 3.2.0|Nowe funkcje FPC 3.2.0 — Stałe tablice dynamiczne i inicjalizacja zmiennych]]
147+
148+---
149+*From the Free Pascal wiki, page "Record/pl", as it stood on 2023-01-25 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
150+Category: Code

Back to history