Доступ к значениям из одной формы в другой

Я пытаюсь встроить языковой переключатель в одну из моих программ.

Когда пользователь выбирает язык, а во время выполнения приложение переводится. У меня это получилось в небольшом тестовом проекте. НО только когда формы создаются автоматически, чего я не хочу.

способ создания форм следующий:

Примечание: большинство моих форм — это формы fsMDIChild.

ParametersForm := TParametersForm.Create(Self);  //(consider this the mainform for now)

В ParametersForm у меня есть

procedure TParametersForm.FormCreate(Sender: TObject);
begin
 ResourceStringsDM.ParametersF; //(consider this the second form)
end;

этот модуль данных содержит заголовки для ParametersForm.

procedure TResourceStringsDM.ParametersF;
 begin
   with ParametersForm do
   begin
    bsSkinLabel1.Caption := 'Execute Nieuwefacturen';
    bsSkinLabel2.Caption := 'Execute Viewfacturen';
   end;
 end;

Я добавил ResourceStringsDM к использованию реализации ParametersForm и ParametersForm к использованию интерфейса ResourceStringsDM.

Все вышеперечисленное дает мне причину нарушения доступа в процедуре, где он устанавливает заголовки, использует ParametersForm (имя var формы, которую я хочу перевести), но в этот момент этот var равен нулю. Вероятно, потому что это еще не сделано, создавая форму, и еще не заполнив форму var.

Единственный способ заставить все это работать - использовать

 Application.CreateForm(TParametersForm, ParametersForm); 

Но я хочу избежать этого, прочитав об этом, и что вы должны использовать это только в своей основной форме. Также он не очень хорошо обрабатывает передаваемые параметры.

Есть ли у кого-нибудь из вас, замечательных людей, какие-либо подсказки или советы / помощь, чтобы получить мне доступ к заголовкам формы 1 из формы 2?

Я, наверное, забыл тонны информации, которая вам, ребята, нужна. просто скажи мне, и я добавлю это.


person Bram ten Cate    schedule 07.02.2014    source источник
comment
Почему бы не сделать это правильно, используя настоящие resourcestring константы и встроенную поддержку языка вместо того, чтобы самому изобретать велосипед? (И просто к вашему сведению: SO — это сайт для профессионалов; вероятно, это не настоящее слово в английском языке, как и вы. Вы не пишете здесь своим приятелям. Пожалуйста, используйте настоящие слова.)   -  person Ken White    schedule 08.02.2014
comment
вау, мистер сварливый.....поправил язык для твоего развлечения. Но ответ, который вы дали, не то, что я спросил.   -  person Bram ten Cate    schedule 11.02.2014
comment
Я не дал вам ответа - я разместил комментарий, задав вопрос здравого смысла, чтобы убедиться, что вы знаете, что уже есть возможность сделать это без всех неуклюжих вещей, которые вы добавляете, чтобы попытаться сделать это. себя. Что касается сварливости, это профессиональный сайт для профессиональных людей, и вполне разумно ожидать, что вы будете использовать здесь актуальную лексику. Если вам не стоит утруждать себя написанием четкого вопроса с использованием реальных слов, то почему это должно стоить наших усилий, чтобы помочь вам решить ваши проблемы, используя наше время?   -  person Ken White    schedule 11.02.2014
comment
@Bram Это не только для нашего развлечения. Я понятия не имею, что должно означать "prolly", не глядя. Таким образом, уменьшается ваша вероятность того, что люди потратят время, чтобы ответить вам. Ваша работа заключается в том, чтобы перечитывать свои вопросы при их публикации и следить за тем, чтобы ответы были максимально простыми.   -  person Jan Doggen    schedule 24.02.2014


Ответы (1)


В шаблоне «Приложение MDI» (file->new-other->...> ни дочерние элементы MDI не создаются автоматически, ни единица дочерней формы не содержит глобальную ссылку на форму. Этому есть причина, более одного экземпляра дочерняя форма должна иметь возможность запускаться одновременно. Например, если у вас есть два экземпляра одного и того же дочернего элемента, какой из них будет содержать ссылку на форму?

В любом случае, конечно, можно не использовать этот дизайн, но тогда, если вы не используете конструкцию, которую упоминаете в вопросе, вы несете ответственность за назначение экземпляра ссылке самостоятельно. Так что либо сделайте это (что я не рекомендую):

procedure TParametersForm.FormCreate(Sender: TObject);
begin
 ParametersForm := Self; 
 ResourceStringsDM.ParametersF; //(consider this the second form)
end;


или лучше передать экземпляр функции в вашем модуле данных, чтобы она могла с ним работать:

procedure TResourceStringsDM.ParametersF(ParametersForm: TParametersForm);
 begin
   with ParametersForm do
   begin
    bsSkinLabel1.Caption := 'Execute Nieuwefacturen';
    ...

 

procedure TParametersForm.FormCreate(Sender: TObject);
begin
 ResourceStringsDM.ParametersF(Self); //(consider this the second form)
end;
person Sertac Akyuz    schedule 24.02.2014
comment
Спасибо за ответ Sertac Akyuz! я попробую это, когда у меня будет немного времени на этих выходных - person Bram ten Cate; 07.03.2014