Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 258

/ вопрос открыт /

Здравствуйте, эксперты!
Помогите чайнику! Есть две формы, в одной определяем переменную Path (через выбор в листбокс). В другой по значению этой переменной загружаю файл.
У меня не получается передать из одной формы в другую значение Path. В учебнике говорят нужно объявить переменные в обоих модулях в разделе interface public и в implementation uses прописать имена модулей, у меня так не работает.
Что делать?

KwaK Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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™

min@y™ (статус: Доктор наук), 1 июня 2010, 22:47 [#1]:

Смени оценку. Ты не прав! То, что у тебя что-то не работает, не моя вина, а как раз твой косяк.
Попробую включить телепатор: возможно переменная с именем Path у тебя объявлена в нескольких модулях.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DeLF

DeLF (статус: Посетитель), 1 июня 2010, 22:59 [#2]:

min@y™ однозначно прав, оценка незаслужено исправлена в худшую сторону. если у тебя не пашет разберайся почему
unl0K

unl0K (статус: Посетитель), 1 июня 2010, 23:05 [#3]:

min@y™ - прав! И он не предлогает тебе обявлять переменную в нужных модулях, а предлогает подключить модуль.
--
Можно еще так:
Допустим есть фаорма 1, просто объяви эту переменную в паблике:
uses
...
type
TForm1 = class(TForm)
private
public
Path:string;
end;
И работай с ней как обычно, а потом обращайся из нужного модуля так: Form1.Path, но опять же - модуль первой формы должен быть подключен. Так что сделай как говорит min@y™ и не парся.
Относись к людям так, как хотел бы, чтобы они к тебе относились!
KwaK

KwaK (статус: Посетитель), 1 июня 2010, 23:24 [#4]:

тогда объясните что не так. не понимаю где косяк, я все сделал в соответствии с рекомендацией: создал НОВЫЙ модуль varGlobals, объявил в нем НОВУЮ переменную Path (ранее была puti).
В свои модули вставил Uses varGlobals, переменную Path в них НЕ ОБЪЯВЛЯЛ. В первом модуле Path присваиваю значение. При нажатии на кнопку запускается второй модуль. В нем вывожу Path на форму (потому что программа работает некорректно) с помощью
label8.Caption:='before '+Path+'@';
в результате в указанной лэйбле вижу 'before @', т.е. Path=''
Я оценил ответ эксперта. Все сделано по его рекомендации, результат не получен.
если мне объяснят, в чем я не прав, готов сменить оценку (как?)
KwaK

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

KwaK (статус: Посетитель), 2 июня 2010, 01:41 [#6]:

приношу извинения min@y™
спасибо unl0K он мне объяснил мою ошибку
готов сменить оценку, только я там вижу их две 1 и -1, как это исправить?
тем не менее ваш ответ скорее отписка
Ерёмин А.А.

Ерёмин А.А. (статус: *Администратор), 4 июня 2010, 10:12 [#7]:

По просьба автора вопроса оценка за ответ min@y™ изменена с -1 на 2. Напомню, что правила не предусматривают данной операции, только в качестве исключения.
min@y™

min@y™ (статус: Доктор наук), 4 июня 2010, 10:24 [#8]:

Цитата (Ерёмин А.А.):

По просьба автора вопроса оценка за ответ min@y™ изменена с -1 на 2.

Вот спасибо, счастье-то какое!
Побегу в магазин!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
KwaK

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);

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.03 сек.