| 
| 
 | Вопрос # 4 258/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Помогите чайнику! Есть две формы, в одной определяем переменную Path (через выбор в листбокс). В другой по значению этой переменной загружаю файл.
 У меня не получается передать из одной формы в другую значение Path. В учебнике говорят нужно объявить переменные в обоих модулях в разделе interface public и в implementation uses прописать имена модулей, у меня так не работает.
 Что делать?
 
|  |   Вопрос задал: KwaK (статус: Посетитель)Вопрос отправлен: 1 июня 2010, 03:53
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: min@y™ Использование глобальных переменных - плохой подход, которым нужно пользоваться, если по-другому никак.Если хочется, чтобы глобальная переменная была доступна из нескольких модулей, создай новый модуль:
 
 unit GlobalVars;
 
interface
 
var
  Path: string; // Глобальная переменная
 
implementation
 
end.Затем в модулях, где должна быть доступна переменная Path, добавь в раздел uses модуль GlobalVars. 
 Всё это 100500 мильёнов раз обсуждалось в интернете и есть абсолютно во всех книжках по паскалю для чайников.
 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 1 июня 2010, 08:17
 Оценка за ответ: 2
 Комментарий к оценке: может не совсем понятно, но именно про это я имел ввиду, когда написал "В учебнике говорят нужно объявить переменные в обоих модулях в разделе interface public и в implementation uses прописать имена модулей, у меня так не работает"Следуя совету я создал
 unit GlobalVars;
 
 interface
 
 var
 Path: string;
 
 implementation
 
 end.
 в Юнитах, где задаю переменную и где ее считываю прописал
 implementation
 
 uses GlobalVars;
 
 end.
 и ни фига не работает. Во втором юните Path='', вместо пути к файлу, заданному ПРЕДВАРИТЕЛЬНО в первом юните
 |  Ответ #2. Отвечает эксперт: Тов. Женька Здравствуйте, KwaK!
 Ну, я бы поступил так:
 
 unit Unit1;
 ...
 type TForm1=class(TForm)
 ...
 private
 Path : String;
 ...
 end;
 
 uses Unit2;
 
 procedure TMainForm.Button1Click(Sender: TObject);
 begin
 with TForm2.Create(nil) do
 try
 // вызываем нашу вторую форму. Тут важно получить правильный ModalResult
 // проще всего этого достичь, если разместить на форме кнопку, допустим, "ОК" и задать
 // ей свойство ModalResult равным mrOk
 
 if ShowModal = mrOK then
 Path := ListBox1.Items.ValueFromIndex[ListBox1.ItemIndex];
 // если возвращено mrOK, то присваиваем Path значение выделенной строки из ListBox'a.
 finally
 Destroy;
 end;
 end;
 
 Преимущество такого подхода в том, что переменная Path будет доступна только в пределах своего юнита, а во втором юните не нужно писать никакого дополнительного кода.
 
|  | Ответ отправил: Тов. Женька (статус: 3-ий класс)Время отправки: 1 июня 2010, 08:53
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 9; последнее сообщение — 7 июня 2010, 13:59; участников в обсуждении: 5. 
|   | min@y™ (статус: Доктор наук), 1 июня 2010, 22:47 [#1]:Смени оценку. Ты не прав! То, что у тебя что-то не работает, не моя вина, а как раз твой косяк. Попробую включить телепатор: возможно переменная с именем Path у тебя объявлена в нескольких модулях.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | DeLF (статус: Посетитель), 1 июня 2010, 22:59 [#2]:min@y™ однозначно прав, оценка незаслужено исправлена в худшую сторону. если у тебя не пашет разберайся почему |  
|   | unl0K (статус: Посетитель), 1 июня 2010, 23:05 [#3]:min@y™ - прав! И он не предлогает тебе обявлять переменную в нужных модулях, а предлогает подключить модуль. --
 Можно еще так:
 Допустим есть фаорма 1, просто объяви эту переменную в паблике:
 uses
 ...
 type
 TForm1 = class(TForm)
 private
 public
 Path:string;
 end;
 И работай с ней как обычно, а потом обращайся из нужного модуля так: Form1.Path, но опять же - модуль первой формы должен быть подключен. Так что сделай как говорит min@y™ и не парся.
 Относись к людям так, как хотел бы, чтобы они к тебе относились! |  
|   | KwaK (статус: Посетитель), 1 июня 2010, 23:24 [#4]:тогда объясните что не так. не понимаю где косяк, я все сделал в соответствии с рекомендацией: создал НОВЫЙ модуль varGlobals, объявил в нем НОВУЮ переменную Path (ранее была puti). В свои модули вставил Uses varGlobals, переменную Path в них НЕ ОБЪЯВЛЯЛ. В первом модуле Path присваиваю значение. При нажатии на кнопку запускается второй модуль. В нем вывожу Path на форму (потому что программа работает некорректно) с помощью
 label8.Caption:='before '+Path+'@';
 в результате в указанной лэйбле вижу 'before @', т.е. Path=''
 Я оценил ответ эксперта. Все сделано по его рекомендации, результат не получен.
 если мне объяснят, в чем я не прав, готов сменить оценку (как?)
 |  
|   | KwaK (статус: Посетитель), 2 июня 2010, 00:05 [#5]:Уважаемый unl0K! два модуля о которых идет речь uStud(переменная Path получает значение) и uTest (переменная Path используется)(соответственно формы fStud и fTest). Вставляю код
 unit uStud;
 ...
 private
 { Private declarations }
 public
 { Public declarations }
 Path:string;
 end;
 ...
 procedure TfStud.ComboBox3Change(Sender: TObject);
 begin
 Path:= grupi + '\'+ predmet + '\' + test+'\' ;
 label7.Caption:=Path;
 end;
 переменные grupi,predmet и test предварительно задаются, что я вижу по изменению в label7.Caption
 далее перехожу на uTest через кнопку
 procedure TfStud.BitBtn1Click(Sender: TObject);
 begin
 Hide;
 fTest.Show;
 end;
 
 
 в uTest вставил
 ...
 uses uStud
 ...
 procedure TfTest.FormCreate(Sender: TObject);
 begin
 label8.Caption:='before '+fStud.Path+'@';
 end;
 вижу label8.Caption='before @', т.е. Path ни фига не передалось
 |  
|   | KwaK (статус: Посетитель), 2 июня 2010, 01:41 [#6]:приношу извинения min@y™ спасибо unl0K он мне объяснил мою ошибку
 готов сменить оценку, только я там вижу их две 1 и -1, как это исправить?
 тем  не менее ваш ответ скорее отписка
 |  
|   | Ерёмин А.А. (статус: *Администратор), 4 июня 2010, 10:12 [#7]:По просьба автора вопроса оценка за ответ min@y™ изменена с -1 на 2. Напомню, что правила не предусматривают данной операции, только в качестве исключения. |  
|   | min@y™ (статус: Доктор наук), 4 июня 2010, 10:24 [#8]: Цитата (Ерёмин А.А.): По просьба автора вопроса оценка за ответ min@y™ изменена с -1 на 2. Вот спасибо, счастье-то какое!
 Побегу в магазин!
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | KwaK (статус: Посетитель), 7 июня 2010, 13:59 [#9]:Спасибо всем, кто помог в решении вопроса! Причина "ошибочной" рекомендации min@y™ в моей неправильной работе с событиями. Из приведенного мной кода (от 2 июня 2010, 00:05) видно, что переменная Path определяется в uStud при работе этого юнита, а считывается в uTest в процедуре
 procedure TfTest.FormCreate(Sender: TObject);
 указанная процедура запускается на этапе начала работы программы и, естественно, в этот момент модуль uStud еще не работал, значение Path задено не было. В рассматриваемой задаче необходимо было работу с Path прописать на событие
 procedure TfTest.FormShow(Sender: TObject);
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |