Форум: "Прочее";
Текущий архив: 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) Научиться использовать объекты там, где их создаешь.
Состояние кода.
Unit1var
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.045 c