Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.30;
Скачать: CL | DM;

Вниз

Свойства формы   Найти похожие ветки 

 
Sedunov Vitaly   (2002-09-18 11:39) [0]

Добрый день! У меня следующая проблема. Вызываемая форма(Форма1) может вызываться из разных форм(Форма2,Форма3,Форма4). В зависимости от того, из какой формы вызывалась Форма1, нужно вернуть параметры в Форма2 или Форма3 или Форма4. В Форма1 я передаю имя формы, откуда была вызвана форма, т.е. "Form2" или "Form3" или "Form4". Почему-то не работает следующая конструкция: TForm2(FindComponent("Form2")).retparam:=..., то же самое и TForm(FindComponent("Form2")).retparam:=... Но срабатывает Form2.retparam:=... Меня это не устраивает, т.к. экземпляров формы Форма2(Form2) может быть много. Простите за долгое объяснение. Буду рад вашей помощи.

С уважением.


 
qube ©   (2002-09-18 11:46) [1]



Если экземпляров формы может быть много, то никакой поиск по имени не поможет. Эту форму надо убрать из auto-create, создавать динамически, и тогда все заработает.


 
AlexT1000   (2002-09-18 11:49) [2]

а зачем ты передаешь имя формы ? передавай просто форму.

procedure PutForm( Sender : TForm);
begin
Sender.FindComponent(..........
end;


PutForm(TForm(Form2));
PutForm(TForm(Form3));



 
AlexT1000   (2002-09-18 11:50) [3]

procedure PutForm(Var Sender : TForm);

так вроде точнее


 
Sedunov Vitaly   (2002-09-18 11:57) [4]

Все формы создаются динамически. AutoCreate тут ни при чем. Сейчас попробую передавать форму. Спасибо!


 
Старый Паскалист   (2002-09-18 12:10) [5]

Можно сделать так:

function TForm1.Execute(Caller: TForm; var retparam: TSomeType; {...}): Boolean;
begin
// Инициализация
Result := (ShowModal = mrOk);
if Result then
begin
// Ознакомление заинтересованных лиц с результатами

// Неудобно работать с формами, не имеющими общего предка, напрямую
// if Caller is TForm2 then (Caller as TForm2).retparam := ???;
// else if Caller is TForm3 then (Caller as TForm3).retparam := ???;

retparam := Что-нибудь;


// Есть и другие способы уведомления:
// Можно, напр, объявить пользовательское сообщение
// SendMessage(Caller.Handle, WM_MYRESULT, retparam, 0);
// - Это вариант для асинхронного режима, когда форма показыаается немодально

// Или просто сделать св-во Form1.SomeWorkResult: TSomeType;
// А вызывающие формы уже сами будут его читать при необходимости

// Можно через RTTI - но слишком увлекаться RTTI тоже не стоит
end;
end;

...

procedure TForm2.CallForm1;
begin
with TForm1.Create(nil) do
begin
try
if Execute(Self, retparam) then ...;
finally
Free;
end;
end;
end;


 
qube ©   (2002-09-18 12:31) [6]

Что-то вы замутили сверхсложное. А функцией нельзя возвращать значение, что ли?


 
Старый Паскалист   (2002-09-18 12:54) [7]

2qube ©

Да какие проблемы. Можно и результатом ф-и.
Всё можно сделать десятью тысячами различных способов,
и я постарался перечислил лишь некоторые варианты.

(возвращение через var мало отличается от результата ф-и,
а в качестве результата ф-и для модального случая
я привык возвращать подтверждение/отказ).



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

Текущий архив: 2002.09.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
1-98031
LEV
2002-09-18 21:56
2002.09.30
ВОПРОС


3-97985
Explorer
2002-09-10 06:59
2002.09.30
Select


1-98117
RV
2002-09-17 10:05
2002.09.30
Где у меня происходит утечка памяти? (менеджер задач так


8-98240
RealDummy
2002-05-30 02:27
2002.09.30
Как среди множества точек найти похожую на образ фигуру?


1-98027
Alex17
2002-09-17 13:07
2002.09.30
Вопрос по FIBPlus.