Typisierte Dateien
Typisierte Dateien
Hallo,
dieses ist mein erster Beitrag. Nach ca. 20 Jahren habe ich ein altes Delphi4 Projekt
auf der Festplatte ausgegraben. Es eignet sich ganz gut, um es auf Lazarus umzubauen.
Ich bin Hobbyprogrammierer und muss mich noch in die vielen Eigenheiten von Lazarus vs. Delphi einarbeiten.
Darum muß ich hier im Forum hin und wieder mal meine Anfängerfragen stellen.
In Delphi4 wird der doppelte Bezeichner 'DateiV' in der typisierten Datei akzeptiert. Ich glaube ich habe das mal
objektorientiert angelegt.
Warum akzetiert der Kompiler von Lazarus das nicht?
Vielen Dank für Eure Hilfe.
dieses ist mein erster Beitrag. Nach ca. 20 Jahren habe ich ein altes Delphi4 Projekt
auf der Festplatte ausgegraben. Es eignet sich ganz gut, um es auf Lazarus umzubauen.
Ich bin Hobbyprogrammierer und muss mich noch in die vielen Eigenheiten von Lazarus vs. Delphi einarbeiten.
Darum muß ich hier im Forum hin und wieder mal meine Anfängerfragen stellen.
In Delphi4 wird der doppelte Bezeichner 'DateiV' in der typisierten Datei akzeptiert. Ich glaube ich habe das mal
objektorientiert angelegt.
Warum akzetiert der Kompiler von Lazarus das nicht?
Vielen Dank für Eure Hilfe.
Re: Typisierte Dateien
Der compiler akzeptiert dies wenn du ihn im Delphi-Modus kompilieren lässt.
Im Standard-Modi fpc oder objfpc erlaubt er das duplizieren von Feldnamen nicht.
Code: Alles auswählen
{$MODE delphi}
- 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: Typisierte Dateien
Hi!
Das erste Auftreten von DateiV ist innerhalb der Klasse TMyDatei.
fProfileDatei ist Erbe der Klasse TMyDatei.
Innerhalb von fProfileDatei wird wieder DateiV definiert. Das gibt es aber schon - geerbt von TMyDatei.
Ich glaube nicht, dass das in Delphi funktioniert, kann es aber nicht testen, da ich keins mehr besitze.
Winni
Das erste Auftreten von DateiV ist innerhalb der Klasse TMyDatei.
fProfileDatei ist Erbe der Klasse TMyDatei.
Innerhalb von fProfileDatei wird wieder DateiV definiert. Das gibt es aber schon - geerbt von TMyDatei.
Ich glaube nicht, dass das in Delphi funktioniert, kann es aber nicht testen, da ich keins mehr besitze.
Winni
Re: Typisierte Dateien
Hallo,
vielen Dank, die Compilerdirektive wars. Mit {$mode Delphi} klappts
Grüsse, Raimund
vielen Dank, die Compilerdirektive wars. Mit {$mode Delphi} klappts
Grüsse, Raimund
-
- Beiträge: 954
- 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: Typisierte Dateien
Ja, in Delphi funktioniert das. Und in FPC funktioniert das auch, wenn der Delphi-Modus genutzt wird.Winni hat geschrieben: Fr 18. Feb 2022, 19:44 Ich glaube nicht, dass das in Delphi funktioniert, kann es aber nicht testen, da ich keins mehr besitze.
FPC Compiler Entwickler
- 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: Typisierte Dateien
HI!PascalDragon hat geschrieben: Sa 19. Feb 2022, 18:01 Ja, in Delphi funktioniert das. Und in FPC funktioniert das auch, wenn der Delphi-Modus genutzt wird.
Interessehalber:
Code: Alles auswählen
DateiV : file of dat;
DateiV: file of re2;
Das kan doch nur im assignFile passieren, oder?
Winni
Re: Typisierte Dateien
Hallo Winni,
ich hatte mich vor sehr langer Zeit mal mit OOP ObjektPascal beschäftigt und ein
Rechenprogramm für Tragflügel programmiert, das ich jetzt gerne auf Lazarus portieren möchte.
Ob ich das hinbekomme? Mal schauen, ich gebe alles
Das sind zwei Dateiroutinen für die Modelldaten und für die Profildaten die in zwei Instanzen? laufen.
TDatedatei und TProfilDatei.
Raimund
procedure TDatenDatei.laden;
begin
dateiname1 := Dateiform.edit1.text;
root1 := (expandFileName(dateiname1)); {Pfad ermitteln}
dateiform.pfadname.caption := root1;
MessageDlg('Ich lade: '+ root1, mtInformation,[mbNo, mbYes],0);
assignFile(DateiV, root1); {Pfad verbinden}
{$i-}
reset(DateiV); {Datei öffnen}
{$i+}
if IOResult <> 0 then
begin
MessageDlg('Fehler bei Dateibehandlung! ',mtError,[mbok],0);
exit;
end;
begin
while not eof(DateiV) do {bis Dateiende}
read(DateiV,pdat^); {Werte lesen}
closeFile(DateiV); {Datei schließen}
end;{if}
end;{proz}
________________________________________________
procedure TProfilDatei.laden;
begin
profil32.felderleeren;{verlagert aus prof2, da Probleme beim speichern}
dateiname1 := Dateiform.edit1.text;
root1 := (expandFileName(dateiname1)); {Pfad ermitteln}
dateiform.pfadname.caption := root1;
MessageDlg('Ich lade: '+ root1, mtInformation,[mbNo, mbYes],0);
assignFile(DateiV, root1); {Pfad verbinden}
{$i-}
reset(DateiV); {Datei öffnen}
{$i+}
if IOResult <> 0 then
begin
MessageDlg('Fehler bei Dateibehandlung! ',mtError,[mbok],0);
exit;
end;
begin
while not eof(DateiV) do {bis Dateiende}
read(DateiV,rewerte); {globaler Record aus prof1}
closeFile(DateiV); {Datei schließen}
end;{if}
end;{proz}
ich hatte mich vor sehr langer Zeit mal mit OOP ObjektPascal beschäftigt und ein
Rechenprogramm für Tragflügel programmiert, das ich jetzt gerne auf Lazarus portieren möchte.
Ob ich das hinbekomme? Mal schauen, ich gebe alles

Das sind zwei Dateiroutinen für die Modelldaten und für die Profildaten die in zwei Instanzen? laufen.
TDatedatei und TProfilDatei.
Raimund
procedure TDatenDatei.laden;
begin
dateiname1 := Dateiform.edit1.text;
root1 := (expandFileName(dateiname1)); {Pfad ermitteln}
dateiform.pfadname.caption := root1;
MessageDlg('Ich lade: '+ root1, mtInformation,[mbNo, mbYes],0);
assignFile(DateiV, root1); {Pfad verbinden}
{$i-}
reset(DateiV); {Datei öffnen}
{$i+}
if IOResult <> 0 then
begin
MessageDlg('Fehler bei Dateibehandlung! ',mtError,[mbok],0);
exit;
end;
begin
while not eof(DateiV) do {bis Dateiende}
read(DateiV,pdat^); {Werte lesen}
closeFile(DateiV); {Datei schließen}
end;{if}
end;{proz}
________________________________________________
procedure TProfilDatei.laden;
begin
profil32.felderleeren;{verlagert aus prof2, da Probleme beim speichern}
dateiname1 := Dateiform.edit1.text;
root1 := (expandFileName(dateiname1)); {Pfad ermitteln}
dateiform.pfadname.caption := root1;
MessageDlg('Ich lade: '+ root1, mtInformation,[mbNo, mbYes],0);
assignFile(DateiV, root1); {Pfad verbinden}
{$i-}
reset(DateiV); {Datei öffnen}
{$i+}
if IOResult <> 0 then
begin
MessageDlg('Fehler bei Dateibehandlung! ',mtError,[mbok],0);
exit;
end;
begin
while not eof(DateiV) do {bis Dateiende}
read(DateiV,rewerte); {globaler Record aus prof1}
closeFile(DateiV); {Datei schließen}
end;{if}
end;{proz}
- 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: Typisierte Dateien
Hi!
Also kann er erst bei der Zuweisung der Varible bei read feststellen, welche der beiden DateiV gemeint ist - oder?
Das Verkompliziert doch den Compiler unnötig. Und birgt die Gefahr, dass man selbst den Überblick verliert. Es ist keine gute Entscheidung, dass Delphi derartiges erlaubt.
Winni
Also kann er erst bei der Zuweisung der Varible bei read feststellen, welche der beiden DateiV gemeint ist - oder?
Das Verkompliziert doch den Compiler unnötig. Und birgt die Gefahr, dass man selbst den Überblick verliert. Es ist keine gute Entscheidung, dass Delphi derartiges erlaubt.
Winni
Re: Typisierte Dateien
Hallo Winni,
vielen Dank für den Tip!
Das Programm ist mal vor langer Zeit entstanden und die Vorlage dazu war
bestimmt in irgend einem ObjectPascal Buch. Da habe ich immer mal verschiedene
Varianten ausprobiert. Learning by doing. Der Weg ist das Ziel.
Internetforen gabs zu der Zeit noch nicht.
Das ist ja heute viel besser mit dem Forum, wo man auch mal die Programmierprofis fragen kann.
Raimund
vielen Dank für den Tip!
Das Programm ist mal vor langer Zeit entstanden und die Vorlage dazu war
bestimmt in irgend einem ObjectPascal Buch. Da habe ich immer mal verschiedene
Varianten ausprobiert. Learning by doing. Der Weg ist das Ziel.
Internetforen gabs zu der Zeit noch nicht.
Das ist ja heute viel besser mit dem Forum, wo man auch mal die Programmierprofis fragen kann.
Raimund
-
- Beiträge: 954
- 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: Typisierte Dateien
Der relevante Teil ist die Größe des Typs, damit Routinen wie Read oder Write wissen, in welcher Größe gelesen werden soll. Der Rest ist einfach nur stupides Arbeiten mit Zeigern auf den Puffer. Man kann zum Beispiel ohne Probleme folgende Typen auf die gleiche Datei loslassen:Winni hat geschrieben: Sa 19. Feb 2022, 19:47 Interessehalber:
Und wie unterscheidet er die beiden?Code: Alles auswählen
DateiV : file of dat; DateiV: file of re2;
Das kan doch nur im assignFile passieren, oder?
Code: Alles auswählen
FileA: file of UInt8;
FileB: file of Int8;
Das ist normales Scopehandling, dass du auch mit Units jederzeit haben kannst.Winni hat geschrieben: Sa 19. Feb 2022, 21:20 Also kann er erst bei der Zuweisung der Varible bei read feststellen, welche der beiden DateiV gemeint ist - oder?
Das Verkompliziert doch den Compiler unnötig. Und birgt die Gefahr, dass man selbst den Überblick verliert. Es ist keine gute Entscheidung, dass Delphi derartiges erlaubt.
TDatenDatei selbst hat kein Feld mit dem Namen DateiV, also nutzt TDatenDatei.Laden das Feld aus TMyDatei. TProfilDatei wiederum enthält ein eigenes DateiV Feld und TProfilDatei.Laden nutzt dann dieses. Würde jedoch eine Methode von TMyDatei ebenfalls auf DateiV zugreifen (tun sie ja nicht, da alle abstract sind), dann würde diese auch bei einer Instanz von TProfilDatei auf TMyDatei.DateiV zugreifen und nicht TProfilDatei.DateiV, da TMyDatei das von TProfilDatei ja nicht kennt.
FPC Compiler Entwickler
Re: Typisierte Dateien
Hi PascalDragon,
super erklärt. Aber warum muß in Lazarus die Compilerdirektive auf
{$mode Delphi} gesetzt werden, obwohl der Lazaruscompiler auch OOP kann?
(Anfängerfrage)
Raimund
super erklärt. Aber warum muß in Lazarus die Compilerdirektive auf
{$mode Delphi} gesetzt werden, obwohl der Lazaruscompiler auch OOP kann?
(Anfängerfrage)

Raimund
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Typisierte Dateien
Eben weil der Compiler OOP kann und im Mode Delphi unlogische Sachen von einer anderen IDE erlaubt werden. Im normalen Modus werden syntaktische Elemente wesentlich genauer (für mich logischer) geprüft.
Genaugenommen ist das Verhalten von fpc nachvollziehbar. Es wird eine Variable mit einen anderen Typ redefiniert. Das ist eine Quelle für Probleme. Das sollte meiner Meinung nach im Quellcode überdacht werden.
Genaugenommen ist das Verhalten von fpc nachvollziehbar. Es wird eine Variable mit einen anderen Typ redefiniert. Das ist eine Quelle für Probleme. Das sollte meiner Meinung nach im Quellcode überdacht werden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Typisierte Dateien
FreePascal (Mode ObjFPC) und Delphi sind zwei verschiedene ObjectPascal Dialekte. Der FPC unterstützt beide (sowie noch ne menge anderer Dialekte) damit code aus anderen Projekten Kompatibel ist und weiter verwendet werden kann (man kann auch verschiedene Units mit verschiedenen Dialekten zusammen nutzen).
Im großen und ganzen sind die Zwei dialekte sehr kompatibel, doch es hat so ein paar eigenheiten. Vor allem neuere Features werden eher unabbhängig gebaut z.B. Operator überladung, da benutzt Delphi Namen für die Operatoren und FPC benutzt die symbole.
Im großen und ganzen sind die Zwei dialekte sehr kompatibel, doch es hat so ein paar eigenheiten. Vor allem neuere Features werden eher unabbhängig gebaut z.B. Operator überladung, da benutzt Delphi Namen für die Operatoren und FPC benutzt die symbole.
-
- Beiträge: 954
- 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: Typisierte Dateien
Wie die anderen bereits erklärt haben: weil der Standarddialekt von Lazarus (ObjFPC) ein paar Sachen anders macht, als Delphi. Dazu zählt eben unter anderem das mit der doppelten Nutzung von Symbolen in Methoden oder Kindklassen, die Verwendung von @ für Funktions-/Methodenzeiger oder dass Operatorenüberladungen Symbole (+, -, etc.) statt Bezeichner (Add, Subtract, etc.) verwenden. Gibt noch ein paar mehr solche Unterschiede, aber wenn man Delphi Code portiert, dann sollte man auch den entsprechenden Sprachmodus verwenden, dafür ist er ja gedacht...RSO hat geschrieben: So 20. Feb 2022, 19:03 super erklärt. Aber warum muß in Lazarus die Compilerdirektive auf
{$mode Delphi} gesetzt werden, obwohl der Lazaruscompiler auch OOP kann?
(Anfängerfrage)![]()
FPC Compiler Entwickler
Re: Typisierte Dateien
Hi,
vielen Dank für die Mühe, mir einiges zu erklären.
Jetzt baue ich langsam die Anwendung um. Einige Komponenten aus Delphi muß ich
nach Lazarus umtauschen. Wenn die gefühlt 1000 Fehlermeldungen beseitigt sind, kann
ich dann den Quellcode überarbeiten.
Raimund
vielen Dank für die Mühe, mir einiges zu erklären.

Jetzt baue ich langsam die Anwendung um. Einige Komponenten aus Delphi muß ich
nach Lazarus umtauschen. Wenn die gefühlt 1000 Fehlermeldungen beseitigt sind, kann
ich dann den Quellcode überarbeiten.
Raimund