AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi vergisst die Werte der Eigenschaften meiner Klasse
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi vergisst die Werte der Eigenschaften meiner Klasse

Ein Thema von Andre93 · begonnen am 25. Aug 2011 · letzter Beitrag vom 19. Sep 2011
 
Andre93

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

AW: Delphi vergisst die Werte der Eigenschaften meiner Klasse

  Alt 6. Sep 2011, 17:35
soo..
also ich habe jetzt alles noch ein bisschen angepasst.
Ich hab jetzt alles auf array of Bytes aufgebaut und nicht mehr auf Pointern. außerdem habe ich den "getmem"-befehl in mein "input" gepackt damit der speicherplatz nur dann reserviert wird wenn er auch wirklich gebraucht wird. außerdem habe ich in meinem "input" jetzt noch eine abfrage mit drin, in der geprüft wird ob schon einmal daten hineingepackt wurden, sollte das der fall sein gebe ich den alten speicherbereich erst wieder frei bevor neuer reserviert wird.
und statt "init" habe ich jetzt "create" verwendet und die parameter angehängt.
allerdings wirft mein "Destroy" noch eine "invalid pointer operation" fehlermeldung und ich hab im moment noch keine idee warum.
da muss irgendwas an dem FreeMem(_Data); falsch sein



Delphi-Quellcode:
unit U_Data;

interface

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

type

TArByte = array of Byte;

TDataType = (dtNone, dtBool, dtByte, dtChar, dtString, dtInteger, dtReal);

TData = class
 private
  _Data, _TempData : TArByte;
  _MaxSize, _RealSize: Integer;
  _DataType : TDataType;
  _DataUsed : Boolean;
 public

  property MaxSize: Integer read _MaxSize;
  property RealSize: Integer read _RealSize;
  property DataType: TDataType read _DataType;
  property DataUsed: Boolean read _DataUsed;

  constructor Create(MaxSize : Integer; DataType : TDataType);
  destructor Destroy; override;

  procedure Input(Data : TArByte; DataSize : Integer);
  procedure Output(var Data : TArByte);

  //---

  procedure InputBool(B : Boolean);
  function OutputBool : Boolean;
  procedure InputInt(I : Integer);
  function OutputInt : Integer;
  procedure InputStr(S : String);
  function OutputStr : String;

 end;

implementation

constructor TData.Create(MaxSize : Integer; DataType : TDataType);
begin
 _MaxSize := MaxSize;
 _DataType := DataType;
 _DataUsed := False;
end;

destructor TData.Destroy;
begin
 FreeMem(_Data);
end;

procedure TData.Input(Data : TArByte; DataSize : Integer);
begin
 if RealSize <= _MaxSize then
  begin
   if DataUsed then
    FreeMem(_Data)
   else
    _DataUsed := true;
   _RealSize := DataSize;
   Move(Data, _Data, DataSize);
  end
 else
  ShowMessage('Speicherplatz überschritten!');
end;

procedure TData.Output(var Data : TArByte);
var
 I : Integer;
begin
 //For I := 0 to _RealSize - 1 do
  //Data[I] := _Data[I];
 Move(_Data, Data, _RealSize)
end;

//---

procedure TData.InputBool(B : Boolean);
begin

end;

function TData.OutputBool : Boolean;
begin

end;

procedure TData.InputInt(I : Integer);
begin

end;

function TData.OutputInt : Integer;
begin

end;

procedure TData.InputStr(S : String);
var
 I,Len : Integer;
begin
 len := length(S);
 SetLength(_TempData, len);
 for I := 0 to len - 1 do
  _TempData[I] := ord(S[I+1]);
 Input(@_TempData[0], len);
end;

function TData.OutputStr : String;
var
 I : Integer;
 S : String;
begin
 SetLength(_TempData, RealSize);
 OutPut(_TempData);
 for I := 0 to RealSize - 1 do
  S := S + chr(_TempData[I]);
 Result := S;
end;


end.

unit vom hauptprogramm
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Button4: TButton;
    GroupBox1: TGroupBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(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(500,dtString);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 arB : array of Byte;
 I,Len : Integer;
begin
 len := length(Edit1.Text);
 SetLength(arB, len);
 for I := 0 to len - 1 do
  arB[I] := ord(Edit1.Text[I+1]);
 D.Input(@arB[0], len);

end;

procedure TForm1.Button3Click(Sender: TObject);
var
 arB : TArByte;
 I : Integer;
begin
 SetLength(arB, D.RealSize);
 D.OutPut(arB);
 for I := 0 to D.RealSize - 1 do
  Caption := Caption + chr(arB[I]);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 D := TData.Create(500,dtString);
 D.InputStr(Edit1.Text);
 Caption := D.OutputStr;
 //D.Destroy; //führt zu invalid pointer operation
end;


end.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:00 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