Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi variabler Datentyp (https://www.delphipraxis.net/147889-variabler-datentyp.html)

vsilverlord 18. Feb 2010 11:36


variabler Datentyp
 
hallo leute,
ich habe wieder das gleiche Problem wie neulich, mit dem Unterschied, dass das nun wirklich lösbar sein muss. Ich hab hier eine Routine, die eine Integer Zahl an eine Datei ranhängt, und nun möchte ich das so umschreiben, dass ich das für einen beliebigen Typ nutzen kann! (also auch für extended o.ä.)

Delphi-Quellcode:
procedure appandinteger(zahl: integer; path: string; Dateiname: string);
var
datei: file of integer;
begin
  AssignFile(datei, path+'\'+Dateiname+'.dat');
  if FileExists(path+'\'+Dateiname+'.dat') then ReSet(datei)
  else ReWrite(datei);

  Seek(datei, FileSize(datei));
  write(datei, zahl);
  CloseFile(datei);
end;
so würde ich das jetzt für extended machen, aber da das bis auf den typ das gleiche ist, würde ich das gerne generalisieren:

Delphi-Quellcode:
procedure appandextended(zahl: extended; path: string; Dateiname: string);
var
datei: file of extended;
begin
  AssignFile(datei, path+'\'+Dateiname+'.dat');
  if FileExists(path+'\'+Dateiname+'.dat') then ReSet(datei)
  else ReWrite(datei);

  Seek(datei, FileSize(datei));
  write(datei, zahl);
  CloseFile(datei);
end;

s-off 18. Feb 2010 11:50

Re: variabler Datentyp
 
variant

himitsu 18. Feb 2010 11:56

Re: variabler Datentyp
 
Oder überladene Prozeduren.

Neutral General 18. Feb 2010 12:06

Re: variabler Datentyp
 
Hatte gerade an etwas wie generische Prozeduren gedacht, aber scheinbar gibt es soetwas nicht:

Delphi-Quellcode:
procedure AppendTo<T>(ADatei: String; AValue: <T>);
var datei: file of <T>;
begin
  AssignFile(datei, ADatei);
  if FileExists(ADatei) then ReSet(datei)
  else ReWrite(datei);

  Seek(datei, FileSize(datei));
  write(datei, zahl);
  CloseFile(datei);
end;

// Aufruf
AppendTo<Integer>('Test.txt',10);
AppendTo<String>('Test.txt','Hallo Welt!');
Warum eigentlich nicht? Wäre doch ganz praktisch in manchen Fällen..

Uwe Raabe 18. Feb 2010 12:40

Re: variabler Datentyp
 
Es geht schon, nur etwas anders:

Delphi-Quellcode:
type
  TFile<T> = class
  public
    class procedure Append(zahl: T; const path: string; const Dateiname: string);
  end;

class procedure TFile<T>.Append(zahl: T; const path: string; const Dateiname: string);
var
  datei: file;
  fullName: string;
begin
  fullName := path+'\'+Dateiname+'.dat';
  AssignFile(datei, fullName);
  if FileExists(fullName) then begin
    Reset(datei, Sizeof(T));
    Seek(datei, FileSize(datei));
  end
  else begin
    Rewrite(datei, Sizeof(T));
  end;

  BlockWrite(datei, zahl, 1);
  CloseFile(datei);
end;

TFile<Integer>.Append(5, 'C:\temp', 'integer');
TFile<Extended>.Append(0.5, 'C:\temp', 'extended');

SirThornberry 18. Feb 2010 12:44

Re: variabler Datentyp
 
Oder einfach einen Pointer verwenden und die Größe mitgeben.

Neutral General 18. Feb 2010 12:56

Re: variabler Datentyp
 
Zitat:

Zitat von SirThornberry
Oder einfach einen Pointer verwenden und die Größe mitgeben.

Dann am besten (weil bequemsten) als var-Parameter:

Delphi-Quellcode:
procedure AppendData(var Data; Size: Cardinal);
Also quasi sowas wie Stream.Write.

Uwe Raabe 18. Feb 2010 13:10

Re: variabler Datentyp
 
Zitat:

Zitat von Neutral General
Zitat:

Zitat von SirThornberry
Oder einfach einen Pointer verwenden und die Größe mitgeben.

Dann am besten (weil bequemsten) als var-Parameter:

Delphi-Quellcode:
procedure AppendData(var Data; Size: Cardinal);

Dann kann man aber keine Konstanten oder Funktionsergebnisse schreiben.

Neutral General 18. Feb 2010 13:20

Re: variabler Datentyp
 
Geht beides auch mit

Delphi-Quellcode:
procedure AppendData(Data: Pointer; Size: Cardinal);
nicht.

himitsu 18. Feb 2010 13:28

Re: variabler Datentyp
 
Zitat:

Zitat von Uwe Raabe
Dann kann man aber keine Konstanten oder Funktionsergebnisse schreiben.

Typisierte Konstanten sollten gehn, da sie ähnlich einer Variable verwaltet werden

Und notfalls kann man auch nachträglich typisieren

sowas müßte also gehn:
Delphi-Quellcode:
const s = '123';
  ts: String = '456';

function WriteS(var s);
...

function x: String;
...

WriteS(ts);
WriteS(String(s));
WriteS(String(x));
und hier würde man wohl das Resut kopieren und nicht einen Pointer ala @test:
Delphi-Quellcode:
function test: Integer;
MoveMemory(@i, @Integer(test), SizeOf(Integer));


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:23 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz