Check out app\code\core\Mage\Adminhtml\Block\Tax\Rate\Form.php
for an example of how Magento does this, which is slightly different than Bijal Bhavsar's method.
First it defines it's Yes/No select
$fieldset->addField('zip_is_range', 'select', array(
'name' => 'zip_is_range',
'label' => Mage::helper('tax')->__('Zip/Post is Range'),
'options' => array(
'0' => Mage::helper('tax')->__('No'),
'1' => Mage::helper('tax')->__('Yes'),
)
));
Then another field, (which will be hidden sometimes)
$fieldset->addField('zip_from', 'text', array(
'name' => 'zip_from',
'label' => Mage::helper('tax')->__('Range From'),
'required' => true,
'maxlength' => 9,
'class' => 'validate-digits'
));
Then it sets the dependance, right above _prepareForm()
$this->setChild(
'form_after',
$this->getLayout()->createBlock('adminhtml/widget_form_element_dependence')
->addFieldMap('zip_is_range', 'zip_is_range')
->addFieldMap('zip_from', 'zip_from')
->addFieldDependence('zip_from', 'zip_is_range', '1')
);
Note on prefixes
If you at any point set a prefix like this: $form->setHtmlIdPrefix('mymodule_');
then you'll need to put the prefix in the dependence block like so:
$this->setChild(
'form_after',
$this->getLayout()->createBlock('adminhtml/widget_form_element_dependence')
->addFieldMap('mymodule_zip_is_range', 'mymodule_zip_is_range')
->addFieldMap('mymodule_zip_from', 'mymodule_zip_from')
->addFieldDependence('mymodule_zip_from', 'mymodule_zip_is_range', '1')
);