Jak to możliwe, że kompilator nie wie, co to TLabel??

0
unit Unit1;

{$mode objfpc}{$H+}

interface

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

type
  TForm1 = class(TForm)
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

var
  Label1:TLabel;

begin
  Label1:=Tlabel.Create(Form1);
  Label1.Parent := Form1;
  Label1.Visible := True;
  Label1.Top := 10;
  Label1.Left := 10;
  Label1.Autosize := True;
  Label1.Caption := 'why cant i see that';
end.

Nie kompiluje się, gdyż:

unit1.pas(26,16) Error: Identifier not found "TLabel"
unit1.pas(26,16) Error: Error in type definition
unit1.pas(29,17) Error: Identifier not found "Tlabel"
unit1.pas(30,10) Error: Illegal qualifier
unit1.pas(31,10) Error: Illegal qualifier
unit1.pas(32,10) Error: Illegal qualifier
unit1.pas(33,10) Error: Illegal qualifier
unit1.pas(34,10) Error: Illegal qualifier
unit1.pas(35,10) Error: Illegal qualifier
unit1.pas(38) Fatal: There were 9 errors compiling module, stopping

Nic nie rozumiem. Jak to: Identifier not found: TLabel?!? Przecież JEST taki komponent! http://wiki.freepascal.org/TLabel Nie mam pojęcia, co za różnica, czy przeciągnę komponent z paska Lazarusa na Form1 i ustawię mu Caption w Inspektorze obiektów, czy stworzę go dynamicznie?

1

co za różnica, czy przeciągnę komponent z paska Lazarusa na Form1 i ustawię mu Caption w Inspektorze obiektów, czy stworzę go dynamicznie?

W pierwszym przypadku Lazarus automatycznie dołączy potrzebne pliki, których aktualnie najwyraźniej brakuje.

Btw, Form1 może być jeszcze niestworzone, gdy będzie wykonywany ten kod.
Wrzuć go do TForm.OnCreate.

1

uses StdCtrls...przynajmniej w Delphi jest niezbędne.

0

@kmph - nie wiem skąd wyciągnąłeś ten kod, jednak największym błędem jest hybrydowa konstrukcja pliku, jaki utworzyłeś; Główny blok kodu nie może istnieć w żadnym module, co oczywiście jak byk sygnalizuje kompilator w komunikatach błędów, a o czym poprzednicy zapomnieli wspomnieć, lub po prostu nie zauważyli; To nie kompilator jest winny - to standardowy PEBKAC;

Polecam więc zaprzyjaźnić się z książkami lub kursami, bo brak Ci jakiekolwiek wiedzy na temat programowania w Delphi; A wątek przenoszę do działu Newbie, dlatego żę dotyczy podstaw programowania;</del>

PS: Lazarus sam doda brakujące moduły do listy uses jeśli ich brakuje, natomiast Delphi7 (nowsze nie wiem) nie doda, ale podpowie komunikatami o co chodzi.

0

@furious programming - twierdzisz?

kmph@kmph-komputer ~/ahh $ cat zobaczmy.pas
program Zobaczmy;

uses Modul;

begin

  writeln(wypisz);
  
end.
kmph@kmph-komputer ~/ahh $ cat modul.pas
unit Modul;

interface
  function wypisz: Integer;

implementation

  var i: Integer;
  
  function wypisz: Integer;
  begin
    wypisz := i;
  end;
  
  begin
    i := 15;
  end.
kmph@kmph-komputer ~/ahh $ fpc zobaczmy.pas
Free Pascal Compiler version 2.6.2 [2013/03/17] for x86_64
Copyright (c) 1993-2012 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling zobaczmy.pas
Compiling modul.pas
Linking zobaczmy
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
26 lines compiled, 0.0 sec 
kmph@kmph-komputer ~/ahh $ ./zobaczmy
15
kmph@kmph-komputer ~/ahh $ 
0

@Patryk27 @marogo

unit Unit1;

{$mode objfpc}{$H+}

interface

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

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

var
  Label1:TLabel;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1:=Tlabel.Create(Form1);
  Label1.Parent := Form1;
  Label1.Visible := True;
  Label1.Top := 10;
  Label1.Left := 10;
  Label1.Autosize := True;
  Label1.Caption := 'why cant i see that';
end;

end. 

Działa, dzięki!

0

Hmm... Przyznam szczerze, że nie znałem takiej konstrukcji, muszę to obadać - zwracam honor :]

Co i tak nie zmienia faktu, że formularz jeszcze nie istnieje w pamięci, a nawet gdybyś wrzucił ten kod do sekcji Initialization, to i tak dostałbyś SIGSEGV; W każdym razie próbujesz tworzyć komponent w niewłaściwym miejscu i w niewłaściwym czasie, bo instancja klasy formularza jeszcze nie została utworzona w pamięci;

A kompilator ma prawo niewiedzieć o klasie TLabel, bo brakuje Ci w sekcji Uses modułu StdCtrls, w którym klasa etykiety jest zawarta.

1

Hmm... Przyznam szczerze, że nie znałem takiej konstrukcji, muszę to obadać - zwracam honor

Jest jeszcze initialization i finalization.

UNIT unit1;

INTERFACE

IMPLEMENTATION

INITIALIZATION
  // kod wykonywany na początku programu

FINALIZATION
  // kod wykonywany na końcu programu

END.

Zamiast initialization można napisać begin, ale wtedy nie można użyć finalization.

UNIT unit2;

INTERFACE

IMPLEMENTATION

BEGIN
  // kod wykonywany na początku programu

END.
0

@Azarien - znam i korzystam z sekcji Initialization i Finalization, jednak wplatania głównego bloku do modułu nie znałem i nigdy takiego czegoś nie widziałem, stąd niesłusznie stwierdziłem, że pytacz stosuje niedozwoloną składnię, za co oczywiście przepraszam; Oderwałem się od pracy żeby odpisać i popełniłem błąd; Na przyszłość obiecuję bardziej się skupiać na odpowiadaniu.

0

Ne mam jak teraz tego sprawdzić, ale czy w Lazarusie po najechaniu na TLabel w palecie komponentów, nie pokazuje w nawiasie StdCtrls? A analogicznie inne komponemty. Bo jeśli ma to miejsce, jak pod Delphi to nie ma co wykreślać z treści odpowiedzi, że pytający nie zna podstaw języka. Bo jest to niestety faktem. Gdyż najprawdopodobniej napisał bardzo małą ilość kodu. I stąd jego zdziwienie o błędach.

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