Avatar billede surreal Nybegynder
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.
Avatar billede torbenthyregod Nybegynder
30. januar 2001 - 22:48 #1
I din FormCreate skal du lave følgende :

test := Ttest.create;
Avatar billede delphi Nybegynder
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
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester