Błędy w Delphi mają postać typu:
[Error] Unit1.pas(38): Missing operator or semicolon,
co oznacza, że w wierszu nr 38 jest błąd (brakuje średnika, jak widać w wiersz powyżej - po inkrementacji zmiennej „a”).
Nie trzeba liczyć wierszy, program sam pokaże miejsce błędu, gdy sami klikniemy 2x w nazwę błędu w dolnej części okna.
Po liście błędów (errors) i ostrzeżeń (warnings) pojawia się oczywista informacja:
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
mówiąca po prostu nam, że program nie może być skompilowany (to compile - kompilować)
PRZYKŁADOWE BŁĘDY
Lp. |
Nazwa błędu |
Opis |
1 |
Illegal character in input file: 'ł' |
Niedozwolony znak - w tym przypadku była to nazwa zmiennej; w nazwach zmiennych nie używamy polskich liter |
2 |
':=' expected but '=' found |
Oczekiwano operatora przypisania, a znaleziono operator porównania |
3 |
Undeclared identifier: 'haslo'
|
Niezadeklarowany identyfikator. Występuje np. gdy zadeklarujemy zmienną o nazwie „hasl0” a odwołujemy się potem do zmiennej „haslo” |
4 |
Undeclared identifier: 'IntputBox' Undeclared identifier: 'lebel1' itd. |
Podobnie jak wyżej, chociaż w tym przypadku nie chodzi o różnicę w nazewnictwie zmiennych, tylko źle podana nazwa funkcji (InputBox); lebel1 zamiast label1 |
5 |
':=' expected but ':' found |
Oczekiwano := a jest : |
6 |
Missing operator or semicolon |
Brakuje operatora lub średnika (zazwyczaj średnika) |
7 |
'.' expected but ';' found |
Często występuje przy słowie „end” co może oznaczać, że mamy o jednego „enda” za dużo - oczekiwano kropki, czyli enda kończącego program (end.) a odnaleziono „end;” |
8 |
'END' expected but ')' found |
Tłumacząc wprost, to oczekiwano enda a znaleziono nawias zamykający. Sytuacja się komplikuje gdy okazuje się, że ten błąd wystąpił w tej linii kodu: inputbox('baza danych-próba2':'hasło':''); a ta linia była w pętli repeat. Niektóre błędy trudno interpretować, po prostu zamiast przecinków między argumentami funkcji wstawione są dwukropki. |
9 |
Not enough actual parameters |
Za mało parametrów. Błąd występuje gdy podamy za mało parametrów funkcji, np. w funkcji InputBox tylko dwa ŹLE: InputBox('Hasło', 'Podaj hasło:'); OK.: InputBox('Hasło', 'Podaj hasło:', ''); |
10 |
Invalid compiler directive: 'b' |
Ten błąd pojawił się przy deklaracji zmiennych gdzie zapomniano średnika: var a : String b : Integer; Błąd w ostatnim wierszu wyskoczył |
11 |
Incompatible types: 'String' and 'Real' |
Niekompatybilne (niewłaściwe) typy danych, np. jeśli mamy dwie zmienne: a : string b : integer i chcemy przypisać: a:=b; lub: a:='tekst'; |
11a |
Incompatible types: 'String' and 'Integer' |
Niekompatybilne typy, np. StringGrid1.Cells[i,0]:=i; zamiast StringGrid1.Cells[i,0]:=IntToStr(i); (FloatToStr też zadziała) |
11b |
Incompatible types: 'Integer' and 'Extended' |
a, b, c : Integer; a:=6; b:=3; c:=a/b; // błąd w tej linii Złe dobranie typów danych. Jeśli dzielimy to typy rzeczywiste. |
11c |
Incompatible types: 'TEdit' and 'Integer' |
Tworzymy pole TEdit o nazwie „nazwa” oraz zmienną całkowitą „nazwa”, następnie taki kod: nazwa:=3; Kompilator myśli, że odwołujemy się do Edita. Natomiast sam taki kod zadziała: nazwa.Text:='napis'; |
12 |
';' not allowed before 'ELSE' |
w instrukcji IF THEN ELSE przed ELSE nie stawiamy średnika |
13 |
Type of expression must be BOOLEAN |
typ wyrażenia musi być BOOLEAN (logiczne), czyli np. w pętli REPEAT na końcu gdy sprawdzamy warunek (a więc po słowie UNTIL) nie można użyć przypisania: until a:=haslo; tylko porównanie until a=haslo; |
14 |
Expression expected but 'END' found |
Oczekiwano wyrażenia a odnaleziono „end”, np.: a:= end; |
15 |
There is no overloaded version of 'IntToStr' that can be called with these arguments |
Jeśli mamy zmienną „a” typu np. single a będziemy chcieli zrobić coś takiego: IntToStr(a); W drugą stronę zadziała, tzn zmienną całkowitą można użyć w funkcji FloatToStr |
16 |
Unterminated string |
Ciąg znaków (łańcuch tekstowy) nie został zakończony, np.: Edit1.Text:='napis; |
17 |
Undeclared identifier: 'napis' |
Źle wpisany łańcuch znaków, kompilator uznaje go wtedy za identyfikator
Edit1.Text:=napis; lub Edit1.Text:=napis'; |
18 |
Illegal character in input file: '"' ($22) |
Źle oznaczony łańcuch znaków, czyli niedozwolone znaki (illegal characters) Edit1.Text:="napis"; |
19 |
'[' expected but ':=' found |
Złe użycie właściwości Cells, oczekiwano nawiasu kwadratowego i współrzędnych: StringGrid1.Cells:='napis'; |
20 |
Incompatible types: 'Integer' and 'Extended' |
Błąd typów (niekompatybilność) - Integer a Extender - podajemy współrzędne (komórki) w postaci liczb całkowitych a nie rzeczywistych (rozszerzonych): StringGrid1.Cells [2.0, 3] := 'napis'; |
21 |
Declaration expected but identifier 'a' found |
W języku Delphi wszystkie instrukcje i deklaracje muszą być umieszczone w procedurach (uproszczenie), a nie w dowolnym miejscu: var Form1: TForm1; a: Integer; implementation {$R *.dfm} a:=2; // tu pojawi się błąd end.
Rozwiązaniem jest chociażby przypisanie tej wartości przy tworzeniu formularza (event OnCreate)
|
22 |
[Warning] Unit1.pas(36): For loop control variable must be simple local variable |
Jest to ostrzeżenie, program wykona się. W pętlach używamy zmiennych lokalnych. |
|
|
|
|
|
|
np. jeśli zadeklarujemy tylko zmienną a nie przypiszemy jej wartości, a potem robimy takie coś: Stringgrid1.Cells [i-1, 0] := 'Napis';
Jeśli zrobimy takie coś: Stringgrid1.Cells [i, 0] := 'Napis'; , to napis pojawi się w komórce [0,0]
Zmieniliśmy nazwę formularza na Tekst i chcemy następnie zapisać projekt jako Tekst.dpr.