Gå til innhold

Anbefalte innlegg

jeg er selvlært og har sikkert gått glipp av mange elementære delphi ting. så da må jeg spørre om dette, og håper noen vil meg et godt svar :)

 

1.konstant-verdier som parameter til en funksjon? hvordan funker dette?

de funker sikkert ikke som en vanlig variabel som parameter...

 

2.konstant deklarering inne i en funksjon?

se på denne kodesnutten

 

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
{$J+}
const PreviousColumnIndex : integer = -1;
{$J-}

 

jeg mistenker at denne konstanten klarer å beholde verdien for hver gang den blir kalt.

Lenke til kommentar
Videoannonse
Annonse

Normalt vil du kunne endre verdien på parameteren som går inn til en funksjon, selv om parameterverdien vil bli resatt etterpå.

 

Eks.

Function Test (T: String): String;
begin
 T:= T + ' hallo';
 Result:= T;
end;

 

Derimot kan du ikke endre på verdien til en konstantparameter fordi den er en konstant. Det vil gi en feilmelding under kopilering hvis du prøver på det.

Eks.:

Function Test (Const T: String): String;
begin
 T:= t+ ' hallo';
 Result:= T;
end;

 

Det er riktig som du antyder i ditt kode-eksempel at konstanten som er definert der vil opprettholde verdien sin (kan ikke endres).

Lenke til kommentar
  • 2 uker senere...
Hum.. Tror nok ikke det medfører riktighet det du sier at konstanten ikke kan endres. Som du ser har han inkapslet deklerasjonen i et $J-direktiv, eller $WritableConst som man også kan bruke, noe som tilsier at dette er en skrivbar konstant.

En kjapp test bekrefter mine misstanker:
[code]
function TMyObject.test: integer;
const
{$j+}
 i: integer = 1;
{$j-}
begin
 result := i;
 i := i + 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 obj1, obj2: TMyObject;
begin
 obj1 := TMyObject.Create;
 obj2 := TMyObject.Create;

 memo1.lines.add('obj1: ' + IntToStr(obj1.test));
 memo1.lines.add('obj1: ' + IntToStr(obj1.test));
 memo1.lines.add('obj2: ' + IntToStr(obj2.test));
 memo1.lines.add('obj2: ' + IntToStr(obj2.test));
 memo1.lines.add('obj1: ' + IntToStr(obj1.test));
 memo1.lines.add('obj2: ' + IntToStr(obj2.test));

 obj1.Free;
 obj2.Free;
end;
[/code]
Resultatet blir som følger:
[code]
obj1: 1
obj1: 2
obj2: 3
obj2: 4
obj1: 5
obj2: 6
[/code]
Så en skrivbar konstant i en lokal prosedyre vil fungere som en variabel som husker sin verdi [b]på tvers av instanser[/b]. Det siste er viktig å merke seg, og det er jo der hele poenget med lokale skrivbare konstanter ligger. Ønsker man ikke at verdien skal deles mellom instansene får man heller opprette en privat variabel.

Når det gjelder const-parametere så kan jeg legge til at for typene string, dynamic array og interface vil ting være bitte litt mer effektivt hvis parameteren er konstant siden delphi ikke trenger å inkrementere referansetelleren. Ta derfor med 'const' for disse typene så sant du ikke trenger å endre på dem.

-Vegar
Lenke til kommentar

Hensikten med en konstant (Const) eller typekonstant er at de skal være konstanter og ikke kunne endres av programmet, med eller uten vilje. Dette er beskrevet i bl.a. ISO 7185. Det at Borland har lagt inn en mulighet å tweake litt endrer ikke saken. Hvis du leser Borlands language manual så ser du det. Også i hjelpefila for J+ er det nevnt at det ikke anbefales å bruke skrivbare konstanter. Årsaken er at poenget med konstanter blir borte hvis de ikke skulle opptre som konstanter, men som ordinære variable. Da definerer man like godt en variabel til formålet.

Lenke til kommentar

Det er riktig at typedekonstanter alltid var skrivbare i tidligere versjoner av delphi, mens du nå kan bestemme selv om du ønsker denne funksjonaliteten eller ikke. Det er også rett at man blir anbefalt å bruke initialiserte variabler istede, men uansett hvordan du vrir og vender på det så forandres ikke det faktum at dalai kan endre verdien til PreviousColumnIndex, og den endrede verdien blir bevart til neste gang metoden blir kalt.

 

Slik jeg ser det så er writeable const en kjekk sak og kan gjøre god nytte for seg der initialiserte variabler ikke strekker til. Det er nemmelig slik at initialiserte variabler ikke alltid duger like godt. F.eks.

  • Lokale variabler kan ikke være initialisert. Selvfølgelig kan man initialisere dem selv, men det er nå fort gjort å glemme...
  • Globale variabler bryter prinsipper som inkapsling og informasjonsskjuling. Ha alltid informasjonen så nært bruken av den som mulig. Brukes verdien kun lokalt i en prosedyre så ha den lokalt i prosedyren.
  • Simulere klassevariable. Trenger alle instanser av en klasse å dele informasjon kan dette være en grei måte å gjøre det på.
  • Pascal har ikke 'static'. I både c og vb har man et eget ord for lokale variabler som beholder sin verdi mellom hver gang prosedyren kalles - static. I pascal får vi ta til takke med det vi har - writeable const.

Typede konstanter har nå vært skrivbare i alle 7 versjoner av Delphi. Vil de være det også i Delphi 8? Hvem vet. Jeg tror nå ikke de forsvinner og blir å fortsette å bruke dem så lenge jeg har bruk for dem.

 

-Vegar

Endret av Format71
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...