30. januar 2001 - 22:44
Der er
1 kommentar og
1 løsning
Klasser
Jeg er i gang med at leje med klasser. Når jeg prøve at køre dette lille program får jeg en accessviolation. Hvad har jeg lavet forkert?
På forhånd tak.
---------------------
unit Unit1;
interface
uses
Windows, Unit2, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
EditName: TEdit;
BPutName: TButton;
BGetName: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
test: Ttest;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
if test <> nil then
EditName.Text := test.GetName;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
test.PutName(EditName.Text);
end;
end.
--------------------
unit Unit2;
interface
Type
Ttest = Class
private
vName: string;
public
procedure PutName(Name: string);
function GetName: string;
end;
implementation
uses
Unit1, Graphics;
procedure Ttest.PutName(Name: string);
begin
vName := Name;
end;
function Ttest.GetName: string;
begin
GetName := vName;
end;
end.
01. februar 2001 - 09:06
#2
Du bør iøvrigt putte din test variable op i din TForm dekleration. Som det er har du et problem med at genbruge class\'en TForm, dvs. ved at kopiere den, til et andet program, idet den er bundet til en globalvariabel Test.
Jeg ville ha\' lavet TForm således:
Type
TForm1 = class(TForm)
... // Cut div. controls.
private
{ Private declarations }
FTest : TTest;
public
{ Public declarations }
end;
Bemærk F\'et foran navnet. Det er en konvention at private variable (kaldet Class Fields på engelsk) starter med \'F\' (for Field).
Hvis du så har brug for at kunne \'se\' test fra andre objecter/steder i programmet, hvilket nu er umuligt idet den er blevet private, så kan du \'eksportere\' den som en property. Du skal så vælge om det skal være en public, protected eller published property (se online hjælpen for forskellen). Jeg vælger normalt at sætte den til public. Altså bliver TForms code nu:
Type
TForm1 = class(TForm)
... // Cut div. controls.
private
{ Private declarations }
FTest : TTest;
public
{ Public declarations }
Property Test : TTest Read FTest Write FTest;
end;
Evt. kan du bruge getter/setter metoder... men det bliver en anden gang...
Peter