Toon posts:

[delphi] private vars

Pagina: 1
Acties:

Verwijderd

Topicstarter
Heb een aantal classes in elkaar zitten klussen, met en hoop private vars. Nou was me bij C++ altijd verteld dat je de private vars met een public functie kan aanpassen. In Delphi wil dit echter niet werken. Wat doe ik fout?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type
  MyClass = class
      public
            procedure SetPrivateVar(i: integer);
            function GetPrivateVar(): integer;
      private
            PrivateVar: integer;
  end;

...

procedure MyClass.SetPrivateVar(i: integer);
begin
      PrivateVar := i;
end;

function MyClass.GetPrivateVar(): integer;
begin
      Result := PrivateVar;
end;

Zodra ik de functie SetPrivateVar uitvoer krijg ik een access violation.

  • Paul
  • Registratie: September 2000
  • Laatst online: 21:32
Is setPrivateVar ook het eerste wat je aanroept van je MyClass? Als er eerdere dingen wel goed daan dan weet ik het zo niet, maar als dit het eerste is dan ben je hoogstwaarschijnlijk vergeten het object aan te maken.
Je hebt het dan wel gedeclareerd, maar nog niet geinitialiseerd, en dat levert idd een EAccessViolation op, want je probeert iets te bereiken dat niet bestaat.
Het initialiseren doe je als volgt:
code:
1
2
3
4
5
var foo : MyClass;       
begin
  foo := MyClass.Create(self);  // <-- Deze dus :)
  foo.setPrivateVar(1);
end;

Als je zelf geen constructor hebt gemaakt, dan is de verwachtte parameter van de constructor de eigenaar van het object. Hierdoor weet het programma wanneer het object vrijgegeven moet worden (nl als de eigenaar vrijgegeven wordt).
Je kunt een object ook zelf .Free -en, alleen dan moet je zorgen dat je het daarna ook niet meer gebruikt :) Doe je dat wel, dan heb je je EAccessViolation terug.

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Verwijderd

Topicstarter
Problem solved:

Constructor werd op andere locatie niet goed aangeroepen. Was dus iets aan het wijzigen dat nog niet bestond.

Toch bedankt

Verwijderd

Overigens is 't in Delphi gebruikelijk om zoiets met properties te doen:
code:
1
2
3
4
5
6
7
8
9
type
  MyClass = class
    FPrivateVar: integer;
  private
    procedure SetPrivateVar(Value: integer);
    function GetPrivateVar: integer;
  public
    property PrivateVar: integer read GetPrivateVar write SetPrivateVar;
  end;

Klinkt misschien als muggenziften, maar is een vrij essentieel onderdeel van de taal.

  • jopiek
  • Registratie: September 2000
  • Laatst online: 21-08 19:56

jopiek

Tja... 'ns ff denken.

Op woensdag 05 december 2001 08:26 schreef Afterlife het volgende:
Overigens is 't in Delphi gebruikelijk om zoiets met properties te doen:
code:
1
2
3
4
5
6
7
8
9
type
  MyClass = class
    FPrivateVar: integer;
  private
    procedure SetPrivateVar(Value: integer);
    function GetPrivateVar: integer;
  public
    property PrivateVar: integer read GetPrivateVar write SetPrivateVar;
  end;

Klinkt misschien als muggenziften, maar is een vrij essentieel onderdeel van de taal.
Dat is zeker geen muggeziften, de hele componenten bibliotheek draait hier op. Ik zou niet willen stellen dat het een essentieel onderdeel van de Object Pascal Language is maar wel een belangrijk onderdeel van de IDE en component libraries. Properties worden namelijk in eerste instantie door de Object Inspector gebuikt...

Cogito Ergo Credo


Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
type
  MyClass = class
    FPrivateVar: integer;
  private
    procedure SetPrivateVar(Value: integer);
    function GetPrivateVar: integer;
  public
    property PrivateVar: integer read GetPrivateVar write SetPrivateVar;
  end;
Ondertussen ben ik behoorlijk benieuwd naar de implementatie van GetPrivateVar en SetPrivateVar. Heb echt van alles geprobeerd, maar bij iedere mogelijkheid krijg ik een access violation. :(
... is een vrij essentieel onderdeel van de taal.
Ik heb echt geen (fatsoenlijke) site/tutorial gezien die hierover iets zinnigs zegt. Beetje jammer.

Verwijderd

Op woensdag 05 december 2001 23:20 schreef delighteddennis het volgende:
Ondertussen ben ik behoorlijk benieuwd naar de implementatie van GetPrivateVar en SetPrivateVar. Heb echt van alles geprobeerd, maar bij iedere mogelijkheid krijg ik een access violation. :(
Gewoon respectievelijk

Result := FPrivateVar;

en

FPrivateVar := Value;

Als je hier access violations op krijgt, zit je waarschijnlijk de class MyClass direct aan te spreken i.p.v. een instance van die class.

  • joepP
  • Registratie: Juni 1999
  • Niet online
Tipjes:

* Geef je class eens een fatsoenlijke Delphi-naam. Daar is een standaard voor: hij moet beginnen met een T. Dus TMyClass ipv MyClass.
* Private variabelen worden meestal voorafgegaan met een F, zodat je de published property de 'echte' naam kan geven.

De volgende code werkt zeker:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
type
  TMyClass = class
  private
    FMyVar: Integer;
  public
    function GetMyVar: Integer;
    procedure SetMyVar(Value: Integer);
  published
    property MyVar: Integer read GetMyVar write SetMyVar; //optie 1
    //property MyVar: read FMyVar write SetMyVar; //optie 2
    //property MyVar: read FMyVar write FMyvar;   //optie 3
  end;

function TMyClass.GetMyVar: Integer;
begin
  Result := FMyVar;
end;

procedure TMyClass.SetMyVar(Value: Integer);
begin
  FMyVar := Value;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyClass: TMyClass;
begin
  //create
  MyClass := TMyClass.Create;

  //set & show, nette methode
  MyClass.MyVar := 12;
  ShowMessage(IntToStr(MyClass.MyVar));

  //set & show, slordige methode
  MyClass.SetMyVar(100);
  ShowMessage(IntToStr(MyClass.GetMyVar));

  //free
  MyClass.Free;
end;

Zoals je ziet kan je gebruik maken van een published (wordt ook gestreamed!) property voor het aanspreken van private variabelen. Ook kan je direct de functies aanroepen, maar echt netjes is dat niet te noemen.

Ik adviseer je ook een fatsoenlijk boek aan te schaffen, Mastering Delphi 5 van Cantu bijvoorbeeld.

Verwijderd

Op donderdag 06 december 2001 12:25 schreef joepP het volgende:
Ook kan je direct de functies aanroepen, maar echt netjes is dat niet te noemen.
Da's te verhelpen door de getter en setter private te maken (en zo hoort 't ook).
Desnoods maak je ze protected, zodat afgeleide classes buiten dezelfde unit er ook bij kunnen, maar dat is meestal een lapmiddel. Als je rechtsteeks bij een setter of getter van een property moet kunnen, is er ergens onderweg iets in 't ontwerp iets niet goed gegaan. :)

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 08-09 08:43

Bergen

Spellingscontroleur

Op woensdag 05 december 2001 01:48 schreef delighteddennis het volgende:
blablabla
code:
1
function GetPrivateVar(): integer;

blablabla
Die haakjes () kennen 'we' in Delphi ook niet..
Pagina: 1