|
Вопрос # 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);
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|