Podstawy Delphi – procedura nie wie co to Edit1

0

Próbuję się uczyć Delphi. Biorę się za procedury zgodnie z materiałami dostępnymi w necie wystarczy napisać procedura i nazwa, a potem odwoływać się przez nazwę. Wyczytałem jeszcze że zmienne w procedurze są dostępne tylko w procedurze i że procedurę należy umieścić na początku programu po dziwnych znaczkach {$R *.dfm}.

Piszę więc prostą procedurę i kicha. Procedura nie wie co to edit1 - przecież na początku programu ma podane na tacy. Co z tym zrobić?
.
Zbyszek

unit Unit3
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
  TForm3 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Edit2: TEdit;
    Label6: TLabel;

    procedure Button1Click(Sender: TObject);
    procedure mnozenie;

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation
{$R *.dfm}


procedure mnozenie;
var
wynik : Integer;

 begin
  wynik := IntToStr(strToInt(edit1.Text) * StrToInt(Edit2.Text));
  Label6.Caption := wynik;
 end;


procedure TForm3.Button1Click(Sender: TObject);
begin
mnozenie;
end;

end.
0

Dodaj deklarację procedury w sekcji private (albo w public jeżeli trzeba - w tym wypadku raczej nie)

private
{ Private declarations }
  procedure mnozenie;

ponieważ procedura została zadeklarowana w klasie TForm3 należy ją zaimplementować:

procedure TForm3.mnozenie;
wynik : Integer; //<-- tu też masz błąd powinien być string a nie integer
begin
//.....
end;

Oczywiście zamiast tego można było napisać:

Form3.Label6.Caption := wynik;

ale lepiej programować obiektowo.

0

No tak, teraz wszystko działa.
Przez ostatni tydzień przeczytałem chyba z 20 poradników i książek o Delphi i procedurach nigdzie ani słowa o tym,. że trzeba użyć "TForm" przed nazwą procedury, Dzięki wielkie mogłem od razu tu pisać zamiast tydzień urlopu zmarnować

0

nigdzie ani słowa o tym,. że trzeba użyć "TForm" przed nazwą procedury,

To nie do końca tak jest. Twoja 'procedura' jest metodą z klasy TForm, stąd Tform. przed nazwą.
Zwykłe procedury nie wymagają nic przed nazwą procedury.

1

@zew10: źle się uczysz, bo zamiast skupić się na procedurach, Ty piszesz program okienkowy, czyli defacto obiektowy, a to pół roku nauki dalej niż programowanie proceduralne. Powinieneś przez cały okres nauki podstaw programowania strukturalnego/proceduralnego pisać aplikacje konsolowe, tak aby nie musieć korzystać z rzeczy, których jeszcze nie rozumiesz.

Poza tym – które to Delphi i dlaczego nie Lazarus? ;)

0
furious programming napisał(a):

@zew10: źle się uczysz, bo zamiast skupić się na procedurach, Ty piszesz program okienkowy, czyli defacto obiektowy, a to pół roku nauki dalej niż programowanie
Poza tym – które to Delphi i dlaczego nie Lazarus? ;)

Miałem 3 tygodnie czasu, aby napisać program, który odbiera dane z netu i w zależności od różnych informacji wyświetla różne stany elementów na ekranie monitora. Zadanie karkołomne, bo o Delphi nie miałem pojęcia (na co dzień pisze w ASM na procesory jednoukładowe). Próbując na szybko chwytać wiedzę najwięcej problemów sprawiło mi szukanie jak zapisywać pliki na dysk bez kasowania zawartości - kilka dni szukania, jak odwoływać się do komponentów przez zawartość zmiennej, aby za każdym razem nie trzeba było pisać Panel2, Panel3, Panel4.(gdy paneli jest 200) - kilka dni szukania i jak pisać podprogramy, procedury (z braku wiedzy, a termin goni powtarzałem czynności po kilkadziesiąt razy w programie).
Na szczęście program ruszył i chyba działa. :-) Nie zawsze jest możliwość i czas studiować jakieś starodawne konsole. Użyłem Delphi Starter coś pięknego. Mój pierwszy program na PC. Wiem nie mam w ogóle wiedzy co to są klasy obiekty itp. - to dla mnie jakaś abstrakcja. Jak będzie więcej czasu, to będę próbował zrozumieć, to wszystko co napisałem i się nauczyć zasad i podstaw tego języka - tylko skąd wziąć ten czas.
Nie wiem co to jest Lazarus popatrzę w google.

1
zew10 napisał(a):

Miałem 3 tygodnie czasu, aby napisać program, który odbiera dane z netu i w zależności od różnych informacji wyświetla różne stany elementów na ekranie monitora. Zadanie karkołomne, bo o Delphi nie miałem pojęcia (na co dzień pisze w ASM na procesory jednoukładowe).

Brak wystarczającej ilości czasu nie jest powodem do zmiany kolejności zagadnień. Nic Ci nie da jeśli ominiesz kilka punktów z tutoriala, bo prędzej czy później i tak do nich wrócisz.

Próbując na szybko chwytać wiedzę najwięcej problemów sprawiło mi szukanie jak zapisywać pliki na dysk bez kasowania zawartości […]

To nie jest zapis pliku na dysku, a dopisanie danych do istniejącego pliku. Nie nazywasz rzeczy po imieniu i przez to tracisz czas na szukanie czegoś, czego wcale nie potrzebujesz.

[…] kilka dni szukania, jak odwoływać się do komponentów przez zawartość zmiennej, aby za każdym razem nie trzeba było pisać Panel2, Panel3, Panel4.(gdy paneli jest 200) - kilka dni szukania i jak pisać podprogramy, procedury (z braku wiedzy, a termin goni powtarzałem czynności po kilkadziesiąt razy w programie).

Jak Ty nie odróżniasz procedury od metody to wątpię, abyś cokolwiek sensownego napisał w sensownym czasie. W trzy tygodnie można się nauczyć programować w Delphi, pod warunkiem, że już umie się programować w innej technologii – pozostaje jedynie zapoznać się ze środowiskiem (albo i nie) oraz przyswoić nową składnię.

W przeciwnym razie nie można tego nazwać programowaniem, bo na siłę robi się rzeczy, o których nie ma się większego pojęcia.

Nie zawsze jest możliwość i czas studiować jakieś starodawne konsole.

Starodawne… Skąd Wy bierzecie takie rewelacje…?

Każdy system Windows, od czasów pierwszych wersji z graficznym interfejsem, aż po najnowszy Windows 10, posiada konsolę i mnóstwo ludzi z niej korzysta. Nie tylko do konfigurowania systemu, ale też (i przede wszystkim) programiści/admini.

Tu nie chodzi o sam fakt używania konsoli, a o to, aby skupić się na nauce podstaw proceduralnego i strukturalnego programowania, bez konieczności zaznajamiania się z obiektowym otoczeniem. Dzięki temu w głowie nie robi się bałagan i nauka idzie o wiele lepiej.

Nie wiem co to jest Lazarus popatrzę w google.

Odpowiednik Delphi, tyle że darmowy, bez ograniczeń i z otwartym kodem źródłowym.

0

Odpowiednik Delphi, tyle że darmowy, bez ograniczeń i z otwartym kodem źródłowym.

Rzeczywiście ten program jest prawie jak Delphi. Co ważniejsze ma polski interface. Mój angielski jest niestety słabiutki i w delphi co chwilę muszę korzystać z translatora. Wygląda na to, że trzeba przysiąść do Pascala i zgłębić teorię, bo braków mam duuużo. Niestety większość książek jest tak napisana, że nie wszystko jest zrozumiałe Ja mam taką głupią naturę, że jak się uczę, a nie rozumiem fragmentu, to ciężko jest mi iść dalej, bo myślami wciąż wracam do tematów które były niejasne.
Dziękuję za informację o Lazarusie. Może się pokaże jakaś książka po polsku o tym programie, bo z tego co już wyczytałem na forach są różnice w porównaniu do delphi i wiele osób nie wie jak je przejść.

0
zew10 napisał(a):

Co ważniejsze ma polski interface.

To akurat jest szczegół – większość zapewne i tak korzysta z angielskiego.

Ja mam taką głupią naturę, że jak się uczę, a nie rozumiem fragmentu, to ciężko jest mi iść dalej, bo myślami wciąż wracam do tematów które były niejasne.

To akurat jest zaleta, choć z tego wątku wynika, że działasz zupełnie odwrotnie.

Dziękuję za informację o Lazarusie. Może się pokaże jakaś książka po polsku o tym programie, bo z tego co już wyczytałem na forach są różnice w porównaniu do delphi i wiele osób nie wie jak je przejść.

Tak, różnic jest trochę, a na samą książkę nie liczyłbym, bo i po co. W sieci dostępna jest dokumentacja (do świeżutkiej wersji kompilatora), do tego są materiały we wiki, więc jest się z czego uczyć.

0

Krótki, przyspieszony kurs.

Procedura - to fragment kodu wydzielony do pewnego bloku, który możesz wywoływać w wielu miejscach w kodzie.
Przekładając to na ASM, to będzie para: call..ret

Procedury mają swoją nazwę i mogą przyjmować parametry. Załóżmy, że chcesz zrobić sobie herbatę. Co musisz zrobić?

  • sprawdź stan wody w czajniku - jeśli za mało, to dolej
  • uruchom czajnik
  • pobierz szklankę
  • pobierz herbatę
  • wsyp/włóż herbatę do szklanki
  • czekaj na ugotowanie wody w czajniku
  • zalej herbatę ugotowaną wodą.

Te wszystkie elementy możesz zawrzeć w procedurze i wtedy po prostu wywołasz:
zrobHerbate();

Dzięki temu, jeśli w kilku miejscach w kodzie robisz herbatę, nie musisz powtarzać tego samego kodu wiele razy. Posługujesz się procedurą (tak jak w asm: call i ret).

Czym jest funkcja? Funkcja to taka procedura, która potrafi zwrócić jakąś wartość. Np. możesz przeprowadzić działanie na liczbach:

function AddAndMultiply(a: integer, b: integer): integer;
begin
  result := (a + b) * a * b;
end;

Result to taka "ukryta" zmienna w Delphi. To, co znajdzie się w niej na końcu funkcji, zostanie zwrócone:

var
  wynik: integer;
begin
  wynik := AddAndMultiply(5, 2);
end;

Zmienna wynik będzie miała teraz wartość 70.

Metoda - to procedura lub funkcja należąca do obiektu.
Obiekt - to instancja klasy
Klasa - coś w rodzaju projektu obiektu (matrycy).

Np. klasą będzie projekt biurka, natomiast obiektem będzie biurko.

Jeśli masz formę, to forma jest już obiektem (klasy np. TForm). Na formie masz kontrolki. Te kontrolki należą do formy - są składnikiem klasy.
Teraz z poziomu zwykłej procedury nie możesz odwołać się do kontrolek na formie, ponieważ procedura nie ma pojęcia o obiekcie formy. Miałaby, gdybyś przekazał ten obiekt w parametrze, np:

procedure Bar(obj: TForm1);
var
  s: string;
begin
    s:=obj.edit.Text;
end;

Ale jakoś musiałbyś ten obiekt jednak przekazać. Więc jeśli masz do zrobienia coś w obiekcie, to prawdopodobnie powinieneś z procedury uczynić metodę - niech będzie składnikiem klasy, tak jak już Ci napisali wyżej. Metody różnią się nazewnictwem od procedur i funkcji, ponieważ na początku zawierają nazwę klasy, do której należą, np:

procedure TForm1.Bar();
begin

end;

Tutaj widać, że jest to metoda, a nie procedura.
Oczywiście metody muszą być odpowiednio zadeklarowane w klasie. Ale to już pewnie wiesz.

Mam nadzieję, że coś rozjaśniłem.

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