Вопрос

I want to change the value of T according to a particular selection but it's not changing. Please have a look. The variable T has been declared along with Form1:TForm1 before 'implementation'. Basically, T should get assigned a linear or non linear equation depending upon the the selection of the respected radio buttons. I put a TEdit in the form so as to get an idea whether it is working or not. The last part is just a way to check by taking an example of Integer values.

Also, if I am not able to give a clear idea then just suggest me how to store a value of the concerned value using the Radiobuttons of the RadioGroup.

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin

 if RadioGroup1.Items[RadioGroup1.ItemIndex] = 'Linear Tension' then
    T:= 5;
  if RadioGroup1.Items[RadioGroup1.ItemIndex] = 'Non-Linear tension' then
    T:= 10;
end;

procedure TForm1.Edit1Change(Sender: TObject);

var
code: Integer;
value: Real;
begin
  Val(Edit1.Text,value,code);
  Edit1.Text := formatfloat('#.0', T);

end;

end.
Это было полезно?

Решение

Do not compare the captions because you will have magic values in your code.

Declare a ValueObject containing the Value and the Name

type
  TTensionValue = record
  private
    FValue : Integer;
    FName : string;
  public
    constructor Create( AValue : Integer; const AName : string );
    class function EMPTY : TTensionValue;
    property Value : Integer read FValue;
    property Name : string;
  end;

  TTensionValues = TList<TTensionValue>;

class function TTensionValue.EMPTY : TTensionValue;
begin
  Result.FValue := 0;
  Result.FName := '';
end;

constructor TTensionValue.Create( AValue : Integer; const AName : string );
begin
  // Validation of AValue and AName
  if AName = '' then
    raise Exception.Create( 'AName' );
  if AValue < 0 then
    raise Exception.Create( 'AValue' );

  FValue := AValue;
  FName := AName;
end;

Prepare a List with valid entries

type
  TForm1 = class( TForm )
  ...
    procedure RadioGroup1Click( Sender: TObject );
  private
    FTensions : TTensionValues;
    procedure PopulateTensions( AStrings : TStrings );
  public
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
  end;

procedure TForm1.AfterConstruction;
begin
  inherited;
  FTensions := TTensionValues.Create;

  FTensions.Add( TTensionValue.Create( 5, 'Linear Tension' ) );
  FTensions.Add( TTensionValue.Create( 10, 'Non-Linear tension' ) );
end;

procedure TForm1.BeforeDestruction;
begin
  FTenstions.Free;
  inherited;
end;

Populate that list to the RadioGroup

procedure TForm1.PopulateTensions( AStrings : TStrings );
var
  LValue : TTensionValue;
begin
  AStrings.BeginUpdate;
  try
    AStrings.Clear;
    for LValue in FTensions.Count - 1 do
      AStrings.Add( LValue.Name );
  finally
    AStrings.EndUpdate;
  end;
end;

procedure TForm1.FormShow( Sender.TObject );
begin
  PopulateTensions( RadioGroup1.Items );
end;

Now you only ask the TensionList for the value

procedure TForm1.RadioGroup1Click( Sender: TObject );
begin
  T := FTensions[RadioGroup1.ItemIndex].Value;
end;

The selected value now only rely on the chosen ItemIndex and not on the caption text.

Другие советы

It's really not a good idea to use a textual comparison for RadioGroup items. It's much better to simply use the ItemIndex directly:

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
  case RadioGroup1.ItemIndex of  
    0: T := 5;
    1: T := 10;
  else
    raise Exception.Create('No item selected - should not get here');
  end;
  ShowMessage(FloatToStr(T));
end;

From what I can tell, you're simply trying to change the value displayed on Edit1 when RadioGroup1 is clicked. To achieve this, all you'll need to do is move

Edit1.Text := formatfloat('#.0', T);

to the end of your RadioGroup1Click procedure.

I'm assuming Edit1Change is the onChange procedure of Edit1. If so, according to the documentation this procedure only gets called when the Text property already might have changed. So not only will this procedure not get called (how would delphi know you intend to use the value of T to change the text of Edit1?), when it does get called, it might result in a stack overflow, since changing the text value indirectly calls the onChange event. (though setting it to the same value it already had might not call it).

That being said, checking if a value is being changed properly, does not require a TEdit, a TLabel would be a better fit there. Though in your case, i would opt for simply placing a breakpoint and stepping through the code to see if the value get's changed correctly.

There are also some a lot of additional problems with your code, such as inconsistent formatting, magic values, bad naming conventions and lines of code that serve no purpose, I would suggest you read up on those before you get into bad habits.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top