Обращение к форме unit-a 1 с unit-a 2

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Буржуй
незнакомец
Сообщения: 9
Зарегистрирован: 09.03.2008 20:47:57
Откуда: Архангельск

Обращение к форме unit-a 1 с unit-a 2

Сообщение Буржуй »

Всем салют!

Вопрос собственно в Теме, что и где нужно прописать что бы иметь возможность обращаться (на прямую конечно) к компонентам на форме с другого юнита не имеющего формы. (напрмимер проверить положение CheckBox-a )
А то приходиться засорять юнит с формой промежуточными переменными и делать обращение к ним :(

Поможите кто чем может...
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

что-то я тебя в Теме не видел . . .
=)

uses unit2;

if Form2.checkbox1.checken then
Form2.label1.text := 'novui caption';
Буржуй
незнакомец
Сообщения: 9
Зарегистрирован: 09.03.2008 20:47:57
Откуда: Архангельск

Сообщение Буржуй »

На что лазарь пишет
Project raised exception class 'External: SIGSEGV '

Если не трудно можно полный код двух юнитов привести?
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Пример можно увидеть который вызывает ошибку?
Скорее всего ошибка в Вашем коде
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

скорее всего пытаешся обратиться к форме2, а саму форму2 ты ешё не создал - вот и ошибка.
Буржуй
незнакомец
Сообщения: 9
Зарегистрирован: 09.03.2008 20:47:57
Откуда: Архангельск

Сообщение Буржуй »

Unit1 голый юнит с формой, чек боксом, и лейблом
Unit2

Код: Выделить всё

unit Unit2; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Unit1;

implementation
begin
If Form1.CheckBox1.Checked then
Form1.Label1.Caption:='It works' ;

end.

Project

Код: Выделить всё

program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms
  { you can add units after this }, Unit1, Unit2;

begin

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

Код: Выделить всё

implementation
begin
If Form1.CheckBox1.Checked then
Form1.Label1.Caption:='It works' ;

end.


у тя код вне класа формы два
кнопку брось на вторую форму типа так

Код: Выделить всё

implementation
begin
form2.button1.click()
begin
If Form1.CheckBox1.Checked then
Form1.Label1.Caption:='It works' ;
end;
end.


ну или оншоу используй
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

А где создание второй формы?
v-t-l
энтузиаст
Сообщения: 745
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Код: Выделить всё

implementation
begin
If Form1.CheckBox1.Checked then
Form1.Label1.Caption:='It works' ;

end.

Странно, что это компилируется. А где функция или процедура какая-нибудь? Видно компилятор воспринимает это, как initialization-секцию. Соответственно, выполняется этот код еще до того, как начинает работатать Application.Initialize, CreateForm и т.д.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Это старая нотация - ещё из 5-го турбо-паскаля.
initialization/finalization появились только в 1-й дельфи
Буржуй
незнакомец
Сообщения: 9
Зарегистрирован: 09.03.2008 20:47:57
Откуда: Архангельск

Сообщение Буржуй »

Мужики! В вопросе же написано - второй юнит не имеет формы!
Запихивание

Код: Выделить всё

If Form1.CheckBox1.Checked then 
Form1.Label1.Caption:='It works'

в процедуру результат не меняет. :(
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Ещё раз опиши начальные условия - только пожалуста подробно и правильно, чтобы исключить не верное толкование твоего письма. И можно код добавить.
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

тогда вместо биттонклик ставь процедуру и покажи где ты её вызываешь и как обьявляешь.
Буржуй
незнакомец
Сообщения: 9
Зарегистрирован: 09.03.2008 20:47:57
Откуда: Архангельск

Сообщение Буржуй »

Извиняюсь за возможно невнятный вопрос. Дело значит такое:
Имеется программа состоящая из двух юнитов. Первый юнит содержит форму (главный) второй юнит форму не содержит (тоесть был создан не как ...New Form а как ...New Unit) по тому как дополнительная форма мне ненужна а код большой, что требует его разноса на несколько юнитов. На форме лежит CheckBox (к приемру)
Вопрос! Что и где нужно прописать что бы иметь возможность обращения к чек боксу из второго юнита, на прямую?
На прямую иметеся в виду без промежуточных переменных (можно создать булевую переменную и в первом юните приравнять её к чек боксу а во втором юните написать

Uses Unit1

и во втором юните уже проверять переменную а не чек бокс, что кстати работает! но появляется лишнаяя переменная и дополнительный код)
Коды юнитов были приведены выше.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Если я тебя правильно понял - тебе лучше использовать include-файлы
Ответить