Текущий архив: 2005.07.11;
Скачать: CL | DM;
ВнизИспользование переменной из одного модуля в другом Найти похожие ветки
← →
user_gosha (2005-06-13 23:21) [0]Есть два модуля Unit6(fmChoise) и Unit7(fmEdit).
В Unit6 определена переменная ResN (причем в интерфейсе)
...
var
fmChoise: TfmChoise;
ResN: Integer;
implementation
uses Unit1, Unit7;
...
Далее в этом модуле по нажатию кнопки в зависимости от условия, эта переменная получает численное значение и открывается форма fmEdit....
procedure TfmChoise.btnOKClick(Sender: TObject);
begin
ResN:=0;
If fmChoise.RadioButton1.Checked then ResN:=1;
If fmChoise.RadioButton2.Checked then ResN:=2;
If fmChoise.RadioButton3.Checked then ResN:=3;
If fmChoise.RadioButton4.Checked then ResN:=4;
If fmChoise.RadioButton5.Checked then ResN:=5;
If fmChoise.RadioButton6.Checked then ResN:=6;
If fmChoise.RadioButton7.Checked then ResN:=7;
fmChoise.Label2.Caption:=IntToStr(ResN);
If ResN=0 then
ShowMessage("Не может быть НОЛЬ!")
Else fmEdit.Show;
...
Затtv в этой форме это значение переменной проверяется и в зависимости от числа выполняются действия.
Ну например просто вывод этого значения:
procedure TfmEdit.FormCreate(Sender: TObject);
begin
fmEdit.Label1.Caption:=IntToStr(Unit6.ResN);
end;
Проблема в том, что там рисуется 0, всегда 0, вне зависимости от значения этой переменной в форме fmChoise.
(В форме fmChoise тоже есть Лейбл2)fmChoise.Label2.Caption:=IntToStr(ResN);
, так вот он показывает выбранное значение даже после открытия формы fmEdit
Помогите плиз! ОЧень нада...
← →
Defunct © (2005-06-13 23:34) [1]procedure TfmEdit.FormCreate(Sender: TObject);
begin
fmEdit.Label1.Caption:=IntToStr(Unit6.ResN);
end;
А что ж ты хотел? Форма у тебя небось однократно создается, и то что было при создании то и выводится в Label1. Открываешь-то ты форму видимо fmEdit.Show, вот и ставь свой обработчик не только в OnCreate, но и в OnShow.
(скрипя зубами выдавил эту заплатку, т.к. то, что ты пишешь, написано в очень неправильном стиле).
По ходу. Извини, но даже я (не сторонник чтения талмудов) в данном случае посоветую тебе приобрести и прочитать для начала какую-нибудь хорошую книгу по Delphi.
← →
user_gosha (2005-06-14 11:04) [2]Спасиба большое! Сделал использование переменной в Show вместо Create и все заработало.
ЗЫ Почему написано в неправильном стиле? Книжку вроде читаю... Объясни хотя бы в чем я не прав. Буду исправляться.
Еще раз сенкс.
← →
Гаврила © (2005-06-14 11:37) [3]
> Почему написано в неправильном стиле?
1.
> Есть два модуля Unit6(fmChoise) и Unit7(fmEdit).
не надо так называть юниты, названия должны быть осмысленные
2.
> Сделал использование переменной в Show вместо Create и все
> заработало
У тебя форма создается автоматически при старте приложения. Этого надо избегать, мне кажется, что в твоем случае уместнее было бы создавать \ разрушать форму по мере необходимости
3.
> procedure TfmEdit.FormCreate(Sender: TObject);
> begin
> fmEdit.Label1.Caption:=IntToStr(Unit6.ResN);
> end;
Не нужно обращаться к глобальной переменной fmEdit в данном случае ,пиши просто
Label1.Caption:=IntToStr(Unit6.ResN);
4.
> implementation
>
> uses Unit1, Unit7;
Мое имхо ,что нужно по возможности избегать цикличного Uses, в идеале все uses должны быть в секции interface, чтобы получалось "дерево", а не "граф"
5.
> procedure TfmChoise.btnOKClick(Sender: TObject);
Кривая процедура. Можно использовать Tag, или еще как-то
← →
Defunct © (2005-06-14 13:53) [4]> Почему написано в неправильном стиле?
По существу тебе ответил Гаврила © (14.06.05 11:37) [3].
Я же еще добавлю пример, как IMHO должно осуществляться взаимодействие двух форм в твоем случае.
Тебе нужно открыть некий диалог и принять некий результат. (Наглядным примером могут послужить классы вкладки Dialogs.) Основная идея такова - дилог запускается, пользователь что-то выбирает и подтверждает свой выбор кнопкой Ok, результат диалога возвращается в процедуру откуда был вызван диалог, этот результат сразу применяется по назначению. Как это может выглядеть в коде? Ну например так:
Пишем модуль с формой диалога:unit uSelectSomethingDialog;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfmSelectSomethinDialog = class(TForm)
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
procedure RadioButtonClick(Sender: TObject);
public
Result : Integer; // <---- Это будет результат диалога
end;
implementation
{$R *.dfm}
{ Этот (OnCreate) обработчик можно полностью выбросить, если
все требуемые начальные настройки задать в Object Inspector"е.
Сейчас здесь задаются начальные параметры:
Tag у кнопок, Caption формы поумолчанию, и обработчики
OnClick для кнопок выбора.
}
procedure TfmSelectSomethinDialog.FormCreate(Sender: TObject);
var
i : integer;
aTag : integer;
begin
aTag := 0;
Button1.ModalResult := mrOk; // <--- Это можно задать в инспекторе
// Следующий цикл тоже не нужен, обычно все
// начальные настройки задаются в инспекторе объектов
for i := 0 to ComponentCount - 1 do
if Components[i] is TRadioButton then
with TRadioButton(Components[i]) do
begin
inc(aTag);
Tag := aTag;
OnClick := RadioButtonClick;
if Checked then Result := Tag;
end;
// Выведем результат "по-умолчанию" в шапку формы
Caption := Format("Selected button = %D", [Result])
end;
// Обработчик всех RadioButton"ов
procedure TfmSelectSomethinDialog.RadioButtonClick(Sender: TObject);
begin
Result := TControl(Sender).Tag;
Caption := Format("Selected button = %D", [Result])
end;
end.
Теперь попробуем этот диалог использовать. Создаем еще один модуль с формой. Добавляем в uses uSelectSomethingDialog, кидаем на форму кнопку и label, и пишем такой вот обработчки нажатия на кнопку:procedure TForm1.Button1Click(Sender: TObject);
begin
with TfmSelectSomethinDialog.Create( Self ) do
try
ShowModal;
Label1.Caption := IntToStr(Result);
finally
Free
end
end;
Просто и надежно.
← →
user_gosha (2005-06-14 15:16) [5]Спасибо! Буду знать.
← →
evvcom © (2005-06-14 17:14) [6]Только еще перед end все же ; лучше ставить. Это мое имхо. Почему? Потому что машинного кода это не добавляет, на размер исходника начхать, а если перед этим end потом добавить еще строку(и), то не надо будет помнить, что там чего-то еще не хватает. Компилятор, конечно, ругнется, но несколько секунд из-за ерунды потеряешь.
Страницы: 1 вся ветка
Текущий архив: 2005.07.11;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.046 c