Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.052 c
1-1118618322
01
2005-06-13 03:18
2005.07.11
Как сохранить структуру в файл


14-1118403581
NightStranger
2005-06-10 15:39
2005.07.11
Smile


5-1089704607
sergvc
2004-07-13 11:43
2005.07.11
Составной компонент типа TLabeledEdit


4-1115537644
alpet
2005-05-08 11:34
2005.07.11
Странный регион


4-1115971874
Ярослав
2005-05-13 12:11
2005.07.11
Задания принтера