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

Вниз

MDI   Найти похожие ветки 

 
Zlod3y ©   (2004-05-14 23:45) [0]

Доброго времени суток!
Люди! Помогите! Тону :)
Исходные данные:
Form1 - MDIForm
Form2 - MDIChild
При нажатии на пункт меню, который запускает Form2, нужно проверять, запущена ли эта форма уже иль нет, пробовал проверять, но какая-то лажа выходит. Мож кто даст кусок кода, предназначенный для такой проверки. Желтельно описанный с моими формами (Form1 и Form2).
Заранее спасибо!


 
Goida ©   (2004-05-15 00:01) [1]

А как ты проверяешь? Неужели переменную? Проверяй своство MDIChildren основной формы. Подробнее посмотри в хелпе.


 
Zlod3y ©   (2004-05-15 23:02) [2]

не хочу показаться наглым, но мне бы хотелось получить более развёрнутый ответ


 
Goida ©   (2004-05-17 12:46) [3]

Развернутей не буду:
if fmMain.MDIChildCount = 0
then
 // создание окна MDIChild


 
Silver Alex ©   (2004-05-17 12:50) [4]

function IsFormFoundEx(AFormClass :TFormClass) : boolean;
var
 i:integer;
begin
 Result:=False;

 for i:=0 to Screen.FormCount - 1 do
 if (Screen.Forms[i] is AFormClass) then begin
   (Screen.Forms[i] as TForm).BringToFront;
   Result:=True;
   break;
 end;

 if not Result then
   AFormClass.Create(Application);
end;

ну и вызывать просто IsFormFoundEx(Form1) , а на OnClose формы естественно Action:=caFree;


 
Silver Alex ©   (2004-05-17 12:56) [5]

ой, вызывать нужно IsFormFoundEx(TForm1)


 
NAlexey ©   (2004-05-17 13:06) [6]

>А как ты проверяешь? Неужели переменную?
Не понял, а что надо проверять?

var
 Form1: TForm1;

procedure Foo;
begin
 Application.CreateForm(TForm1, Form1);
 Show;
end;

procedure TForm1.FormClose(Sender: TObject;
 var Action: TCloseAction);
begin
 Action := caFree;
end;

procedure Go;
begin
 if Form1 = nil then //Форма Form1 не создана.
   Foo;  
end;

Или по другому?


 
Silver Alex ©   (2004-05-17 13:33) [7]


> NAlexey ©   (17.05.04 13:06) [6]

ну ты хоть сам то проверял чего написал? и как это работает?


 
NAlexey ©   (2004-05-17 13:47) [8]

>ну ты хоть сам то проверял чего написал? и как это работает?
Я проверял, работает это хорошо. А в чем дело? Тебя волнуют синтаксические ошибки допущенные в коде?


 
Mim1 ©   (2004-05-17 13:51) [9]

Даю намек.

> if Form1 = nil then //Форма Form1 не создана.

А если переменная Form1 не nil а формы нет?


 
Silver Alex ©   (2004-05-17 13:52) [10]


> Я проверял, работает это хорошо.

хе-хе, а попробуй так создать форму потом закрыть, и повторить создать-закрыть.А потом честно напиши нам сколько раз получилось ее создать-закрыть


 
NAlexey ©   (2004-05-17 13:57) [11]

>Mim1 ©   (17.05.04 13:51) [9]
>Silver Alex ©   (17.05.04 13:52) [10]
Вообще считаю что додумать недостающее оч. легко. Хорошо, специально для вас разжую:

unit Unit1;

interface

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

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

var
 Form1: TForm1;

implementation

uses
 Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 if Form2 = nil then
   Foo;
end;

end.

Child:

unit Unit2;

interface

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

type
 TForm2 = class(TForm)
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 procedure Foo;

var
 Form2: TForm2;

implementation

{$R *.dfm}

procedure Foo;
begin
 Application.CreateForm(TForm2, Form2);
 Form2.Show;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
 if Form2 <> nil then
   Form2 := nil;
end;

end.

Вообще я вопрос задавал : Goida ©   (15.05.04 00:01) [1]. Но он мне не ответил. Ждемс.


 
WebErr ©   (2004-05-17 13:58) [12]


> procedure TForm1.FormClose(Sender: TObject;
>  var Action: TCloseAction);
> begin
>   Action := caFree;
// Вот здесь поставь:
   SomeChildForm := nil; // SomeChildForm -это MDIChild Form
// и всё будет чики-пуки, пока у тебя не более одной формы
// класса TSomeChildForm
> end;


 
Goida ©   (2004-05-17 14:08) [13]


> Вообще я вопрос задавал : Goida ©   (15.05.04 00:01) [1].
> Но он мне не ответил. Ждемс.

Я ответил в рамках поставленной задачи

> Goida ©   (17.05.04 12:46) [3]


 
Silver Alex ©   (2004-05-17 14:13) [14]


> NAlexey ©   (17.05.04 13:57) [11]

Послушай, старина, ты переобуваешься прямо в воздухе.Твой первый пост таки отличается от второго, но и второй, как ни досадно тебе услышать,тоже не верный.Не веришь мне спроси у кого угодно из спецов.А насчет разжевать, я сам кому хочешь разжую :)


 
NAlexey ©   (2004-05-17 14:15) [15]

>Я ответил в рамках поставленной задачи
Насколько я понимаю ответ вот это:
 
 if fmMain.MDIChildCount = 0
 then
  // создание окна MDIChild

Ну тогда я лично считаю что это неправильно. Как например можно с помощью этого узнать, создана ли Form1, или создана ли Form2?
MDIChildCount - показывает количество форм, но никак не показывает какие именно формы.


 
NAlexey ©   (2004-05-17 14:21) [16]

>Твой первый пост таки отличается от второго
Естественно, каждый пост уникален если я не повторяю его слово в слово. Твои посты тоже все разные. Однако что ты этим хочешь сказать? Автору вопроса я не отвечал, я задавал свой вопрос. А вот кстати твой ответ никак не отвечает автору вопроса. На мой взгляд ты вообще думал о чем то о своем когда писал ответ. Не так ли?

>второй, как ни досадно тебе услышать,тоже не верный.
Не досадно мне это услышать. Если есть ошибка поправь ты, или ты не спец?


 
NAlexey ©   (2004-05-17 14:21) [17]

>Твой первый пост таки отличается от второго
Естественно, каждый пост уникален если я не повторяю его слово в слово. Твои посты тоже все разные. Однако что ты этим хочешь сказать? Автору вопроса я не отвечал, я задавал свой вопрос. А вот кстати твой ответ никак не отвечает автору вопроса. На мой взгляд ты вообще думал о чем то о своем когда писал ответ. Не так ли?

>второй, как ни досадно тебе услышать,тоже не верный.
Не досадно мне это услышать. Если есть ошибка поправь ты, или ты не спец?


 
WebErr ©   (2004-05-17 14:23) [18]

Вообще-то можно и так:

function NeedsFormCreated: Boolean;
begin
Result := false;
for i := 0 to MainForm.MDIChildCount-1 do
  if (MainForm.MDIChildren[i] is TNeedsForm) then
  begin
    Result := true;
    Exit;
  end;
end;

Что-то подобное как-то предлагал Digitman (c).


 
WebErr ©   (2004-05-17 14:26) [19]


> WebErr ©   (17.05.04 14:23) [18]

И конечно в функции:

var
  i: Integer;


 
NAlexey ©   (2004-05-17 14:31) [20]

>WebErr ©   (17.05.04 14:23) [18]
И ты тудаже. А если будет создано 2 формы этого класса?

var
 Form1: TMyForm;
 Form2: TMyForm;
begin
 Application.CreateForm(TMyForm, Form2);  
 {
   Создана ли у меня Form1?
 }
end;

Автор пишет:
>Исходные данные:
>Form1 - MDIForm
>Form2 - MDIChild
>При нажатии на пункт меню, который запускает Form2, нужно проверять, запущена ли эта форма уже иль нет

?


 
Goida ©   (2004-05-17 14:31) [21]


> Исходные данные:
> Form1 - MDIForm
> Form2 - MDIChild

Для MDIForm ты никак не можешь создать еще одну MDIForm. Или я тебя не понимаю...


 
NAlexey ©   (2004-05-17 14:31) [22]

>WebErr ©   (17.05.04 14:23) [18]
И ты тудаже. А если будет создано 2 формы этого класса?

var
 Form1: TMyForm;
 Form2: TMyForm;
begin
 Application.CreateForm(TMyForm, Form2);  
 {
   Создана ли у меня Form1?
 }
end;

Автор пишет:
>Исходные данные:
>Form1 - MDIForm
>Form2 - MDIChild
>При нажатии на пункт меню, который запускает Form2, нужно проверять, запущена ли эта форма уже иль нет

?


 
NAlexey ©   (2004-05-17 14:34) [23]

>Goida ©   (17.05.04 14:31) [21]
Да я то что... Главное чтобы ты автора вопроса понимал.


 
Кщд ©   (2004-05-17 14:35) [24]

фактически WebErr ©   (17.05.04 14:23) [18]
но для случая, когда классов дочерних форм, обязанных быть уникальными в пределах проекта, - несколько

function TfrmMain.FindDouble(Sender: TClass): boolean;
var
i: integer;
begin
Result:=false;
for i:=0 to MDIChildCount-1 do
 if MDIChildren[i].ClassType=Sender then
 begin
  Result:=true;
  break;
 end;
end;

end;


 
Goida ©   (2004-05-17 14:36) [25]


> NAlexey

MDIChild - только одна.
Но если вообще говорить о запуске одно экземпляра класса, то этого можно добиться с помощью синглтонов, мютексов и пр. Сам никогда этого не делал, только слышал, что можно.
Ну или, в конце-концов, создать метод, который будет возвращать информацию о классе. И на основе этого класса с этим методом сделать уже формы...


 
Кщд ©   (2004-05-17 14:38) [26]

>NAlexey ©   (17.05.04 14:31) [22]
> Application.CreateForm(TMyForm, Form2);  

а вот это, имхо, неграмотный подход к работе с MDI.


 
Silver Alex ©   (2004-05-17 14:42) [27]


> NAlexey

Ну ты матерый я погляжу.Но согласись что просто
Action := caFree;  
и
Action := caFree;
if Form2 <> nil then
  Form2 := nil;

очень сильно отличаются.Ты быстро нашел свою багу, молодец.А вот функция как раз работает, и работает правильно.Мне кажется ты просто не догнал что она делает.Но могу специально для тебя разжевать.Она как раз вызывает нужную тебе MDI- форму ровно один раз, а если она уже создана выводит ее на передний план.Заметь что не надо больше никаких условий и не надо нигде ничего обнулять.
Реально пишешь меньше кода, в данном случае на три строчки, но когда у тебя в проекте под сотню только  MDI-форм, посчитай сколько ты сэкономишь.А сколько у тебя есть функций которые сокращают написание кода на строчку или больше.

а на звание спеца не претендую из-за врожденной скромности :)


 
NAlexey ©   (2004-05-17 14:42) [28]

>Goida ©   (17.05.04 14:36) [25]
>MDIChild - только одна.
Мда...
Для описаного выше мной примера:

unit Unit2;

interface

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

type
 TForm2 = class(TForm)
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

procedure Foo;
//var
//  Form2: TForm2;

implementation

{$R *.dfm}

procedure Foo;
var
 I: Integer;
 Form: TForm2;
begin
 for I := 0 to 10 do
 begin
   Application.CreateForm(TForm2, Form);
   Form.Show;
 end;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
end;


 
NAlexey ©   (2004-05-17 14:45) [29]

Кщд ©   (17.05.04 14:38) [26]
>а вот это, имхо, неграмотный подход к работе с MDI.
А какой подход к работе с MDI правильный?


 
Goida ©   (2004-05-17 14:49) [30]

Влоб напрашивается такое решение.
Мы создаем глобальную переменную-счетчик для каждого вида окно. При создании окна, мы увеличиваем этот счетчик на единицу. А перед этим можно проверять этот счетчик...


 
NAlexey ©   (2004-05-17 15:03) [31]

>Silver Alex ©   (17.05.04 14:42) [27]
Я не старался написать рабочий код, я просто хотел уточнить у отвечающего что он имел в виду, и что он ответит на мои доводы. Я не предполагал что мой код будут выдирать и проверять на работоспособность, хотел донести просто идею, подход.
Что касается ф-ции, не спорю, что синтаксически она правильная и выполняет свою задачу, но автору нужно было не то. Заметь, автор не спрашивал как узнать запущен ли хоть один экземпляр формы TForm2. А твоя ф-ция выяснит как раз это. Если будет запущено 2 экземпляра, она ошибется.


 
Кщд ©   (2004-05-17 15:04) [32]

NAlexey ©   (17.05.04 14:45) [29]
в методе MDI Form: TForm.Create(self);
и освобождать: Action:=caFree;
ещё раз подчеркну - имхо.

что касается Вашего примера - про Assigned слышали?


 
Кщд ©   (2004-05-17 15:04) [33]

NAlexey ©   (17.05.04 14:45) [29]
в методе MDI Form: TChildForm.Create(self);
и освобождать: Action:=caFree;
ещё раз подчеркну - имхо.

что касается Вашего примера - про Assigned слышали?


 
NAlexey ©   (2004-05-17 15:09) [34]

>Кщд ©   (17.05.04 15:04) [32]
>Assigned слышали?
Нет, а что это?


 
Silver Alex ©   (2004-05-17 15:12) [35]


>NAlexey
> Я не старался написать рабочий код

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


 
WebErr ©   (2004-05-17 15:23) [36]

ЗДЕСЬ ХОТЬ КТО-НИБУДЬ ПОНИМАЕТ, ЧТО ВООБЩЕ ПИШЕТ?! :(


 
Goida ©   (2004-05-17 15:27) [37]


> WebErr

Ты понимаешь :))


 
NAlexey ©   (2004-05-17 15:31) [38]

>WebErr ©   (17.05.04 15:23) [36]
Я понимаю. Я в здравом уме и светлой памяти.

>Silver Alex ©   (17.05.04 15:12) [35]
>Я так понимаю для того что бы не создать ее еще раз.
Возможно, а возможно и нет. Предположим у автора 2 формы класса TForm2, это Form2 и Form3. В Form2 он делает одни действия, а в Form3 другие. Открыл по разу эти формы. Теперь хочет узнать, открыта ли Form2? Как будет работать твоя ф-ция в этом случае?


 
Silver Alex ©   (2004-05-17 15:37) [39]


> NAlexey ©   (17.05.04 15:31) [38]

надоело мне с тобой спорить :)Какие-то версии у тебя, предположения.А если то , а если это.Если бы у моей бабушки была бы эта штука, то тогда она была бы дедушкой.Ты зри в корень :)


 
Goida ©   (2004-05-17 15:41) [40]

Эй, ребята, мою версию обсудите. Мне тут подумалось, что мне это тоже нужно.

> Goida ©   (17.05.04 14:49) [30]
> Влоб напрашивается такое решение.
> Мы создаем глобальную переменную-счетчик для каждого вида
> окно. При создании окна, мы увеличиваем этот счетчик на
> единицу. А перед этим можно проверять этот счетчик...



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

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

Наверх




Память: 0.58 MB
Время: 0.093 c
14-1083767914
}|{yk
2004-05-05 18:38
2004.05.30
Сколько лет еще просуществуют:


3-1084362064
SergeyM
2004-05-12 15:41
2004.05.30
ADOConnection.


6-1081410897
Aleksandr
2004-04-08 11:54
2004.05.30
Кто решал проблему разницы во времени между двумя компьютерами?


6-1081802587
Spirit Monster
2004-04-13 00:43
2004.05.30
cookies


6-1081425876
Сережа550
2004-04-08 16:04
2004.05.30
Flash