Position von Proceduren

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Position von Proceduren

Beitrag von Joachim Raap »

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 :roll:
Gruß und Danke

Benutzeravatar
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

Beitrag von Winni »

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

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: Position von Proceduren

Beitrag von wp_xyz »

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?

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Position von Proceduren

Beitrag von Joachim Raap »

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.

PascalDragon
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

Beitrag von PascalDragon »

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.
FPC Compiler Entwickler

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Position von Proceduren

Beitrag von theo »

Du suchst wahrscheinlich "forward".
https://www.freepascal.org/docs-html/ref/refse97.html

Ich würde aber Klassenmethoden machen.

Mathias
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

Beitrag von Mathias »

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ß


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.
Bitte entferne die Unit Crt und das

Code: Alles auswählen

repeat until KeyPressed;
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

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: Position von Proceduren

Beitrag von wp_xyz »

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.

siro
Beiträge: 732
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Position von Proceduren

Beitrag von siro »

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 :wink: )

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;

 
oder aber Du nimmst die Proceduren direkt in das Formular mit auf:

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...

Antworten