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.