Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Variable in einem Record mit defaultwert (https://www.delphipraxis.net/3546-variable-einem-record-mit-defaultwert.html)

Maa83 18. Mär 2003 12:43


Variable in einem Record mit defaultwert
 
Hallole

ich hät da mal ne kleine Frage:
ist es möglich bei einer Recorddeklaration eine Variable mit einem defaultwert zu versehen?

also z.B.
Delphi-Quellcode:
type test=record
   var1: String;
   var2: Integer;
   var3: Boolean = true;  //Oder irgendwie sowas
end;
mfg
Maa

[EDIT=Luckie'chen]Delphi-Tags hinzugefügt, beim nächsten mal bitte selber machen, danke[/EDIT]

Chewie 18. Mär 2003 12:46

Probier es doch aus! Wenn es geht, dann so, wie du es geschrieben hast.

Maa83 18. Mär 2003 15:10

danke für deinen Post hat mir sehr weit geholfen...
meinst du ich probier das ganze nicht aus bevor ich hier was poste

das Beispiel soll meinen Versuch zeigen...

also weiss irgendjemand wie das geht???

jbg 18. Mär 2003 16:21

Für alle Variablen vom Typ test geht das nicht. Du kannst aber eine Konstante deklarieren und diese dann immer zuweisen.
Delphi-Quellcode:
const testDefault: test = (
  var1: '';
  var2: 0;
  var3: True
);
...

var t: test;
begin
  t := testDefault;
  ShowMessage(IntToStr(Ord(t.var3)));
end;

Specialwork 18. Mär 2003 16:52

Hallo Maa83,

Wenn Du nicht unbedingt auf Records angewiesen bist, dann versuche es mal so :

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, StdCtrls, Classes,
  Controls, Forms;

type TTest=class(TObject)
private
   fString: String;
   fInteger: Integer;
   fBoolean: Boolean;
public
   constructor Create;
   property VarString: String read fString write fString;
   property VarInteger: Integer read fInteger write fInteger;
   property VarBoolean: Boolean read fBoolean write fBoolean;
end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TTest.Create;
begin
  inherited Create;

  VarString :='Tom';
  VarInteger :=989;
  VarBoolean :=True;
end;


procedure TForm1.Button1Click(Sender: TObject);
var Test: TTest;
begin
  Test:=TTest.Create; // <- Hier werden die Defaults gesetzt
 
  Memo1.Lines.Clear;
  Memo1.Lines.Add('VarString:='+Test.fString);
  Memo1.Lines.Add('VarInteger:='+inttostr(Test.fInteger));
  Memo1.Lines.Add('VarBoolean:='+BoolToStr(Test.fBoolean, True));
end;

end.
Gruß, Tom

Luckie 18. Mär 2003 17:05

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Test: TTest;
begin
  Test:=TTest.Create; // <- Hier werden die Defaults gesetzt
 
  Memo1.Lines.Clear;
  Memo1.Lines.Add('VarString:='+Test.fString);
  Memo1.Lines.Add('VarInteger:='+inttostr(Test.fInteger));
  Memo1.Lines.Add('VarBoolean:='+BoolToStr(Test.fBoolean, True));
end;
Wo ist der Ressourcen-Schutzblock und wo wird das Objekt wieder freigegeben? :roll:

Specialwork 19. Mär 2003 09:06

Hallo Luckie,

1. Was bitte verstehst Du unter einem Ressourcen-Schutzblock !?

2. Beim Verlassen der Procedure
Delphi-Quellcode:
TForm1.Button1Click(Sender: TObject);
wird soweit ich weis automatische der Destructor von TObject aufgerufen. Der wiederrum gibt das Object zuvor mit
Delphi-Quellcode:
free
wieder frei.

3. Was bitte sollen diese erzieherischen Fragen !? - Ich weiß, dass Du hier zum Moderatorenteam gehörst. Das gehört sich einfach nicht. Ausserdem solltest Du, wenn Du schon Kritik an irgendwelchen postings ausübst, die entsprechenden Erklärungen darin mitliefern.

4. Bei einer schnellen Testlösung, ist es oft erforderlich, auf übliche Schutzmechanismen zu verzichten, oder !? Z.B. Exceptionhandling, usw.

Gruß, Tom

Maa83 19. Mär 2003 09:15

Also irgendwie muss das doch bei Records gehen...
Es funktioniert doch auch bei Arrays und bei Variablen die man an Methoden übergibt...

Luckie 19. Mär 2003 09:20

Zitat:

Zitat von Specialwork
Hallo Luckie,

1. Was bitte verstehst Du unter einem Ressourcen-Schutzblock !?

try-finally-end.
Zitat:

2. Beim Verlassen der Procedure
Delphi-Quellcode:
TForm1.Button1Click(Sender: TObject);
wird soweit ich weis automatische der Destructor von TObject aufgerufen. Der wiederrum gibt das Object zuvor mit
Delphi-Quellcode:
free
wieder frei.
Seit wann denn das? Lokale Variablen verlieren ihre Gültigkeit, aber reservierter Speicher von selbst erzeugten Objekten wird meines Wissens nicht wieder freigegeben.
Zitat:

3. Was bitte sollen diese erzieherischen Fragen !? - Ich weiß, dass Du hier zum Moderatorenteam gehörst. Das gehört sich einfach nicht. Ausserdem solltest Du, wenn Du schon Kritik an irgendwelchen postings ausübst, die entsprechenden Erklärungen darin mitliefern.
Ich beantworte die Fragen so wie ich will - unabhängig von meinem Posten als Moderator. Moderator bin ich nur dann, wenn ich eingreifen muß.
Zitat:

4. Bei einer schnellen Testlösung, ist es oft erforderlich, auf übliche Schutzmechanismen zu verzichten, oder !? Z.B. Exceptionhandling, usw.
Kein Grund unsauber zu arbeiten. Stell dir vor jemand sieht das der keine Ahnung hat, der macht das dann immer so, weil er es nicht anders gesehen hat bei dir.

Specialwork 19. Mär 2003 12:37

Hallo Lucky,

1. Es ist erforderlich, den Ressourceschutzblock einzubinden, um das Object TTest in jedem Fall wieder freizugeben.

2. Ich wiederrufe meine Aussage, das Klassen, die von TObject abgeleitet wurden, automatisch den Destructor von TObject aufrufen. Nach
Delphi-Quellcode:
finally
muss das Object
Delphi-Quellcode:
TTest
mit
Delphi-Quellcode:
TTest.free
freigegeben werden. Habs mal getestet.
3. Must Du selbst entscheiden
4. Aufgrund unsauberer Recherchen ist mir der Fehler zu Punkt 2 passiert. Man sollte sich eben nicht immer auf Aussagen anderer berufen, ohne dies selbst überprüft zu haben. In Zukunft werde ich sauberer arbeiten.

So muß es wirklich aussehen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Test: TTest;
begin
  Test:=TTest.Create; // <- Hier werden die Defaults gesetzt
  try
    Memo1.Lines.Clear;
    Memo1.Lines.Add('VarString:='+Test.fString);
    Memo1.Lines.Add('VarInteger:='+inttostr(Test.fInteger));
    Memo1.Lines.Add('VarBoolean:='+BoolToStr(Test.fBoolean, True));
  finally
    Test.free;
  end;
end;
Gruß, Tom


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:37 Uhr.

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