Avatar billede flycht Nybegynder
09. januar 2006 - 22:10 Der er 7 kommentarer og
1 løsning

Static keyword i Delphi?

Jeg har lavet et eksempel hvor jeg opretter 101 forskellige objekter. Mit spørgsmål er om mine variable a,b,c ikke kunne oprettes blot én gang istedet for at jeg opretter dem 101 gange.
I Java er der vist et static keyword, som måske kunne bruges i sådanne tilfælde - hvad gør man i Delphi?

Ligeledes vil jeg høre, hvor jeg bør skrive min randomize linje?

Hvis logikken i eksemplet burde være helt anderledes og det vil løse mit problem er det selvfølgeligt også en mulihed, som jeg er åben over for.

Nedenfor er klasse og main-procedure.

Venlig hilsen

Flycht



unit renteUnit;
interface
uses
math;
type
  CRente = class(TObject)
public
    shortRate:double;
    a,b,c:double;
    constructor create();overload;
    procedure setA(a:double);
    procedure setB(b:double);
    procedure simulate;
end;
implementation

constructor CRente.create();
begin
  a:=2;
  b:=5;
  c:=ln(a)*exp(b/2);
  simulate
end;

procedure CRente.setA(a:double);
begin
    self.a:=a;
    simulate
end;
procedure CRente.setB(b:double);
begin
    self.b:=b;
    simulate
end;
procedure Crente.simulate();
begin
  shortRate:=a*b*c*randG(0,1);
end;

procedure TForm3.Button1Click(Sender: TObject);
var
r: array[0..100] of Crente;
i :integer;
begin
  for i:=0 to 100 do
    r[i]:=Crente.create();
end;


end.
Avatar billede arne_v Ekspert
09. januar 2006 - 22:21 #1
så vidt jeg ved har Delphi ikke static fields

du skal kalde randomize et sted hvor den kun bliver kaldt en gang
Avatar billede rednex Nybegynder
09. januar 2006 - 23:47 #2
Tja, jeg ville nok nøjes med at oprette et enkelt objekt, køre simulate() 100 gange og gemme resultaterne undervejs.
Avatar billede pidgeot Nybegynder
10. januar 2006 - 12:49 #3
Hvis jeg husker rigtigt kan du "fake" et static field ved at erklære dine variable som en variabel af din Unit:

unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, (...);

var
  a:integer;
  b:integer;
  c:integer;

type
// resten af din kode her...

Du kan så tilgå dem med Unit4. som prefix - Unit4.a, Unit4.b, Unit4.c.

Jeg er ikke 100% sikker, eftersom jeg ikke har prøvet at bruge det i denne sammenhæng - men det *burde* virke, IMO.
Avatar billede tolderlund Nybegynder
10. januar 2006 - 15:09 #4
Hvis jeg forstår dig rigtigt så er det konstanter du er ude efter (const keyword):
implementation
const
  a: double = 2;
  b: double = 5;
  c: double = ln(a)*exp(b/2);
hvis jeg husker syntaksen rigtig på stående fod :-)
Randomize skal kun kaldes en gang, f.eks. som første linje i Button1Click eller i formens OnCreate.
Avatar billede flycht Nybegynder
10. januar 2006 - 15:17 #5
Tak for alle svarerne.

Måske kan konstanter 'do the job', men kan de ændres med en set-procedure eller alternativt med en write property?

Jeg kunne selvfølgeligt godt kalde Randomize fra min main-procedure (Button1Click eller lign.), men det er vel ikke så god OOP-practice eller hvad?

Når vi nu er ved "god OOP-practise" så er jeg heller ikke sikker på at pidgeot's svar vil betegnes som sådan?
Avatar billede tolderlund Nybegynder
10. januar 2006 - 15:26 #6
Konstanter kan godt ændres (variable konstanter!).
Afhængig af en kompiler option tillader eller afviser kompileren at konstanter ændres.
Hvis du fjerner dine a,b,c variabler fra din CRente class fungerer dine setA og setB metoder uændret.
Randomize skal kaldes et eller andet sted. Om det god eller dårlig praksis er så et teoretisk spørgsmål.
Avatar billede flycht Nybegynder
10. januar 2006 - 15:40 #7
Aha - det var jeg ikke klar over.

Hvad er så egentligt forskellen på variable og konstanter? Og skal følgende linje så stå i min kode?
{$WriteableConst On}

Kan man tjekke hvor mange objekter, der er lavet af en given klasse og således sørge for at randomize kun kaldes første gang, der laves et objekt af klassen?
Avatar billede tolderlund Nybegynder
10. januar 2006 - 15:49 #8
Du skriver blot {$J+}.
Hvis man tillader at ændre konstanter er forskellen ikke så stor, bortset fra at du kan nøjes med at skrive
const
  a = 2;
altså uden angivelse af type, så kan den aldrig ændres.
Du skal nok selv holde styr på hvor mange instanser du laver f.eks. med en variabel.
Men da randomize gælder for hele applikationen er det lidt "griseri" at styre det inde fra en "tilfældig" klasse.
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