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

0

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

{$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.
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:

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.

1

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

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:

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ą.

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