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.