unit KParam;
{
   Tässä tiedostossa on automaattinen parametrikomponentti.
     TkParam

   Author:  Vesa Lappalainen
   Date:    9.9.1996
   Changes: 5.10.1996
              + Label parametrin viereen ( => jouduttiin muuttamaan jopa isää)
            6.10.1996
              + nimi vaihdettu TkParam (meni päällekkäin valmiin TParam kanssa)
            09.02.1997
              + talletus initiedostoon (oletuksena nimellä nama-Param)
              section = FormName-Params (oletuksena)
            29.09.2001
              + VCL/CLX compiling (define CLX)
              - in CLX there is no Gauges
}

interface

uses
  SysUtils, Classes,
{$ifdef CLX}
  QGraphics, QControls, QForms, QDialogs, QStdCtrls, QExtCtrls,
{$else}
  Windows, Messages,
  Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,
{$endif}
  kComp,numerot, kIniSave, kIniComp;
type
  TNotifyAskEvent = function(Sender: TObject; var val:double):boolean of object;

type
  {----------------------------------------------------------------------------}
  TkParam = class(TCounter)
  private
    FPrompt   : String;
    FMinValue : Double;
    FMaxValue : Double;
    FBeforeAsk : TNotifyAskEvent;
    FAfterAsk : TNotifyAskEvent;
    FAfterSet : TNotifyAskEvent;
    FOldValue : double;
  protected
    procedure ParamClick(Sender: TObject); virtual;
  public
    constructor Create(AOwner:TComponent); override;
    destructor Destroy; override;
    function Ask:boolean; virtual;
//    procedure SetValue(d:double); override;
    property OldValue:double  read FOldValue;
  published
    property MinValue:double  read FMinValue write FMinValue;
    property MaxValue:double  read FMaxValue write FMaxValue;
    property Prompt:string read FPrompt write FPrompt;
    property BevelWidth default 1;
    property LabelWidth default 30;
    property BeforeAsk : TNotifyAskEvent read FBeforeAsk write FBeforeAsk;
    property AfterAsk : TNotifyAskEvent read FAfterAsk write FAfterAsk;
    property AfterSet : TNotifyAskEvent read FAfterSet write FAfterSet;
  end; { TkParam }

  TkCheckBox = class(TCheckBoxIni)
  end;

var GlobalParamAfterSet : TNotifyIniParamChange; 

procedure Register;

implementation
uses KString,IniFiles,kdouble;



{------------------------------------------------------------------------------}
constructor TkParam.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);
  BevelWidth := 1;
  FPrompt := '';
  FMinValue := 0.0;
  FMaxValue := 100000.0;
  Ini.AutoSave := false;
  Ini.GenName := 'Param';
  Desim := 0;

  FBeforeAsk := NIL;
  FAfterAsk := NIL;

  LabelWidth := 30;
  OnClick := ParamClick;
end;

{------------------------------------------------------------------------------}
function TkParam.Ask:boolean;
var val:Double; s:String;
begin
  val := Value;
  Result := False;
  s := Prompt;
  if ( s = '' ) then s := Hint;
  if ( s = '' ) then s := Caption;
  if ( s = '' ) then s := Name;
  FOldValue := Value;
  if ( Assigned(FBeforeAsk) ) then if ( not FBeforeAsk(self,val) ) then exit;
  if ( not AskValue(s,val,MinValue,MaxValue,Desim) ) then exit;
  if ( Assigned(FAfterAsk) ) then if ( not FAfterAsk(self,val) ) then exit;
  if ( Assigned(GlobalParamAfterSet) ) then GlobalParamAfterSet(Name + ': ' +AsIniString + ' -> ' + DoubleToIniStr(val,desim+IniDesim));
  Value := val;
  if ( not Ini.AutoSave ) then Ini.Save;
  if ( Assigned(FAfterSet) ) then if ( not FAfterSet(self,val) ) then exit;
  Result := True;
end;

{------------------------------------------------------------------------------}
procedure TkParam.ParamClick(Sender: TObject);
begin
  Ask;
end;

{------------------------------------------------------------------------------}
destructor TkParam.Destroy;
begin
//  FLabel.Free;
//  FLabel := NIL;
  inherited Destroy;
end;

{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{ TkCheckBox ==================================================================}
{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}

{------------------------------------------------------------------------------}
procedure Register;
begin
  RegisterComponents('Kave2000', [TkParam,TkCheckBox]);
end;

end.
