Stack Overflow

0

Wyskakuje mi błąd Stack Overflow po utworzeniu obiektu dowolnej z dwóch klas. :-P Program jest napisany w Delphi 2007.

unit Main;

interface

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

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

  osoba = class
  private
  imie: string[15];
  nazwisko: string[25];
  kodp:string[6];
  ulica:string[15];

  public
  function get_imie(): string;
  function get_nazwisko():string;
  function get_kodp():string;
  function get_ulica():string;

  procedure set_imie(Value: string);
  procedure set_nazwisko(Value: string);
  procedure set_kodp(Value: string);
  procedure set_ulica(Value: string);

  constructor Create();
  destructor Destroy(); override;
  end;
var
  Form1: TForm1;
  par_osoba:osoba;
implementation
  uses
  unit1;
{$R *.dfm}


function osoba.get_imie():string;
begin
  result:=imie;
end;

function osoba.get_nazwisko():string;
begin
  result:=nazwisko;
end;

function osoba.get_kodp;
begin
    result:=kodp;
end;

function osoba.get_ulica;
begin
  result:=ulica;
end;

procedure osoba.set_imie(Value: string);
begin
  par_osoba.imie:=Value;
end;

procedure osoba.set_nazwisko(value: string);
begin
  par_osoba.nazwisko:=value;
end;

procedure osoba.set_kodp(value: string);
begin
  par_osoba.kodp:=value;
end;

procedure osoba.set_ulica(value: string);
begin
  par_osoba.ulica:=value;
end;

constructor osoba.Create();
begin
par_osoba:=osoba.Create();
end;

destructor osoba.Destroy;
begin
  if Assigned(par_osoba) then

  FreeAndNil(par_osoba);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
schowek: MojSchowek;
ob_osoba: osoba;
begin
try
schowek:=MojSchowek.Create();;
ob_osoba:=osoba.Create();

ob_osoba.set_imie('Wiktor');
ob_osoba.set_nazwisko('Tytkowski');
ob_osoba.set_kodp('05-140');
ob_osoba.set_ulica('Pułtuska');


schowek.SetOsoba(ob_osoba);
schowek.CopyToClipBoard();
finally
FreeAndNil(schowek);
FreeAndNil(ob_osoba);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Text:='';
end;

end.


<b>Unit1</b>

unit Unit1;

interface
  uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, clipbrd, main;
type
MojSchowek = class
private
CF_DDGDATA: Word;
ob_osoba: osoba;

public

procedure SetOsoba(par_osoba:osoba);

procedure CopyToClipBoard();
procedure GetFromClipBoard();

constructor Create();
destructor Destroy(); override;

end;
implementation

procedure MojSchowek.SetOsoba(par_osoba: osoba);
begin
  ob_osoba.set_imie(par_osoba.get_imie);
  ob_osoba.set_nazwisko(par_osoba.get_imie);
  ob_osoba.set_kodp(par_osoba.get_kodp);
  ob_osoba.set_ulica(par_osoba.get_ulica);
end;

constructor MojSchowek.Create();
begin
  ob_osoba:=Osoba.Create();
  CF_DDGDATA:=RegisterClipboardFormat('CF_DDGDATA');
  if CF_DDGDATA=0 then
    Form1.Memo1.Lines.Add('Nie udało się utworzyć formatu');
end;

procedure MojSchowek.CopyToClipBoard;
var
imie, nazwisko, kodp, ulica:string;

Data: HGLOBAL;
DataPtr: Pointer;
iSize:Integer;
begin
  iSize:=ob_osoba.InstanceSize;
  Data:=GlobalAlloc(GMEM_MOVEABLE, iSize);
  try
    DataPtr:=GlobalLock(Data);
    try
      CopyMemory(DataPtr, ob_osoba, iSize);
      imie:=osoba(DataPtr).get_imie;
      nazwisko:=osoba(DataPtr).get_nazwisko;
      kodp:=osoba(DataPtr).get_kodp;
      ulica:=osoba(DataPtr).get_ulica;

      with Form1.Memo1.Lines do
      begin
        Add(imie);
        Add(nazwisko);
        Add(kodp);
        Add(ulica);
      end;

      ClipBoard.Clear;
      ClipBoard.Open;

      ClipBoard.SetAsHandle(CF_DDGDATA, Data);
      ClipBoard.Close;
    finally
      GlobalUnlock(Data);
    end;
  except
    GlobalFree(Data);
    ShowMessage('Wystąpił błąd');
  end;
end;

procedure MojSchowek.GetFromClipBoard;
var
iSize:integer;
DataPtr:Pointer;
Data:HGLOBAL;
nowa_osoba:osoba;

imie, nazwisko, kodp, ulica:string;
begin
if ClipBoard.HasFormat(CF_DDGDATA) then
  Form1.Memo1.Lines.Add('Pomyślnie załądowanno fomrat')
else
  Form1.Memo1.Lines.Add('Nie załadowano formatu');

  Data:=ClipBoard.GetAsHandle(CF_DDGDATA);

  if data=0 then
    exit;

  DataPtr:=Globallock(Data);

  try
    iSize:=GlobalSize(Data);
    CopyMemory(nowa_osoba, DataPtr, iSize);

    nowa_osoba:=osoba.Create();
    imie:=osoba(DataPtr).get_imie;
    nazwisko:=osoba(DataPtr).get_nazwisko;
    kodp:=osoba(DataPtr).get_kodp;
    ulica:=osoba(DataPtr).get_ulica;

    with Form1.Memo1.Lines do
    begin
      Add('Wczytane dane ze schowka to:');
      Add(imie);
      Add(nazwisko);
      Add(kodp);
      Add(ulica);
    end;
  finally
   GlobalUnlock(Data);
   FreeAndNil(nowa_osoba);
  end;
end;

destructor MojSchowek.Destroy();
begin
if Assigned(ob_osoba) then
  FreeAndNil(ob_osoba);
end;
end.
0

No naturalnie. Widzę, że jesteś z innych języków, najpewniej z Javy ;>

Well, konstruktor jak i wszystkie settery masz złe.
W konstruktorze masz utworzyć jedynie obiekty, które będziesz używał i nadać jakieś wartości domyślne, jeśli potrzebujesz.

constructor MyObject.Create;
begin
  inherited Create;

  //tworzenie innych obiektów itp
end;

Tak powinien wyglądać konstruktor.
Destruktor powinien wyglądać tak:

destructor MyObject.Destroy;
begin
//zwalnianie obiektów utworzonych w konstruktorze
  inherited Destroy;
end;

Tak powinien wyglądać destruktor.

Jeśli chodzi o settery, to źle się odwołujesz. Powinno być po prostu:

imie:=value;

ewentualnie:

self.imie:=value;

W delphi SELF jest określeniem tego samego, co w Javie: this.

Poczytaj jakiś kurs o klasach w Delphi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1