Position von Proceduren
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Position von Proceduren
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
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
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: Position von Proceduren
Hi!
Grundkurs Lazarus:
Button auf Formular plazieren
Entweder:
Doppelklick auf Button (leider hakelig)
Oder:
Objektinspektor -->Button -->Event-->OnClick
In beiden Fällen wird
* 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.
Winni
Grundkurs Lazarus:
Button auf Formular plazieren
Entweder:
Doppelklick auf Button (leider hakelig)
Oder:
Objektinspektor -->Button -->Event-->OnClick
In beiden Fällen wird
* 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.
Winni
Re: Position von Proceduren
Hier gibt es einen kleinen Mini-Kurs für die Bedienung der Lazarus-IDE für Anfänger: https://lazplanet.blogspot.com/p/beginners-guide.html (englisch).
Oder auf deutsch, das (unvollendete) Buch von Forumsmitglied Socke: download/file.php?id=2182
Es gibt sicher noch ein paar mehr. Aber eine Suchmaschine befragen kannst du doch selber, oder?
Oder auf deutsch, das (unvollendete) Buch von Forumsmitglied Socke: download/file.php?id=2182
Es gibt sicher noch ein paar mehr. Aber eine Suchmaschine befragen kannst du doch selber, oder?
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Position von Proceduren
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ß
unit Gruppen;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls,
Crt;
type
TForm1 = class(TForm)
BTNeueGrp: TButton;
BTLoeschen: TButton;
BTAbbEnde: TButton;
BTAendern: TButton;
EDTGrpKto: TEdit;
EDTGrpNr: TEdit;
EDTGrpName: TEdit;
EDTMonUms: TEdit;
EDTJahresUms: TEdit;
LBLGrpKto: TLabel;
LBLMeldung: TLabel;
LBLGrpNr: TLabel;
LBLGrpName: TLabel;
LBLMonUms: TLabel;
LBLJahresUms: TLabel;
LVGruppen: TListView;
procedure BTAbbEndeClick(Sender: TObject);
procedure BTNeueGrpClick(Sender: TObject);
procedure EDTGrpNameClick(Sender: TObject);
procedure EDTGrpNameExit(Sender: TObject);
procedure EDTGrpNrClick(Sender: TObject);
procedure EDTGrpNrExit(Sender: TObject);
procedure FormShow(Sender: TObject);
private
public
end;
TGrpSatz = record
GrpNr: integer;
GrpName: String[20];
GrpKto: String[3];
GrpMonUms: real;
GrpJahrUms: real;
Sort: integer;
Aktiv:byte;
Anlage: TDateTime;
end;
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 InitRecFelder;
begin
GrpSatz1.GrpNr:=0;
GrpSatz1.GrpName:='';
GrpSatz1.GrpKto:='';
GrpSatz1.GrpMonUms:=0;
GrpSatz1.GrpJahrUms:=0;
GrpSatz1.Sort:=0;
GrpSatz2.GrpNr:=0;
GrpSatz2.GrpName:='';
GrpSatz2.GrpKto:='';
GrpSatz2.GrpMonUms:=0;
GrpSatz2.GrpJahrUms:=0;
GrpSatz2.Sort:=0;
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;
end.
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ß
unit Gruppen;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls,
Crt;
type
TForm1 = class(TForm)
BTNeueGrp: TButton;
BTLoeschen: TButton;
BTAbbEnde: TButton;
BTAendern: TButton;
EDTGrpKto: TEdit;
EDTGrpNr: TEdit;
EDTGrpName: TEdit;
EDTMonUms: TEdit;
EDTJahresUms: TEdit;
LBLGrpKto: TLabel;
LBLMeldung: TLabel;
LBLGrpNr: TLabel;
LBLGrpName: TLabel;
LBLMonUms: TLabel;
LBLJahresUms: TLabel;
LVGruppen: TListView;
procedure BTAbbEndeClick(Sender: TObject);
procedure BTNeueGrpClick(Sender: TObject);
procedure EDTGrpNameClick(Sender: TObject);
procedure EDTGrpNameExit(Sender: TObject);
procedure EDTGrpNrClick(Sender: TObject);
procedure EDTGrpNrExit(Sender: TObject);
procedure FormShow(Sender: TObject);
private
public
end;
TGrpSatz = record
GrpNr: integer;
GrpName: String[20];
GrpKto: String[3];
GrpMonUms: real;
GrpJahrUms: real;
Sort: integer;
Aktiv:byte;
Anlage: TDateTime;
end;
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 InitRecFelder;
begin
GrpSatz1.GrpNr:=0;
GrpSatz1.GrpName:='';
GrpSatz1.GrpKto:='';
GrpSatz1.GrpMonUms:=0;
GrpSatz1.GrpJahrUms:=0;
GrpSatz1.Sort:=0;
GrpSatz2.GrpNr:=0;
GrpSatz2.GrpName:='';
GrpSatz2.GrpKto:='';
GrpSatz2.GrpMonUms:=0;
GrpSatz2.GrpJahrUms:=0;
GrpSatz2.Sort:=0;
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;
end.
-
- Beiträge: 834
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: Position von Proceduren
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:14Hallo 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)
FPC Compiler Entwickler
Re: Position von Proceduren
Du suchst wahrscheinlich "forward".
https://www.freepascal.org/docs-html/ref/refse97.html
Ich würde aber Klassenmethoden machen.
https://www.freepascal.org/docs-html/ref/refse97.html
Ich würde aber Klassenmethoden machen.
-
- Beiträge: 6207
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Position von Proceduren
Bitte entferne die Unit Crt und dasJoachim Raap hat geschrieben: ↑So 23. Okt 2022, 17:14Hallo 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ß
Code: Alles auswählen
unit Gruppen; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls, Crt; type TForm1 = class(TForm) BTNeueGrp: TButton; BTLoeschen: TButton; BTAbbEnde: TButton; BTAendern: TButton; EDTGrpKto: TEdit; EDTGrpNr: TEdit; EDTGrpName: TEdit; EDTMonUms: TEdit; EDTJahresUms: TEdit; LBLGrpKto: TLabel; LBLMeldung: TLabel; LBLGrpNr: TLabel; LBLGrpName: TLabel; LBLMonUms: TLabel; LBLJahresUms: TLabel; LVGruppen: TListView; procedure BTAbbEndeClick(Sender: TObject); procedure BTNeueGrpClick(Sender: TObject); procedure EDTGrpNameClick(Sender: TObject); procedure EDTGrpNameExit(Sender: TObject); procedure EDTGrpNrClick(Sender: TObject); procedure EDTGrpNrExit(Sender: TObject); procedure FormShow(Sender: TObject); private public end; TGrpSatz = record GrpNr: integer; GrpName: String[20]; GrpKto: String[3]; GrpMonUms: real; GrpJahrUms: real; Sort: integer; Aktiv:byte; Anlage: TDateTime; end; 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 InitRecFelder; begin GrpSatz1.GrpNr:=0; GrpSatz1.GrpName:=''; GrpSatz1.GrpKto:=''; GrpSatz1.GrpMonUms:=0; GrpSatz1.GrpJahrUms:=0; GrpSatz1.Sort:=0; GrpSatz2.GrpNr:=0; GrpSatz2.GrpName:=''; GrpSatz2.GrpKto:=''; GrpSatz2.GrpMonUms:=0; GrpSatz2.GrpJahrUms:=0; GrpSatz2.Sort:=0; 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; end.
Code: Alles auswählen
repeat until KeyPressed;
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
Mit Java und C/C++ sehe ich rot
Re: Position von Proceduren
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.PascalDragon hat geschrieben: ↑So 23. Okt 2022, 17:17Nutze bitte [ code ] Tags (ohne Leerzeichen) und umgib deinen Code damit, damit sowas im Forum besser lesbar bleibt.
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: Position von Proceduren
Die Procedure Datei ruft Anzeigen auf.
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:
oder aber Du nimmst die Proceduren direkt in das Formular mit auf:
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:
Code: Alles auswählen
{ 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;
Code: Alles auswählen
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...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...