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