As interesting as the syntax of legal case statements in fpc is the question of how to design a UI to provide for entry of several variables when several equations using those values overlap.
Here's one approach (which you can extend) which solves for V when S, U, A or T change.
unit uMain;
{$mode objfpc}{$H+}
interface
uses
Classes, Spin, StdCtrls, Forms, Graphics;
type
TSpinEdits = (S, U, V, A, T);
TSpinEditsArray = array[TSpinEdits] of TSpinEdit;
{ TForm1 }
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
FEdits: TSpinEditsArray;
procedure seChange(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
const titleChars: string = 'SUVAT';
var s: TSpinEdits;
i, tp: integer;
lbl: TLabel;
function NewLabel(aTop: integer): TLabel;
begin
Result := TLabel.Create(Self);
Result.Parent := Self;
Result.Top := aTop;
Result.Left := 10;
Result.Layout := tlCenter;
Result.Alignment := taCenter;
Result.AutoSize := False;
Result.Width := 23;
Result.Height := 23;
end;
function newSpinEdit(aTop: integer): TSpinEdit;
begin
Result := TSpinEdit.Create(Self);
Result.Parent := Self;
Result.Top := aTop;
Result.Left := 38;
Result.Caption := '';
Result.MaxValue := 1000;
Result.OnChange := @seChange;
end;
begin
for s in TSpinEdits do
begin
i := integer(s);
tp := 10 + i*30;
lbl := NewLabel(tp);
lbl.Caption := titleChars[Succ(i)];
FEdits[s] := newSpinEdit(tp);
FEdits[s].Name := titleChars[Succ(i)];
end;
FEdits[T].MinValue := 1;
end;
procedure TForm1.seChange(Sender: TObject);
var
se: TSpinEdit;
begin
if (Sender is TSpinEdit) then
begin
se := TSpinEdit(Sender);
case se.Name of
'S': FEdits[V].Value :=
trunc((2*FEdits[S].Value - FEdits[T].Value*FEdits[U].Value)
div FEdits[T].Value);
'U': FEdits[V].Value := FEdits[U].Value + FEdits[A].Value*FEdits[T].Value;
'V': FEdits[U].Value := FEdits[V].Value - FEdits[A].Value*FEdits[T].Value;
'A': FEdits[V].Value := FEdits[U].Value + FEdits[A].Value*FEdits[T].Value;
'T': FEdits[V].Value := (2*FEdits[S].Value - FEdits[T].Value*FEdits[U].Value)
div FEdits[T].Value;
end;
end;
end;
end.