Widoczność elementów (labela) wewnątrz procedury

Widoczność elementów (labela) wewnątrz procedury
PS
  • Rejestracja:około 3 lata
  • Ostatnio:13 dni
  • Postów:2
0

Program jest zadaniem książkowym i coś mi nie działa. Cały czas wyświetla że nie ma identyfikatora Label1.
unit Unit1;

Kopiuj
{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Label1Click(Sender: TObject);
    procedure Test2;
  private

  public

  end;

var
  Form1: TForm1;



implementation
   procedure Test2;
    begin
              Label1.caption:='Teraz jest cieplo';
    end;

{$R *.lfm}

function Mnozenie(Liczba1, Liczba2 :integer):integer;
  begin
    Result:=Liczba1*Liczba2;
  end;



{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.caption:= Inttostr(Mnozenie(20,20));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  MessageDlg('Witaj',mtInformation,[mbOk],0);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Test2;
end;
end.
edytowany 1x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:31 minut
  • Lokalizacja:Tuchów
  • Postów:12175
2
PiotrSM napisał(a):

Cały czas wyświetla że nie ma identyfikatora Label1.

Bo go nie ma — Label1 jest składową klasy formularza, a Ty próbujesz go użyć z poziomu procedury globalnej, dla której nie jest widoczny. Skoro etykieta jest składową klasy okna, to jedyną możliwością jej użycia jest odwołanie się do składowych formularza, za pośrednictwem zmiennej Form1:

Kopiuj
procedure Test2();
begin
  Form1.Label1.Caption := 'Teraz jest ciepło';
end;

Poza tym, logikę taką jak lokalne procedury, funkcje oraz metody klas implementuje się pod frazą {$R *.lfm}, coby utrzymać logiczny porządek w module.

PiotrSM napisał(a):

Program jest zadaniem książkowym […]

Jeśli dokładnie taki kod znajduje się w jakiejś książce do nauki Delphi/Free Pascala, to oblej ją benzyną i podpal, bo się do niczego nie nadaje — już na starcie uczy kompletnie złych nawyków.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
abrakadaber
abrakadaber
  • Rejestracja:prawie 13 lat
  • Ostatnio:9 miesięcy
  • Postów:6610
1

ale ten kod się nawet nie skompiluje (i wcale nie chodzi o to, że nie ma Label1) - chodzi o ten kawałek kodu

Kopiuj
TForm1 = class(TForm)
  Button1: TButton;
  Button2: TButton;
  Button3: TButton;
  Label1: TLabel;
  procedure Button1Click(Sender: TObject);
  procedure Button2Click(Sender: TObject);
  procedure Button3Click(Sender: TObject);
  procedure Label1Click(Sender: TObject);
  procedure Test2;
private

public

end;

procedure Test2; nie może być w tym miejscu - może być niżej w private lub public (bez wnikania w inne kwalifikatory)

po tej zmianie trzeba też zmienić ten kawałek:

Kopiuj
procedure Test2;
begin
          Label1.caption:='Teraz jest cieplo';
end;

Dodając przed Test2 ciąg TForm1. aby zaznaczyć, że metoda Test2 jest metodą klasy TForm1 a nie procedurą globalną.


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

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.