procedure TLoop.SetLoopState(Value: TLoopState); begin if FLoopState <> Value then begin FLoopState := Value; Invalidate; if Value = True then Inc(LoopCount); if LoopCount < 10 then LoopCountLabel.Caption := \'0\'+IntToStr(LoopCount) else LoopCountLabel.Caption := IntToStr(LoopCount); LoopCountLabel.Invalidate; end; end;
valbjorn> Jeg læser dit spørgsmål, som du vil vide om kan blot ændre Propertien direkte eller om man kalder den procedure der gør det?
Det rigtigste vil altid være at ændre \"Propertien\", da dette sikre at programmet \"gør det rigtige\" hvis programmøren af den ene eller anden årsag skulle finde på at ændre i componentet (således den kalder en anden methode).
Ydermere så er det \"rigtige\" også at programmør der har lavet componentet skjuler de \"interne\" Get- og Set- methoder således disse ikke er synlige uden for classen (i så fald kan du kun ændre propertien).
Hvis du kigger på morten_s\'s eksempel kan du se at methoden SetLoopState er oprettet i componentets \"private\"-sektion. Dette sikre som nævnt at SetLoopState ikke dikrekte kan kaldes uden for objectet. Ligeledes så er \"variablen\" FLoopState også i private-sektionen, så er derimod NØDT TIL at ændre på propertien LoopState (dette er \"den rigtige møde\").
Som du bemærkt så anvender methoden SetLoopState direkte variablen FLoopState. Dette er den nødt til. Hvis den i stedet forsøgte at sætte propertien LoopState ville du have et problem, for hver gang man ændre LoopState kalder den FLoopState (dead-end-loop).
pellelil> Ja ok det meste vidste jeg. det var bare hvad der triggede den SetLoopState. Ville vide hvis man skrev validerings kode i SetLoopState hvornår ville den så blive kørt.
Men du svarede også en del andet så lidt point til dig.
valbjorn> Som jeg også skrev (pakket \"lidt\" ind) så var jeg i tvivl om hvad problemet egentlig var, og for at pensle det ud så det nedenstående linie (fra morten_s\'s eksempel) der \"gør tricket\"
Her fortæller du at HVER ENESTE GANG du vil læse værdien af property\'en LoopState så viser den indholdet af FLoopState og HVER ENESTE GANG du sætter propery\'en LoopState så kalder den methoden SetLoopState. Det sker således både fra ObjectInspectoren og RunTime.
Lige et lille tillæg: Hvis du i din SetLoopState ønsker at test om den er kaldt \"fra ObjectInspectoren\" (kaldt mens du \"designer\" din applikation kan du gøre via: if (csDesigning in ComponentState) then ...
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.