Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

Использование переменной из одного модуля в другом   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.045 c
14-1118319350
stud
2005-06-09 16:15
2005.07.11
вывести мигающую картинку в ячейке dbgrid


1-1119530052
$HiC0
2005-06-23 16:34
2005.07.11
TListView и цвета отдельных итемов


8-1110034346
Narik
2005-03-05 17:52
2005.07.11
Как прокрутить видео файл компонента MediaPlayer


1-1118552665
Serg777
2005-06-12 09:04
2005.07.11
Прочитать содержимое ячейки памяти


5-1088779512
FX
2004-07-02 18:45
2005.07.11
Компонент и WM_DISPLAYCHANGE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский