Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];

Вниз

Проблема с формами... или руками моими...   Найти похожие ветки 

 
x.pro   (2007-09-29 11:25) [0]

Здравствуйте, мастера!

У меня возникла проблема такого сорта: есть 3 формы (f1(unit1), f2(unit2), f3(unit3)). f1 создается при запуске проги. Жму на кнопку на f1 - создается f2, жму на кнопку на f2 - создается f3. Все три формы в настройках проекта - Auto-Create. Код создания форм:

procedure BtnClick...
var
f: Tf2;
begin
f := Tf2.Create(self);
f.Show;
f.Label1.Caption := "...";
...
end;

Цель. Из главного окна проги создать f2. из нее запустить f3, и передать компонентам на ней информацию из f2. f3 отрабатывает и передает данные в f2.
Понять не могу почему данные f3 -> f2 не передаются. хотя f3 -> f1 передаются.

Заранее, спасибо!


 
boa_kaa ©   (2007-09-29 11:29) [1]

ошибка в 17ой строке


 
Washington ©   (2007-09-29 11:31) [2]

В uses поройся.


 
x.pro   (2007-09-29 11:31) [3]

17ой или 7й?


 
x.pro   (2007-09-29 11:33) [4]

да, Delphi генерирует 2 uses: до и после описания формы. так что куда нужно дописать?


 
Washington ©   (2007-09-29 11:36) [5]

После


 
Washington ©   (2007-09-29 11:36) [6]

В uses формы 3 нужно вписать f2


 
x.pro   (2007-09-29 11:37) [7]

в uses у меня все описано. а обращение к f2 из f3 такое:

...
f2.Edit1.Text := f3.label1.capton;
...


 
x.pro   (2007-09-29 11:45) [8]

все равно не работает... блин.

а какой uses за что отвечает?


 
engine ©   (2007-09-29 11:54) [9]

uses отвечает за объявление unit"ов.
А уж за что отвечают твои unit"ы — это у тебя надо спросить.


 
x.pro   (2007-09-29 11:58) [10]

отвечу. разные формы сделаны для более наглядного обращения к БД. f3 - берет данные из f2 (таблица, представляющая таблицу БД), после использует эти данные и возвращяет результат в f2 ужt в ListView. а F1 создана просто типа заставки...


 
x.pro   (2007-09-29 12:09) [11]

в общем. как все решилось. в F3 по нажатии на кнопке кроме

...
f2.edit1.text := "...";
...

дописал:

...
f2.Show;
f2.edit1.text := "...";
...

и все заработало! Ну елы-палы! как это объяснить!


 
Anatoly Podgoretsky ©   (2007-09-29 12:13) [12]

> x.pro  (29.09.2007 11:33:04)  [4]

До использования, но как можно дальше.


 
x.pro   (2007-09-29 12:14) [13]

Что ж все спасибо за участие!

Ув. админы, закрывайте ветку!


 
x.pro   (2007-09-29 12:16) [14]


> Anatoly Podgoretsky ©   (29.09.07 12:13) [12]


Минутку!!!!!!! что значит

> До использования,

и

> как можно дальше.

?


 
Anatoly Podgoretsky ©   (2007-09-29 12:22) [15]


> Все три формы в настройках проекта - Auto-Create. Код создания
> форм:
>
> procedure BtnClick...
> var
> f: Tf2;
> begin
> f := Tf2.Create(self);

Из Auto-Create надо убрать, а из модуля убрать переменную типа Tf2 и сделать это немедленно, пока не много дел натворил.


 
Anatoly Podgoretsky ©   (2007-09-29 12:25) [16]


> x.pro   (29.09.07 12:16) [14]

Это значит, что если можно поместить в implementation, то туда в остальных случаях в interface/

implementation как раз дальше находится.

ЗЫ: а почему тему здесь разместил, а не в Начинающих, как наиболее подходящее место?


 
x.pro   (2007-09-29 12:30) [17]

спасибо, сейчас попробую...

> ЗЫ: а почему тему здесь разместил, а не в Начинающих, как
> наиболее подходящее место?


мне показалось что в выходной день здесь быстрее заметят.


 
x.pro   (2007-09-29 12:34) [18]

Такс. Значит, из auto-create убрал, теперь когдана 3й форме нажимаю на кнопку (данные должны передаться в form2.edit1) возникает av.


 
Anatoly Podgoretsky ©   (2007-09-29 12:36) [19]

> x.pro  (29.09.2007 12:30:17)  [17]

Заметят быстрее, но и пошутят злее.


 
Anatoly Podgoretsky ©   (2007-09-29 12:37) [20]

> x.pro  (29.09.2007 12:34:18)  [18]

Ошибка в 17 строке.
и наверно не прислушал к совету насчет убрать переменную формы из var в модуле формы.


 
x.pro   (2007-09-29 12:40) [21]


> Anatoly Podgoretsky ©   (29.09.07 12:36) [19]

Ну, на каждую шутку есть своя прибаутка. ;)


> Ошибка в 17 строке.

:)) погодите. какая 17 строка? откуда 17 строка? в том листинге что я привел всего 9.


 
Anatoly Podgoretsky ©   (2007-09-29 12:42) [22]

> x.pro  (29.09.2007 12:40:21)  [21]

А ты поищи, может найдешь.


 
x.pro   (2007-09-29 12:44) [23]

но если убрать из auto-create и переписать код как:

procedure TForm1.Button1Click(Sender: TObject);
begin
   Form2.Create(Application);
   Form2.Show;
   Form2.label1.caption := "From form1: hello";
end;

то как же так получится?

вот весь код:

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Form2.Create(Application);
   Form2.Show;
   Form2.label1.caption := "From form1: hello";
end;
----------------------------------------------------------------
interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Unit3;
...
implementation

uses Unit1;
....
procedure TForm2.Button1Click(Sender: TObject);
begin
   Form3.Create(Application);
   Form3.Show;
   Form3.Label1.Caption := "From form2: Hello, World!";
end;
----------------------------------------------------------------
implementation

uses Unit2;

procedure TForm3.Button1Click(Sender: TObject);
begin
Form2.Edit1.Text := "From form3"+Edit1.Text;
close;
end;


 
x.pro   (2007-09-29 12:46) [24]

но этот код заведомо не верен за счет строк типа

Form3.Create(Application);


 
Anatoly Podgoretsky ©   (2007-09-29 12:47) [25]

Переменные Form2/3 не описаны локально.
У классов отсутствую поля или свойства для передачи значений.
А все потому, что ты изначально стал работать с AutoCreate и глобальными переменными форм.
Сейчас надо менять подход.
Да и такая сильная завязка между формами еще много где проявится в виде ошибок.


 
Anatoly Podgoretsky ©   (2007-09-29 12:48) [26]


> но этот код заведомо не верен за счет строк типа

Именно. Не должно быть ссылок на другие формы. Это путь в никуда.


 
Anatoly Podgoretsky ©   (2007-09-29 12:53) [27]

Там у тебя еще много ошибок в процедурах
Должно быть примерно так.

procedure TForm2.Button1Click(Sender: TObject);
begin
   with TForm3.Create(Self);
     Label1.Caption := "From form2: Hello, World!";
     Show;
 end;
end;


или с ненужной локальной переменно

procedure TForm2.Button1Click(Sender: TObject);
var
 Form3: TForm3;
begin
  Form3.Create(Application);
  Form3.Show;
  Form3.Label1.Caption := "From form2: Hello, World!";
end;


 
x.pro   (2007-09-29 12:53) [28]


> Не должно быть ссылок на другие формы. Это путь в никуда.


подскажите, пожалуйста, в какую сторону нужно поменять подход? как обращаться к объектам на форамах? нужно что бы формы 2 и 3 создавались вместе с 1? но это и есть auto-create...


 
x.pro   (2007-09-29 12:55) [29]

апрвильно. у меня все так изначально и было написано. а теперь попробуйте по нажатию на кнопке на форме 3 передать данные, ну хотя бы в Edit., на форме 2.


 
Anatoly Podgoretsky ©   (2007-09-29 12:55) [30]

Ошибся при копировании

begin
  Form3.Create(Application);
  Form3.Label1.Caption := "From form2: Hello, World!";
  Form3.Show;
end;


 
x.pro   (2007-09-29 12:58) [31]


begin
Form3.Create(Application);
Form3.Label1.Caption:= "From form2: Hello, World!";
Form3.Show;
end;


а вот тут и ошибка!


 
Anatoly Podgoretsky ©   (2007-09-29 12:59) [32]

> x.pro  (29.09.2007 12:55:29)  [29]

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


 
boa_kaa ©   (2007-09-29 13:02) [33]


> Anatoly Podgoretsky ©   (29.09.07 12:55) [30]
> Form3.Create(Application);

Анатолий, а Вы намеренно или специально вводите человека в заблуждение? :)


 
x.pro   (2007-09-29 13:05) [34]

нет, нет, я имею ввиду состояние кода, до того, как полез на форум.

> Anatoly Podgoretsky ©   (29.09.07 12:59) [32]

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


 
Anatoly Podgoretsky ©   (2007-09-29 13:07) [35]

> boa_kaa  (29.09.2007 13:02:33)  [33]

Случайно, скопировал его код, а мой без переменной чуть выше, там все правильно.
Ладно еще раз исправлю, набив с руки, а не копируя, я его привел как не нужную альтернативу и отнесся безответсвенно :-(
Это правильный вариант с ненужной переменной.


begin
 Form3 := TForm3.Create(Application);
 Form3.Label1.Caption := "From form2: Hello, World!";
 Form3.Show;
end;


 
boa_kaa ©   (2007-09-29 13:07) [36]


> что за заявки на формы

не заявки, а завязки

procedure TForm2.Button1Click(Sender: TObject);
var
Form3: TForm3;
begin
 Form3 := TForm3.Create(Application);
 Form3.Label1.Caption := "From form2: Hello, World!";
 Form3.Show;
end;


 
Anatoly Podgoretsky ©   (2007-09-29 13:09) [37]

> x.pro  (29.09.2007 13:05:34)  [34]

Завязка появится, когда вздумаешь из Form3 обратиться к Form2


 
x.pro   (2007-09-29 13:09) [38]

Правильно. Все формы созданы. теперь мне нужно перенести данные из edit на форме 3 в edit на форме 2. и все. но не переносит. но почему?! ведь все создано!


 
x.pro   (2007-09-29 13:11) [39]

unit Unit3;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm3 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
   Label1: TLabel;
   procedure Button1Click(Sender: TObject);
 private
 public
 end;
var
 Form3: TForm3;
implementation
uses Unit2;

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin
With form2.Edit1 do
   text := Edit1.Text;
close;
end;
end.

и ничего не фурычит! заявка была


 
boa_kaa ©   (2007-09-29 13:13) [40]


> x.pro   (29.09.07 13:09) [38]

если не добавлять перекрестные ссылки на юниты, то нужно делать это через какое-нибудь событие, например, при нажатии на кнопку или ловить закрытие (или изменение) на form3


 
Anatoly Podgoretsky ©   (2007-09-29 13:16) [41]

> x.pro  (29.09.2007 13:09:38)  [38]

Я так и не понял, насчет глобальных переменных формы и что куда переносится.
Говорю же могила.


 
x.pro   (2007-09-29 13:20) [42]

нет никаких глобальных переменных.

нужно просто перенести текст из edit на форме3 в edit на форме 2. а форма 3 содается когда нажимается кнопка на форме 2. и все.


 
boa_kaa ©   (2007-09-29 13:29) [43]

Специально сотворил то, о чем речь. Переносится, однако. Правда у меня только Form1 и Form2.

Unit1:

var
 Form1: TForm1;

implementation

{$R *.dfm}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
var
 Form2: TForm2;
begin
 Form2 := TForm2.Create(Application);
 Form2.Edit1.Text := Edit1.Text;
 Form2.Show;
end;


Unit2:

var
 Form2: TForm2;

implementation

{$R *.dfm}

uses Unit1;

procedure TForm2.Button1Click(Sender: TObject);
begin
 Form1.Edit1.Text := Edit1.Text;
 Close;
end;


 
boa_kaa ©   (2007-09-29 13:30) [44]

Да! из Unit2 можно убрать
var
Form2: TForm2;
они там случайно завалялись


 
Anatoly Podgoretsky ©   (2007-09-29 13:32) [45]

> boa_kaa  (29.09.2007 13:29:43)  [43]

А вот и завязка

Form1.Edit1.Text := Edit1.Text;


 
boa_kaa ©   (2007-09-29 13:34) [46]


> Anatoly Podgoretsky ©   (29.09.07 13:32) [45]

угу. Потому я и говорю:
> boa_kaa ©   (29.09.07 13:13) [40]


 
x.pro   (2007-09-29 13:37) [47]


> boa_kaa ©   (29.09.07 13:29) [43]

и у меня это работает! отлично работает. но вот если еще одну форму сделать, то ничего не получится! добавить еще одну форму и вызывайте ее при созданой 2й


 
x.pro   (2007-09-29 13:38) [48]

перекрестная ссылка это указатель что ли?


 
x.pro   (2007-09-29 13:42) [49]

все верное, уважаемые! но если создать еще одну форму и создавать ее только таким де путем но из формы 2, то из 3 в 2 ничего не передается!


 
x.pro   (2007-09-29 13:45) [50]

но что самое поразительное из 3 в 1 передает!!!!!!!!!!! а из 3 в 2 - нет!


 
engine ©   (2007-09-29 13:47) [51]

Ты в 17-й строке ошибку исправил?


 
boa_kaa ©   (2007-09-29 13:50) [52]

Естественно! Потому я и говорю:
> boa_kaa ©   (29.09.07 13:30) [44]

Та форма, которую ты создаешь из Form1 - это не та, которую ты используешь из Form3. Из Form3 ты используешь именно глобально описанную в Unit2 Form2. Если ты уберешь глобально описание и приведешь код в токое согласие

type
 TForm2 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

//здесь был Form2

implementation


то ты получишь именно то, о чем говорил Анатолий, т.е. ж...


 
x.pro   (2007-09-29 13:51) [53]


> engine ©   (29.09.07 13:47) [51]

что это за строка 17?! где она?!

здесь:

procedure BtnClick...
var
f: Tf2;
begin
f := Tf2.Create(self);
f.Show;
f.Label1.Caption := "...";
...
end;

их всего 9!


 
boa_kaa ©   (2007-09-29 13:51) [54]


> x.pro   (29.09.07 13:45) [50]
> но что самое поразительное из 3 в 1 передает!!!!!!!!!!!
> а из 3 в 2 - нет!

Это не поразительно, а вполне объяснимо, т.к. Form1 объявлен глобально!


 
x.pro   (2007-09-29 13:51) [55]


> engine ©   (29.09.07 13:47) [51]

что это за строка 17?! где она?!

здесь:

procedure BtnClick...
var
f: Tf2;
begin
f := Tf2.Create(self);
f.Show;
f.Label1.Caption := "...";
...
end;

их всего 9!


 
boa_kaa ©   (2007-09-29 13:52) [56]


> x.pro   (29.09.07 13:51) [55]

Отстань ты с 17 строкой. Это обычный подкол, когда не приводят код и говорят, что он не работает


 
boa_kaa ©   (2007-09-29 13:55) [57]

Короче! Если в 2х словах, то ты путаешь КЛАССЫ с ОБЪЕКТАМИ


 
x.pro   (2007-09-29 13:58) [58]


> boa_kaa ©   (29.09.07 13:50) [52]

Хорошо, если я напишу так как вы говорите, то как обратиться к form2 из form3?

ее нужно локально объявить? тогда - Av


 
x.pro   (2007-09-29 14:06) [59]

все проблему решил так. в Private формы 1 написал переменную типа Tform2, когда создавай 2ю форму писла такой код:

frm2 := tForm2.Create(Application);
frm2.label1.caption := "From form1: hello";
frm2.Show;
-------------------------------------------
а из 3й формы обращался так:
Form1.Frm2.Edit1.text := "Form form 3";
-------------------------------------------

в Одессу через китай... но может так и надо было?


 
Anatoly Podgoretsky ©   (2007-09-29 14:09) [60]

> x.pro  (29.09.2007 14:06:59)  [59]

Ни одна вызымаемая форма не должна ничего знать про вызывающею.


 
boa_kaa ©   (2007-09-29 14:09) [61]

сейчас самым простым для тебя будет:
1) Перенести все 3 формы в автокриэйт
2) Привести код в состояние, приведенное ниже
3) Разобраться с тем, что такое класс, а что такое его экземпляр.
4) Научиться использовать объекты там, где их создаешь.

Состояние кода.

Unit1
var
 Form1: TForm1;

implementation

{$R *.dfm}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Form2.Edit1.Text := Edit1.Text;
 Form2.Show;
end;


Unit2:
var
 Form2: TForm2;

implementation

{$R *.dfm}

uses Unit1, Unit3;

procedure TForm2.Button1Click(Sender: TObject);
begin
 Form1.Edit1.Text := Edit1.Text;
 Form3.Edit1.Text := Edit1.Text;
 Form3.Show;
end;


Unit3:
var
 Form3: TForm3;

implementation

{$R *.dfm}
uses Unit2, Unit1;

procedure TForm3.Button1Click(Sender: TObject);
begin
 Form1.Edit1.Text := Edit1.Text;
 Form2.Edit1.Text := Edit1.Text;
end;


 
{RASkov} ©   (2007-09-29 14:11) [62]

> [58] x.pro   (29.09.07 13:58)
> то как обратиться к form2 из form3?

Если у тебя показ форм идет как Show, то имхо, лучше вернуть все как было, т.е. переменные форм и в AutoCreate их тоже вернуть
Только не нужно по нажатию кнопок ничего заного создавать....
Или как вариант перед обращением к конкретной форме, проверить есть ли она - Assigned(), но и не забывать нилить ее после удаления...
С ShowModal такого не должно быть.....

ЗЫ: А вернуть все наместо нужно(желательно) и еще по одной причине См [57] Пока не научишься их отличать...


 
x.pro   (2007-09-29 15:43) [63]

Всем большое спасибо! Я для себя сделал урок. Спасибо!


 
имя   (2007-10-07 22:12) [64]

Удалено модератором


 
имя   (2007-10-07 22:26) [65]

Удалено модератором



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.178 c
2-1192805649
dreamse
2007-10-19 18:54
2007.11.11
Подскажите как скопировать в переменную последнии несколько


2-1192180654
Ega23
2007-10-12 13:17
2007.11.11
Как убить объект из его же метода?


2-1192969619
Lebedev
2007-10-21 16:26
2007.11.11
Caption RadioGroup должен переходить на новую строку.


15-1191846345
ASDE
2007-10-08 16:25
2007.11.11
Ярлык к программе под админа


4-1178292742
I-New
2007-05-04 19:32
2007.11.11
GDI+





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский