Salve a tutti. Non sono certo che sia la sezione giusta dove postare, spero di averci preso. Ho un codice in F# che sfrutta Windows Forms che vorrei capire nel dettaglio. Tenete conto che non ho mai avuto a che fare con la OOP e che sto iniziando adesso anche con il linguaggio. Divido in blocchi per semplicità, ponendo in grassetto ciò che non mi è del tutto chiaro:
codice:
type Throbber() as this =
inherit UserControl()
let mutable animcount = 0
let timer = new Timer(Interval=100)
let mutable pbg = true
- as this so che dà un nome all'istanza di classe, ma non mi è del tutto chiara la sua utilità
codice:
do
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true)
timer.Tick.Add(fun _ ->
animcount <- (animcount + 1) % 12
this.Invalidate()
)
member this.Start () = timer.Start()
member this.Stop () = timer.Stop()
override this.OnPaintBackground e =
//if pbg then
base.OnPaintBackground(e)
pbg <- false
override this.OnSizeChanged e =
pbg <- true
this.Invalidate()
- non capisco perché il metodo Start è dichiarato attraverso l'uso di this. quando mi sembra sia possibile dichiararlo anche senza. Vorrei capire la differenza.
- override serve a ridefinire una proprietà/metodo/evento precedentemente definito (ereditato dalla quella "madre" in questo caso), mentre base serve a richiamare quella "originale" della classe ereditata?
codice:
override this.OnPaint e =
let g = e.Graphics
g.SmoothingMode <- Drawing2D.SmoothingMode.HighQuality
use pen = new Pen(Color.LightGray, 5.f)
let from = this.Width / 6
let len = this.Width / 3
pen.StartCap <- Drawing2D.LineCap.Round
pen.EndCap <- Drawing2D.LineCap.Round
let middle = single(this.Width / 2)
g.TranslateTransform(middle, middle)
- e.Graphics esattamente cos'è?
- il costrutto sintattico use a che serve?
- 5.f è per dire che è un float?
- il resto non capisco proprio cosa faccia, antialiasing e stile degli estremi della linea a parte
codice:
for i in 1..12 do
let gray = min (128 + (128 / 12)*((12 - i + animcount) % 12)) 255
pen.Color <- Color.FromArgb(gray, gray, gray)
g.DrawLine(pen, from, 0, from + len - 5, 0)
g.RotateTransform(30.f)
- il primo grassettato serve a garantire che si prenda un valore alpiù pari a 255, giusto?
- per il resto non mi è chiaro come si riesca a costruire correttamente la linea ruotata
Grazie anticipatamente