logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Delphi 2010 - Wyjaśnienie pewnych linijek w programie

hunter999 17 Sty 2016 17:00 1050 20
REKLAMA
  • #1 15343465
    hunter999
    Poziom 18  
    Posty: 530
    Ocena: 45
    Witam, mam prośbę aby ktoś wytłumaczył mi co znaczą poszczególne komendy w linijkach.
    Kod: Delphi
    Zaloguj się, aby zobaczyć kod

    To jest umieszczone w klasie w public, ale co w tym przypadku robi "constructor create" ? oraz co robi property a potem read? Czy read to to samo co readln ?

    Kod: Delphi
    Zaloguj się, aby zobaczyć kod


    Co w tym robi self ?
  • REKLAMA
  • Pomocny post
    #2 15344825
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    "constructor create(a, b : integer);" to deklaracja funkcji konstruktora.

    "function" i "procedure" mieszające w głowie rozróżnienie na metody zwracające wartość lub nie.

    Właściwości (Property) mogą mieć swój "setter" i "getter" czyli funkcję wywołaną w momencie zapisu wartości do danej "właściwości" bądź wołanej w momencie odczytu.

    A w ogóle to bardzo podstawowe podstawy Pascal'a i polecam poczytać jakiś manual do programowania obiektowego w Pascalu, jak na razie, Delphi nie ma tu nic do rzeczy.
  • REKLAMA
  • #3 15346244
    hunter999
    Poziom 18  
    Posty: 530
    Ocena: 45
    A co robi ten " self.y := y;" ? głównie chodzi mi o komendę self
  • #4 15346584
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    To jest dobre pytanie, bo na logikę to jest błąd :) SELF to oczywiście odwołanie klasy do samej siebie (jest to domyślny kontekst, ale gdy np. nazwa pola i parametr funkcji miałby identyczne nazwy, albo użyta byłaby dyrektywa WITH z obiektem też posiadającym te same nazwy pól/metod, wówczas pozwoli rozróżnić pola), czyli odwołuje się do swojego pola x i y. Natomiast te samote x i y to w tym kontekście to są także te same pola. Raczej powinno być a i b.
  • #5 15346605
    hunter999
    Poziom 18  
    Posty: 530
    Ocena: 45
    Czyli " self.y := y;" to znaczy że odwołujemy się do "y" ?
    A czym można to zastąpić ? Jeśli self jest błędne ?
  • REKLAMA
  • #6 15347163
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    Nie, Self nie jest błędne. Błędnym wydaje się być prawy argument przypisania, bo na logikę powinny to być parametry funkcji.

    Jeśli masz obiekt, np. Button1: TButton, to odwołujesz się do niego poprzez jego nazwę Button.Caption := ''. Natomiast wewnątrz danej klasy, jeśli chcesz się odwołać do samej siebie, to właśnie można używać Self (gdyby np. przycisk miał ustawić podczas tworzenia sam sobie tekst, to zapis wyglądałby tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Tak jest np. na standardowo tworzonej formatce, która ma przycisk. Teraz definiujesz akcję:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Ponieważ button1 jest tak naprawdę polem (zmienną) klasy TForm:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Self nie jest zawsze potrzebne, ponieważ jest domyślne. Ale są sytuacje, w których staje się niezbędnym.
  • #7 15347177
    hunter999
    Poziom 18  
    Posty: 530
    Ocena: 45
    a jak zrobić żeby obejść się bez tego "self" w tej sytuacji ? da się jakoś ?
  • #9 15347449
    hunter999
    Poziom 18  
    Posty: 530
    Ocena: 45
    Bo może jest inna metoda o której nie wiem
  • Pomocny post
    #10 15348760
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    A mi się wydaje, że masz namieszane w deklaracji tej klasy i stąd wszystkie problemy.
    Ja zrobiłbym to w ten sposób (albo jakoś podobnie):
    Kod: Delphi
    Zaloguj się, aby zobaczyć kod
    Jako, że w tym przypadku, żadne nazwy zmiennych sie nie pokrywają, to wszystkie notacje 'self.' są zbędne. Zostawiłem tylko dla przykładu.
  • #11 15349030
    hunter999
    Poziom 18  
    Posty: 530
    Ocena: 45
    Tak może być ? Skro self są zbędne to jak to zrobić bez nich ?
    Kod: Delphi
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #12 15349085
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    W tej procedurze są niezbędne, ponieważ nazwy zmiennych się pokrywają :
    Kod: Delphi
    Zaloguj się, aby zobaczyć kod
    Wszędzie indziej, jak już pisałem, gdy nie występuje możliwość nałożenia się nazw zmiennych, nie ma potrzeby stosowania 'self'.
  • #13 15349480
    hunter999
    Poziom 18  
    Posty: 530
    Ocena: 45
    Zrobiłem to tak żeby nie było selfa.
    Może mi ktoś wytłumaczyć jak działa ta linijka tak bardzo prosto
    "wynik:= prostokat.tworz(StrToInt(Edit1.Text),StrToInt(Edit2.Text));"

    Kod: Delphi
    Zaloguj się, aby zobaczyć kod
    [/align]
  • Pomocny post
    #14 15349548
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    hunter999 napisał:
    "wynik:= prostokat.tworz(StrToInt(Edit1.Text),StrToInt(Edit2.Text));"
    Ta linia tworzy klasę 'prostokat' pobierając dane z pól edycyjnych Edit1 i Edit2, zamieniając je z string na integer i zapisuje wskaźnik do utworzonej klasy w zmiennej 'wynik'.
  • #15 15349602
    hunter999
    Poziom 18  
    Posty: 530
    Ocena: 45
    A na jakiej zasadzie działa wyświetlanie w tej linijce ?
    "wynik.wyswietl(memo1);"
  • #16 15349616
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    hunter999 napisał:
    "wynik.wyswietl(memo1);"
    To jest wywołanie procedury, która masz zawartą w definicji klasy, z parametrem, który określa, gdzie mają się wyświetlić wyniki obliczeń.
  • #17 15349629
    hunter999
    Poziom 18  
    Posty: 530
    Ocena: 45
    Czy chodzi o tą procedurę "procedure prostokat.wyswietl(memo1 : TMemo);" ?
  • #18 15349656
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    hunter999 napisał:
    Czy chodzi o tą procedurę "procedure prostokat.wyswietl(memo1 : TMemo);" ?
    Tak.
  • #19 15350441
    hunter999
    Poziom 18  
    Posty: 530
    Ocena: 45
    Można powiedzieć że property bok_a:integer read a1; przepisuje z a1 do bok_a właściwości/dane?
  • #20 15350735
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    Raczej: Właściwość bok_a pobiera wartość (czyta) ze zmiennej (z pola) a1. Tam nic się nie przepisuje, bo property jest wirtualnym bytem ułatwiającym pisanie - sam z siebie niczego nie przechowuje.
  • #21 15353817
    hunter999
    Poziom 18  
    Posty: 530
    Ocena: 45
    Ok dzięki wielkie :)

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono kwestie związane z programowaniem w Delphi 2010, szczególnie dotyczące konstruktorów, właściwości oraz użycia słowa kluczowego "self". Użytkownik pytał o znaczenie poszczególnych komend w kontekście obiektów, takich jak "constructor create" oraz "property read". Odpowiedzi wyjaśniały, że "constructor create" to deklaracja funkcji konstruktora, a "property" umożliwia dostęp do wartości zmiennych. W przypadku konfliktu nazw, "self" jest używane do odwołania się do pól klasy. Użytkownicy podali również przykłady poprawnych deklaracji klas oraz wyjaśnili, jak działa przypisanie wartości do właściwości. W końcu omówiono, jak wywoływać metody klasy oraz jak działają właściwości w kontekście odczytu danych.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA