PDA

Visualizza la versione completa : [DELPHI] TRadioButton e TRadioGroup


ClaudioMalorgio
12-11-2010, 15:06
Salve

Sto sviluppando applicativi in Delphi con embarcadero RAD studio XE a scopo didattico personale (voglio imparare a programmare in delphi)

ho fatto un piccolo convertitore banale solo che non mi funziona la scelta radio per il tipo di dato da convertire. cioè in base alla scelta del radiogrup dovrebbero cambiare i valori di conversione e i label delle TEdit dove si inserisce il numero da convertire ma non va :(

ecco il codice :



unit Convertitore;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Miglia: TEdit;
Chilometri: TEdit;
miglialbl: TLabel;
chilometrilbl: TLabel;
arrotonda: TCheckBox;
gruppomisure: TRadioGroup;
pollicitocentimetri: TRadioButton;
pieditometri: TRadioButton;
iardetometri: TRadioButton;
migliatochilometri: TRadioButton;
procedure ChilometriChange(Sender: TObject);
procedure MigliaChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure gruppomisureClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Conv: Extended;
implementation

{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Conv := 2.54 ; // Inizio a dichiarare la variabile dai pollici
// Inizializzo campi di testo
Chilometri.Text := '0' ;
Miglia.Text := '0' ;
end;

procedure TForm1.gruppomisureClick(Sender: TObject);
begin
case gruppomisure.ItemIndex of // Effettuo dei cambiamentri al convertitore in base alla scelta della radio
0: begin
Conv := 2.54 ; // Pollici
miglialbl.Caption := 'Pollici' ;
chilometrilbl.Caption := 'Centimetri' ;
end;
1: begin
Conv := 0.30 ; // Piedi
miglialbl.Caption := 'Piedi' ;
chilometrilbl.Caption := 'Metri' ;
end;
2: begin
Conv := 0.9 ; // Iarde
miglialbl.Caption := 'Iarde' ;
chilometrilbl.Caption := 'Metri' ;
end;
end;
miglia.Text := '0' ;
chilometri.Text := '0' ;
end;

procedure TForm1.ChilometriChange(Sender: TObject);
var
val: extended ;
begin
if Chilometri.focused then // Evitiamo Cambiamenti a Cascata
begin
// 0.39 = 1/ 2.54
val := StrtoFloat(Chilometri.Text) / Conv ;
if arrotonda.Checked then
val := Round(val) ; // Arrotondamento se necessario
miglia.Text := FloattoStr(val) ;
end;
end;

procedure TForm1.MigliaChange(Sender: TObject);
var
val: extended ;
begin
if Miglia.focused then // Eviatiamo cambiamenti a cascata
begin
val := Conv * StrtoFloat(Miglia.Text) ;
if arrotonda.Checked then
val := Round(val) ;
chilometri.Text := FloattoStr(val) ;
end;
end;
end.


Questo è il codice per disegnare la form



object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 213
ClientWidth = 276
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object miglialbl: TLabel
Left = 8
Top = 169
Width = 36
Height = 13
Caption = 'Miglia : '
end
object chilometrilbl: TLabel
Left = 152
Top = 169
Width = 57
Height = 13
Caption = 'Chilometri : '
end
object Miglia: TEdit
Left = 8
Top = 188
Width = 121
Height = 21
TabOrder = 4
OnChange = MigliaChange
end
object Chilometri: TEdit
Left = 152
Top = 188
Width = 121
Height = 21
TabOrder = 5
OnChange = ChilometriChange
end
object arrotonda: TCheckBox
Left = 8
Top = 146
Width = 97
Height = 17
Caption = 'Arrotonda'
TabOrder = 6
end
object gruppomisure: TRadioGroup
Left = 8
Top = 8
Width = 265
Height = 132
Caption = 'Opzioni di conversione: '
TabOrder = 7
OnClick = gruppomisureClick
end
object pollicitocentimetri: TRadioButton
Left = 24
Top = 32
Width = 113
Height = 17
Caption = 'Pollici/Centimetri'
TabOrder = 0
end
object pieditometri: TRadioButton
Tag = 1
Left = 24
Top = 55
Width = 113
Height = 17
Caption = 'Piedi/Metri'
TabOrder = 1
end
object iardetometri: TRadioButton
Tag = 2
Left = 24
Top = 78
Width = 113
Height = 17
Caption = 'Iarde/Metri'
TabOrder = 2
end
object migliatochilometri: TRadioButton
Tag = 3
Left = 24
Top = 101
Width = 113
Height = 17
Caption = 'Miglia/Chilometri'
TabOrder = 3
OnClick = gruppomisureClick
end
end

alka
07-12-2010, 11:19
Nel tuo Form, hai inserito sia un controllo TRadioGroup, sia diversi controlli TRadioButton, poi hai agganciato un metodo all'evento OnClick del RadioGroup, che però non verrà mai richiamato in quanto non hai inserito alcun elemento nel controllo, ma hai creato successivamente dei RadioButton separati.

Il controllo TRadioButton può essere inserito all'interno di un controllo contenitore, quale è ad esempio un TPanel, comportandosi come una casella di spunta che lavora in "modalità esclusiva": quando è selezionato, nello stesso contenitore altri controlli analoghi vengono deselezionati, poiché appartenenti allo stesso gruppo dal punto di vista logico.

Quando occorre disporre di molte opzioni, diventa tedioso creare tanti contenitori (es. Panel, GroupBox, ecc.) e altrettanti RadioButton all'interno.

Il controllo TRadioGroup viene in aiuto in questo frangente: permette di raffigurare sul Form una casella di raggruppamento creando automaticamente al proprio interno tutti i RadioButton che servono per esprimere le opzioni indicate nella proprietà Items del controllo.

Da qui il tuo problema: o utilizzi il controllo TRadioGroup, con l'evento OnClick agganciato, e definisci nella proprietà Items le diverse opzioni selezionabili, oppure crei una GroupBox e metti al suo interno tanti RadioButton quante sono le opzioni, gestendone l'evento OnClick sui singoli pulsanti.

Tu hai fatto una mescolanza tra le due cose, creando un RadioGroup "vuoto" (e che non è un contenitore, tant'è che i RadioButton sono spostabili all'esterno dato che il loro "parent" è il Form) e aggiungendo dei RadioButton separati il cui evento di clic non è gestito.

Ciao! :ciauz:

Loading