Hallo, ich (nicht sehr erfahren)ö arbeite an einem "Testprogramm", um Lazarus kennenzulernen.
Wenn ich nun in ein bestehendes Projekt eine neue Procedure entwickele und diese z.B. mittels eines Buttons auf dem Formular aufrufe habe ich eine Meldung, daß die Procedure nicht gefunden wird.
Ich vermute, daß man diese Proceduren nur an bestimmten Stellen im Code positionieren darf - ist das so? Und nach welchen Regel hat das zu geschehen???
Fragen über Fragen
Gruß und Danke
* Im Interface die procedure ButtonOnClick in die Klasse TForm1 eingeordnet
* In der Implementation ein leerer Rumpf der procedure erstellt
Da die Procedure im Interface vorhanden ist, ist die Reihenfolge völlig egal.
Falls Du proceduren schreibst, die nicht im Interface stehen, muss die procedure in der Implementation definiert sein, bevor sie zum ersten Mal aufgerufen wird.
Auch da gibt es TRicks, aber nicht in der ersten Stunde Lazarus.
Hallo Winni, ich habe mein Machwerk mal hier reinkopiert um es zu zeigen.
Es geht um die Procedure "Datei", in der ein Aufruf der Procedure "Anzeigen" steht; mit der Fehlermeldung "Identifier not found". Wenn ich Dich richtig verstanden habe, sind doch aber beide Proceduren in der Implementation vorhanden oder?? (heul)
Gruß
var
Form1: TForm1;
GrpDatei: File of TGrpSatz;
GrpSatz1,GrpSatz2: TGrpSatz;
Fehlercode,IntGrpNralt: integer;
Datum,StrGrpNralt,StrGrpNamealt: string;
implementation
{$I+}{$IOCHECKS ON}{$R *.lfm}
procedure Datei;
begin
if not FileExists('Gruppen.rec') then
begin
AssignFile(GrpDatei,'Gruppen.rec');
Rewrite(GrpDatei);
CloseFile(GrpDatei);
ShowMessage('Die Datei "Gruppen.rec" wurde angelegt. Denken Sie an eine regelmäßige Sicherung - Bitte Taste drücken');
repeat until KeyPressed;
end;
Anzeigen;
end;
procedure InitEDTFelder;
begin
StrGrpNralt:='';
StrGrpNamealt:='';
Form1.EDTGrpNr.Text:='';
Form1.EDTGrpName.Text:='';
end;
procedure Fehlermeldung;
begin
case Fehlercode of
{Fehler für Dateioperationen:1-9
Fehler für Eingabefehler:10-20}
1: Form1.LBLMeldung.Caption:='Eingaben gespeichert';
2: begin
Form1.LBLMeldung.Font.Color:=clred;
Form1.LBLMeldung.Caption:='Es sind noch keine Einträge vorhanden';
end;
9: Form1.LBLMeldung.Caption:='Der Eintrag wird sortiert';
10: begin
Form1.LBLMeldung.Font.Color:=clred;
Form1.LBLMeldung.Caption:='ungültiger Wert';
end;
11: begin
Form1.LBLMeldung.Font.Color:=clred;
Form1.LBLMeldung.Caption:='Daten sind unvollständig';
end;
12: Form1.LBLMeldung.Caption:='Es wurden keine Veränderungen vorgenommen';
end;
end;
procedure TForm1.BTAbbEndeClick(Sender: TObject);
begin
close;
end;
procedure TForm1.BTNeueGrpClick(Sender: TObject);
begin
if (EDTGrpNr.Text<>'') and (StrtoInt(EDTGrpNr.Text)>0) and (EDTGrpName.Text<>'')
then begin
GrpSatz1.GrpNr:=StrtoInt(EDTGrpNr.Text);
GrpSatz1.GrpName:=EDTGrpName.Text;
GrpSatz1.GrpKto:=EDTGrpKto.Text;
GrpSatz1.GrpMonUms:=0;
GrpSatz1.GrpJahrUms:=0;
try
AssignFile(GrpDatei,'Gruppen.rec');
FileMode:=2;
Reset(GrpDatei);
Seek(GrpDatei,FileSize(GrpDatei));
write(GrpDatei,GrpSatz1);
finally
closeFile(GrpDatei);
end;
Fehlercode:=1;
Fehlermeldung;
InitEDTFelder;
end
else begin
Fehlercode:=11;
Fehlermeldung;
end;
end;
procedure TForm1.EDTGrpNrClick(Sender: TObject);
begin
StrGrpNralt:=EDTGrpNr.Text;
LBLMeldung.Caption:='';
end;
procedure TForm1.EDTGrpNrExit(Sender: TObject);
begin
if (EDTGrpNr.Text<>'') and (StrToInt(EDTGrpNr.Text)>0) and (IntGrpNralt<>(StrToInt(EDTGrpNr.Text)))
then GrpSatz1.GrpNr:=StrToInt(EDTGrpNr.Text)
else begin
if (EDTGrpNr.Text='') or (StrToInt(EDTGrpNr.Text)<1)
then begin
Fehlercode:=10;
Fehlermeldung;
end
else begin
Fehlercode:=12;
Fehlermeldung;
end;
end;
end;
procedure TForm1.EDTGrpNameClick(Sender: TObject);
begin
EDTGrpName.Text:='';
LBLMeldung.Caption:='';
end;
procedure TForm1.EDTGrpNameExit(Sender: TObject);
begin
if EDTGrpName.Text<>''
then GrpSatz1.GrpName:=EDTGrpName.Text
else begin
Fehlercode:=10;
Fehlermeldung;
end;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Datei;
InitRecFelder;
InitEDTFelder;
LBLMeldung.Caption:='';
Fehlercode:=0;
end;
procedure Sortieren;
var
i,j,k,fs: integer;
begin
filemode:=2;
assign(GrpDatei,'Gruppen.rec');
rewrite(GrpDatei);
i:=0;
k:=1;
fs:=filesize(GrpDatei);
for i:=0 to fs do
begin
seek(GrpDatei,i);
read(GrpDatei,GrpSatz1);
for j:=(i+1) to (fs-1) do
begin
seek (GrpDatei,j);
read (GrpDatei,GrpSatz2);
if (GrpSatz2.GrpNr<GrpSatz1.GrpNr) then
begin
GrpSatz2.Sort:=k;
k:=k+1;
write(GrpDatei,GrpSatz2);
end;
end;
end;
close(GrpDatei);
end;
procedure Anzeigen;
var
item : TListItem;
i: integer;
begin
Datum:=FormatDateTime('DD.MM.YYYY',Date);
Form1.LVGruppen.Items.Clear;
filemode:=2;
assign(GrpDatei,'Gruppen.rec');
rewrite(GrpDatei);
if not EOF(GrpDatei)
then begin
i:=0;
seek(GrpDatei,i);
while not EOF(GrpDatei) do
begin
read(GrpDatei,GrpSatz1);
item:=Form1.LVGruppen.Items.Add;
item.caption:='Item'; //Index = Caption
item.Subitems.Add(IntToStr(GrpSatz1.GrpNr)); //Index = 1
item.Subitems.Add (GrpSatz1.GrpName); //Index = 2
item.Subitems.Add(GrpSatz1.GrpKto); //Index = 3
item.Subitems.Add(FloatToStr(GrpSatz1.GrpMonUms)); //Index = 4
item.Subitems.Add(FloatToStr(GrpSatz1.GrpJahrUms)); //Index = 5
item.Subitems.Add(DateToStr(GrpSatz1.Anlage)); //Index = 6
i:=i+1;
end;
end
else begin
Fehlercode:=2;
Fehlermeldung;
end;
CloseFile(GrpDatei);
end;
Joachim Raap hat geschrieben: So 23. Okt 2022, 17:14
Hallo Winni, ich habe mein Machwerk mal hier reinkopiert um es zu zeigen.
Es geht um die Procedure "Datei", in der ein Aufruf der Procedure "Anzeigen" steht; mit der Fehlermeldung "Identifier not found". Wenn ich Dich richtig verstanden habe, sind doch aber beide Proceduren in der Implementation vorhanden oder?? (heul)
Nutze bitte [ code ] Tags (ohne Leerzeichen) und umgib deinen Code damit, damit sowas im Forum besser lesbar bleibt.
Joachim Raap hat geschrieben: So 23. Okt 2022, 17:14
Hallo Winni, ich habe mein Machwerk mal hier reinkopiert um es zu zeigen.
Es geht um die Procedure "Datei", in der ein Aufruf der Procedure "Anzeigen" steht; mit der Fehlermeldung "Identifier not found". Wenn ich Dich richtig verstanden habe, sind doch aber beide Proceduren in der Implementation vorhanden oder?? (heul)
Gruß
aus deinem Code.
Dies wird nur bei reinen Konsolenanwendungen gebraucht und dient zur Turbo-Pascal Kompatibilität..
Bei grafischen Form-Anwendungen führt sowas zu Störungen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
PascalDragon hat geschrieben: So 23. Okt 2022, 17:17
Nutze bitte [ code ] Tags (ohne Leerzeichen) und umgib deinen Code damit, damit sowas im Forum besser lesbar bleibt.
Oder noch besser - denn das scheint ja kein großes Projekt zu sein - packe die pas, lfm, lpi and lpr-Dateien in ein zip und lade das ins Forum hoch (unten unter "Dateianhänge"). Dann kann jeder, der interessiert ist, das durch den Compiler jagen und das Problem viel leichter nachvollziehen.
Das Problem: Die Procedure Anzeigen steht hinter der Procedure Datei,
damit kennt der Compiler diese Procedure NOCH nicht.
Er kennt nur Proceduren die davor stehen.
Möglichkeiten:
Jetzt könntest Du die Procedure Anzeigen VOR die Procedure Datei schieben.
Wilde schieberei, halte ich nichts von, oft kennt er dann andere Dinge nicht mehr )
oder, wie theo schon schrieb: eine Forward Deklaration machen:
{ TForm1 }
Procedure Anzeigen; Forward; // Das ist die zusätzliche entscheidene Zeile, sonst meckert der Compiler
// Diese Procedure gibt es, aber die steht irgendwo weiter hinten im Code
procedure Datei;
begin
Anzeigen; // kennt der Compiler normalerweise nicht, da diese Procedure erst später (dahinter) kommt.
end;
Procedure Anzeigen;
begin
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Datei;
end;
oder aber Du nimmst die Proceduren direkt in das Formular mit auf:
type
TForm1 = class(TForm)
BTNeueGrp: TButton;
BTLoeschen: TButton;
BTAbbEnde: TButton;
.......
procedure EDTGrpNrExit(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Anzeigen; // gehört nun zu TForm1
procedure Datei; // gehört nun zu TForm1
..........
// Dann musst Du aber noch vor deine Proceduren TForm1 schreiben
procedure TForm1.Datei; // hier also zusätzlich TForm1.
begin
if not FileExists('Gruppen.rec') then
begin
AssignFile(GrpDatei,'Gruppen.rec');
Rewrite(GrpDatei);
CloseFile(GrpDatei);
ShowMessage('Die Datei "Gruppen.rec" wurde angelegt. Denken Sie an eine regelmäßige Sicherung - Bitte Taste drücken');
repeat until KeyPressed;
end;
Anzeigen;
end;
procedure TForm1.Anzeigen; // hier also auch TForm1. vorne dran.
var item : TListItem;
i: integer;
begin
Datum:=FormatDateTime('DD.MM.YYYY',Date);
Form1.LVGruppen.Items.Clear
............
end;
Grüße von Siro Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...