Błąd "Undeclared Identifier" - w czym może tkwić problem?

0

Witam,

Sprawa wygląda dość interesująco i nie jeden programista siedział z załamaną głową próbując znaleźć przyczynę błędu "Undeclared Identifier" dla obiektów: LabelPytanie, Button1, Button2 i Button3.

Mój unit prezentuje się w ten sposób:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, mmsystem;

type
  TForm2 = class(TForm)
    LabelPytanie: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
Const
  LiczbaPytan = 9;
var
  Form2: TForm2;
  BGraRuszyla: Boolean; { Czy gra juz ruszyla ? }
  IStanKonta: LongWord; { Stan Konta gracza }
  IPoprawne: Byte;      { Ilosc poprawnych odpowiedzi }
  APytania: array[1..LiczbaPytan,1..4] of String; { Tablica przechowywujaca pytania, [1]Pytanie[2]DobraOdpowiedz[3]Zla[4]Zla }
  ABylyPytania: array[1..LiczbaPytan] of Boolean; { Przechowuje czy pytanie o danym indexie juz bylo }
  INumerPytania: Byte;  { Numer pytania }
  IIndexButtona: Byte;  { Index buttona poprawnej odpowiedzi }
  IZadanePytania: Byte; { Zmienna przechowuje ile zadano juz pytan }

implementation
{$R *.dfm}

procedure DodajPytania();
begin
  { Pierwsze pytanie }
  APytania[1][1]:='4+3*2=?';
  APytania[1][2]:='10';
  APytania[1][3]:='14';
  APytania[1][4]:='16';
  { drugie pytanie }
  APytania[2][1]:='W którym roku odbyl się chrzest Polski?';
  APytania[2][2]:='966';
  APytania[2][3]:='696';
  APytania[2][4]:='996';
  { trzecie pytanie }
  APytania[3][1]:='Z jakiego sportu zrezygnowal znany Polski skoczek Adam Malysz?';
  APytania[3][2]:='Ze skoków narciarskich';
  APytania[3][3]:='Ze skoku w dal';
  APytania[3][4]:='Ze skoku wzwyż';
  { czwarte pytanie }
  APytania[4][1]:='Z jakiego sportu zrezygnowal znany Polski skoczek Adam Malysz?';
  APytania[4][2]:='Ze skoków narciarskich';
  APytania[4][3]:='Ze skoku w dal';
  APytania[4][4]:='Ze skoku wzwyż';
  { piąte pytanie }
  APytania[5][1]:='Z jakiego kraju pochodzi slynna piosenkarka Rihanna?';
  APytania[5][2]:='Z Barbadosu';
  APytania[5][3]:='Z USA';
  APytania[5][4]:='Z Kenii';
  { szóste pytanie }
  APytania[6][1]:='Kiedy obchodzony jest sylwester?';
  APytania[6][2]:='31 grudnia';
  APytania[6][3]:='30 listopada';
  APytania[6][4]:='32 lutego';
  { siódme pytanie }
  APytania[7][1]:='Za jaką datę traktuje się powstanie organizacji ZdobywcyGier?';
  APytania[7][2]:='9 wrzesnia 2012';
  APytania[7][3]:='1 wrzesnia 2012';
  APytania[7][4]:='18 października 2012';
  { ósme pytanie }
  APytania[8][1]:='Jaka jest druga litera polskiego alfabetu?';
  APytania[8][2]:='Ą';
  APytania[8][3]:='B';
  APytania[8][4]:='A';
  { dziewiate pytanie }
  APytania[9][1]:='Po co żolnierz ma plaszcz?';
  APytania[9][2]:='Po kolana';
  APytania[9][3]:='Po brzegi';
  APytania[9][4]:='Po jaja';
end;

procedure LosujPytanie();
var i,j: Byte;
LABEL Lagain; { Deklaracja uchwytu dla goto }
begin
  randomize;
  Lagain:
  INumerPytania:=random(LiczbaPytan);

  if ABylyPytania[INumerPytania] then
    goto Lagain;

  LabelPytanie.Caption:=APytania[INumerPytania][1];
  IIndexButtona:=random(3);

  case IIndexButtona of
    1:begin
      Button1.Caption:=APytania[INumerPytania][2];
      Button2.Caption:=APytania[INumerPytania][3];
      Button3.Caption:=APytania[INumerPytania][4];
    end;
    2:begin
      Button2.Caption:=APytania[INumerPytania][2];
      Button1.Caption:=APytania[INumerPytania][3];
      Button3.Caption:=APytania[INumerPytania][4];
    end;
    3:begin
      Button3.Caption:=APytania[INumerPytania][2];
      Button2.Caption:=APytania[INumerPytania][3];
      Button1.Caption:=APytania[INumerPytania][4];
    end;
  end;

  ABylyPytania[INumerPytania]:=True;
  IZadanePytania:=IZadanePytania+1;
  if IZadanePytania = LiczbaPytan then
  begin
    IZadanePytania := 0;
    for j:=1 to LiczbaPytan do
      ABylyPytania[j]:=False;
  end;

end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  case IIndexButtona of
  1:PlaySound('zla.wav',0,SND_ASYNC);
  2:begin
    IPoprawne:=IPoprawne+1;
    PlaySound('dobra.wav',0,SND_ASYNC);
  end;
  3:PlaySound('zla.wav',0,SND_ASYNC);
  end;

  LosujPytanie();
end;

procedure TForm2.Button4Click(Sender: TObject);
begin
  Application.Terminate
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  case IIndexButtona of
  1:begin
    IPoprawne:=IPoprawne+1;
    PlaySound('dobra.wav',0,SND_ASYNC);
  end;
  2:PlaySound('zla.wav',0,SND_ASYNC);
  3:PlaySound('zla.wav',0,SND_ASYNC);
  end;
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
  case IIndexButtona of
  1:PlaySound('zla.wav',0,SND_ASYNC);
  2:PlaySound('zla.wav',0,SND_ASYNC);
  3:begin
    IPoprawne:=IPoprawne+1;
    PlaySound('dobra.wav',0,SND_ASYNC);
  end;
  end;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Application.Terminate;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
   DodajPytania();
end;

procedure TForm2.FormShow(Sender: TObject);
begin
  BGraRuszyla:=True;
  LosujPytanie();
  while (IPoprawne < 5) and (BGraRuszyla) do
  begin
    IStanKonta:=IStanKonta-1;
    sleep(25);
  end;
  while (IPoprawne >= 5) and (BGraRuszyla) do
  begin
    Button4.Visible:=True;
    LabelPytanie.Visible:=False;
    Button1.Visible:=False;
    Button2.Visible:=False;
    Button3.Visible:=False;
  end;
end;


end.

Jest to nic innego niż prosty quiz jako projekt zaliczeniowy i na pierwszy rzut oka wszystko wygląda w porządku do czasu sprawdzenia czy to faktycznie działa i odpowiedź jest prosta: nie.

Kompilator tak jak na początku napisałem czepia się 4 obiektów i tego że deklaruję do nich tekst z tablicy.

W czym może tkwić problem?

2

To nie humory kompilatora, to brak podstawowej wiedzy z zakresu obiektowości.
Masz dwa rozwiązania:

  1. procedure LosujPytanie(); przerób na procedurę składową.
  2. Wszystkie odwołania w procedure LosujPytanie(); przerób na odwołanie przez odpowiedni obiekt: Form2.LabelPytanie.Caption

Tak a propos: żaden z tych nie jednych ("... nie jeden programista siedział z załamaną głową próbując znaleźć przyczynę błędu ...") - nie ma żadnego moralnego prawa nazywać siebie nawet średnio zaawansowanym programistą.

1

Sprawa wygląda dość interesująco i nie jeden programista siedział z załamaną głową próbując znaleźć przyczynę błędu

To słabych macie tych programistów.

  private
    { Private declarations }
    procedure DodajPytania();
    procedure LosujPytanie();

...

implementation
{$R *.dfm}


procedure TForm2.DodajPytania();
...

procedure TForm2.LosujPytanie();

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