Einzelnen Beitrag anzeigen

Andre93

Registriert seit: 10. Jun 2010
15 Beiträge
 
Delphi 6 Personal
 
#1

Delphi vergisst die Werte der Eigenschaften meiner Klasse

  Alt 25. Aug 2011, 18:14
hey...
also ich habe folgendes problem und ich würde mich wirklich sehr freuen wenn mir irgendjemand hier weiter helfen kann:
ich habe eine Klasse TData erstellt.
Diese hat die Eigenschaften :
_Data : Pointer;
_MaxSize, _RealSize, _DataType : Integer;
und die Prozeduren :
procedure Init(MaxSize, DataType : Integer);
procedure Input(Data : Pointer; RealSize : Integer);
procedure Output(var Data : Pointer);

Die Prozedur Init soll nach dem create von TData den Eigenschaften _MaxSize, und _DataType einen Wert zuweisen.
Mit der Prozedur Input kann ich dann ein "Datenpaket" ,das durch den Pointer _Data representiert wird dazu packen und in der Eigenschaft _RealSize die wirkliche Größe des "Datenpakets" festhalten.
Mit der Prozedur Output will ich das "Datenpaket" dann wieder herausholen. Für das herausholen wollte ich dann durch _RealSize heraufinden wie groß das "Datenpaket" ist.

Soweit zur Theorie!
In der Praxis allerdings vergisst Delphi die Werte der Eigenschaften.
Das heißt wenn ich zum Beispiel bei Input _RealSize den Wert 11 zugewiesen habe, dann hatte _RealSize beim Aufruf von Output auf einmal den Wert 13514484 und _MaxSize den Wert 4372840 (zuvor hatte ich den Wert 500 abgespeichert).
Ganz so als würde Delphi den Speicherplatz für die Eigenschaften wieder freigeben weil es der Meinung ist das die Eigenschaften jetzt für nichts mehr gebraucht werden könnten.
Komisch ist auch, dass nicht immer alle Werte verloren gehen. Teilweise ist auch nur der Wert für _MaxSize verschwunden und _RealSize geblieben oder anders herum.

Ich wäre wirklich sehr dankbar wenn mir jemand erklären könnte was ich falsch gemacht habe oder mir eventuell einen Tip geben könnte wie ich dieses Problem umgehe. Folgend füge ich auch noch einmal den Quelltext an.

Schon einmal vielen Dank im voraus
Andre

Unit die die Klasse enthält :

Delphi-Quellcode:
unit U_Data;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

const
 dtNone = -1;
 dtBool = 0;
 dtByte = 1;
 dtChar = 2;
 dtString = 3;
 dtInteger = 4;
 dtReal = 5;

type

 TArByte = array of Byte;

 TData = class
  private
   _Data : Pointer;
   _MaxSize, _RealSize, _DataType : Integer;
  public
   procedure Init(MaxSize, DataType : Integer);
   procedure Input(Data : Pointer; RealSize : Integer);
   procedure Output(var Data : Pointer);
 end;

implementation

procedure TData.Init(MaxSize, DataType : Integer);
begin
 _MaxSize := MaxSize;
 _DataType := DataType;
end;

procedure TData.Input(Data : Pointer; RealSize : Integer);
begin
 if RealSize <= _MaxSize then
  begin
   _RealSize := RealSize;
   GetMem(_Data, RealSize);
   Move(Data, _Data, RealSize);
  end
 else
  ShowMessage('Speicherplatz überschritten!');
end;

procedure TData.Output(var Data : Pointer);
begin
 GetMem(Data,_RealSize);
 Move(_Data,Data,_RealSize);
end;
Unit des Hauptprogrammes (Hier wollte ich die Prozeduren mal ausprobieren) :

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, U_Data;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  D : TData;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 D := TData.Create;
 D.Init(500,1);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 arB : array[0..10]of Byte;
 I : Integer;
begin
 for I := 0 to 10 do
  arB[I] := I;
 D.Input(@arB,SizeOf(arB));
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 arB : pointer;
 a : Tarbyte;
 I : Integer;
begin
 D.OutPut(arB);
 a := TArByte(arb);
 for I := 0 to 10 do
  Caption := Caption + IntToStr(a[I]);
end;

end.
  Mit Zitat antworten Zitat