Typisierte Dateien

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
RSO
Beiträge: 19
Registriert: Mi 9. Feb 2022, 22:43

Typisierte Dateien

Beitrag von RSO »

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.
fehler_dateiV.jpg
fehler_dateiV.jpg (100.69 KiB) 1906 mal betrachtet

chmod222
Beiträge: 14
Registriert: Do 19. Aug 2021, 17:29

Re: Typisierte Dateien

Beitrag von chmod222 »

Der compiler akzeptiert dies wenn du ihn im Delphi-Modus kompilieren lässt.

Code: Alles auswählen

{$MODE delphi}
Im Standard-Modi fpc oder objfpc erlaubt er das duplizieren von Feldnamen nicht.

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: Typisierte Dateien

Beitrag von Winni »

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

RSO
Beiträge: 19
Registriert: Mi 9. Feb 2022, 22:43

Re: Typisierte Dateien

Beitrag von RSO »

Hallo,

vielen Dank, die Compilerdirektive wars. Mit {$mode Delphi} klappts

Grüsse, Raimund

PascalDragon
Beiträge: 825
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

Beitrag von PascalDragon »

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.
Ja, in Delphi funktioniert das. Und in FPC funktioniert das auch, wenn der Delphi-Modus genutzt wird.
FPC Compiler Entwickler

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: Typisierte Dateien

Beitrag von Winni »

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

Interessehalber:

Code: Alles auswählen

DateiV : file of dat;
DateiV: file of re2;
Und wie unterscheidet er die beiden?
Das kan doch nur im assignFile passieren, oder?

Winni

RSO
Beiträge: 19
Registriert: Mi 9. Feb 2022, 22:43

Re: Typisierte Dateien

Beitrag von RSO »

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

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}

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: Typisierte Dateien

Beitrag von Winni »

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

RSO
Beiträge: 19
Registriert: Mi 9. Feb 2022, 22:43

Re: Typisierte Dateien

Beitrag von RSO »

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

PascalDragon
Beiträge: 825
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

Beitrag von PascalDragon »

Winni hat geschrieben:
Sa 19. Feb 2022, 19:47
Interessehalber:

Code: Alles auswählen

DateiV : file of dat;
DateiV: file of re2;
Und wie unterscheidet er die beiden?
Das kan doch nur im assignFile passieren, oder?
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:

Code: Alles auswählen

FileA: file of UInt8;
FileB: file of Int8;
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.
Das ist normales Scopehandling, dass du auch mit Units jederzeit haben kannst.
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

RSO
Beiträge: 19
Registriert: Mi 9. Feb 2022, 22:43

Re: Typisierte Dateien

Beitrag von RSO »

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

Raimund

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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

Beitrag von af0815 »

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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Typisierte Dateien

Beitrag von Warf »

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.

PascalDragon
Beiträge: 825
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

Beitrag von PascalDragon »

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

RSO
Beiträge: 19
Registriert: Mi 9. Feb 2022, 22:43

Re: Typisierte Dateien

Beitrag von RSO »

Hi,

vielen Dank für die Mühe, mir einiges zu erklären. :idea:

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

Antworten