Assign....

Für Fragen von Einsteigern und Programmieranfängern...
Mathias
Beiträge: 6207
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Assign....

Beitrag von Mathias »

Ich habe gerade folgendes probiert und funktioniert.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  f: Text;
begin
  system.Assign(f, 'test.txt');
  Rewrite(f);
  WriteLn(f, 'Hello World');
  system.Close(f);
end;  
Was mir aber ein Rätsel ist, wieso muss ich "system" hinschreiben ?
Normalerweise kann doch FPC Funktionen überlagern.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Beitrag von af0815 »

Mathias hat geschrieben:
Mo 7. Nov 2022, 08:22
Was mir aber ein Rätsel ist, wieso muss ich "system" hinschreiben ?
Normalerweise kann doch FPC Funktionen überlagern.
Ja, aber wenn es die selbe Funktion mit anderer Bedeutung in einer anderen Unit gibt, so muss man das sagen, sonst kommt es auch auf die Reihenfolge in der Uses an bzw. weis der Compiler nicht welche Funktion du wirklich willst.

Assign wird auch bei Objekten für die Zuweisung verwendet UND in der Dateiverwaltung (aus historisch Gründen) deswegen sollte man AssignFile verwenden. Das wurde für die Vermeidung von Doppeldeutigkeiten IMHO eingeführt. Mit System.Assign verweist du genauso auf das richtige Assign.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Assign....

Beitrag von theo »

Mathias hat geschrieben:
Mo 7. Nov 2022, 08:22
Was mir aber ein Rätsel ist, wieso muss ich "system" hinschreiben ?
Normalerweise kann doch FPC Funktionen überlagern.
Die kommen halt aus ganz verschiedenen "Welten"
Assign und Close sind einerseits normale Prozeduren in "System" und andererseits Methoden von TForm (TPersistent, TCustomForm in den Units Classes, Forms).
Das Problem besteht ja nur innerhalb einer Klassenmethode.
Eigentlich hätte man das bei TPersistent anders benennen sollen imo, denn das File Zeug dürfte älter sein.
Aber gut, wer benutzt schon noch das alte Pascal File-Handling? :wink:

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

Beitrag von Winni »

Hi!

Hier hast Du mal eine Mini-Unit, die zeigt, wie es geht:

Code: Alles auswählen

unit Fsize1;
{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, fileUtil;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation
{$R *.lfm}

const fname = './FSomething';

TYPE
TSomething = record
               Erna: LongInt;
               Karl: DWord;
             end;

var FsomeThing : File of TSomething;
    Some : TSomething;

procedure TForm1.Button1Click(Sender: TObject);
var  len: int64;
begin
if FileExists (fname) then
    DeleteFile(fname);
assignFile (FsomeThing,fname);
rewrite (FsomeThing);
write (FsomeThing, some);
closefile (FsomeThing);
len := filesize (fname);
showMessage (InttoStr(len)+' bytes');
end;

end.

Winni

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

Beitrag von PascalDragon »

Mathias hat geschrieben:
Mo 7. Nov 2022, 08:22
Was mir aber ein Rätsel ist, wieso muss ich "system" hinschreiben ?
Normalerweise kann doch FPC Funktionen überlagern.
Die Elternklassen von TCustomForm stellen ebenfalls Assign und Close zur Verfügung. Wenn der Compiler eine Methode mit gleichen Namen, aber eventuell unpassender Signature findet, dann sucht er nicht noch in anderen Units nach normalen Funktionen oder Prozeduren weiter. Das ist so seit Klassen in Delphi 1 eingeführt wurden. Deswegen wurden auch die Aliase AssignFile und CloseFile eingeführt, um das zu umgehen.
FPC Compiler Entwickler

Antworten