Главная страница
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]
> Влоб напрашивается такое решение.
> Мы создаем глобальную переменную-счетчик для каждого вида
> окно. При создании окна, мы увеличиваем этот счетчик на
> единицу. А перед этим можно проверять этот счетчик...


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

>Silver Alex ©   (17.05.04 15:37) [39]
He-he. Так я и зрю в корень. Если открыть 2 экземпляра класса TForm2 - Form2 и Form3, потом закрыть Form2, с помощью твоей ф-ции не узнаешь, запущена она или нет, т.к она(ф-ция) всегда будет зачемто выдвигать на передний план Form3(да и кстати, а если мне не надо выдвигать на передний план никакие формы, а просто проверить?). А с помощью моего подхода узнаешь...
Ну как? В корень?:)


 
WebErr ©   (2004-05-17 15:53) [42]


> NAlexey ©   (17.05.04 14:31) [22]

Моя функция выдаст true.


 
NAlexey ©   (2004-05-17 16:02) [43]

>WebErr ©   (17.05.04 15:53) [42]
Ну так а что она по твоему должна выдавать?

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

Тебя наверное ввело в заблуждение несоответсвие между названием ф-ции, и выполняемыми ей действиями. Твоя ф-ция вернет "Истина" если уже есть экземпляр. А ф-ция называется "НадоСоздатьФорму". Т.е учитывать название твоей ф-ции вообще выходит, что если есть экземпляр, то надо еще. Такчто если создать Form2 и Form3 потом закрыть Form2 она всеравно будет считать что Form2 есть. Такчто твой клич про вообще понимает ли кто нибудь что нибудь справедлив.:)


 
WebErr ©   (2004-05-17 16:11) [44]

Нет она называется Created - "Создана ли" NeedsForm: TNeedsForm у автора это: Form2: ?;


 
WebErr ©   (2004-05-17 16:17) [45]

Смысл её таков: если создан хотя бы один экземпляр этого типа, то она вернёт значение истина, а вот если вы хотите узнать сколько их таких, то нужно переделать функцию в

function NeedsFormCount: Integer;
var
  i: Integer;
begin
  Result := 0;
  for i := 0 to Form1.MDIChildCount-1 do
    if (Form1.MDIChildren[i] is TForm2) then
      Inc(Result);
end;

Все возгласы ни к чему. :))))


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

>WebErr ©   (17.05.04 16:11) [44]
>Нет она называется Created - "Создана ли" NeedsForm
Хм... Хорошо. Пусть будет так, согласен.

>у автора это: Form2: ?;
Да, у автора это Form2.


 
WebErr ©   (2004-05-17 16:23) [47]

Для "Переводчиков":
NeedsFormCount - количество нужных форм
NeedsFormIsCreated - так будет лучше для имени предыдущей функции.


 
NAlexey ©   (2004-05-17 16:23) [48]

>WebErr ©   (17.05.04 16:17) [45]
Я уже не знаю. Неужели это так непонятно? Автор спрашивал: как узнать АХТУНГ: запущена ли форма Form2? Не запущен ли экземпляр класса TForm2 или сколько экземпляров класса TForm2 запущено? Его интересовал конкретный экземпляр Form2:

var
 Form2, Form3: TForm2;
begin
Application.CreateForm(TForm2, Form3);
Form3.Show;
if NeedsFormCreated then
  ShowMessage("У меня запущена Form2");
if Form2 = nil then
  ShowMessage("А на самом деле Form2 не запущена");
end;

Я уж и не знаю как прощето...


 
WebErr ©   (2004-05-17 16:27) [49]


> Его интересовал конкретный экземпляр Form2

Tag = CONKRETNOE_ZNACHENIE; :))))
Всё я не могу - щас умру со смеху.... :)))))


 
NAlexey ©   (2004-05-17 16:27) [50]

>WebErr ©   (17.05.04 16:23) [47]
Если для переводчиков, то для Нужный(e) скорее всего надо было бы использовать Necessary. А Need говорит о необходимости сделать чтолибо. Такчто...


 
WebErr ©   (2004-05-17 16:29) [51]

Form2 по логике вещей должна быть ОДНА НА ВЕСЬ МОДУЛЬ!!! :))))


 
Silver Alex ©   (2004-05-17 16:49) [52]


> WebErr ©   (17.05.04 16:29) [51]

мне кажется NAlexey просто над нами смеется или издевается.Ну не может человек признать что был не прав.Он тут петляет как заяц по полю, сам наверное уже не помнит с чего начал


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

>Silver Alex ©   (17.05.04 16:49) [52]
Задорнова помнишь?



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

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

Наверх




Память: 0.62 MB
Время: 0.033 c
14-1084023239
SPeller
2004-05-08 17:33
2004.05.30
PE Viewer 1.1 (нужна помощь)


14-1084255098
ССЗБ
2004-05-11 09:58
2004.05.30
Заметил одну деталь - может, неправ?


3-1084277298
lovres
2004-05-11 16:08
2004.05.30
Касяк с DBCombobox. Подскажите, плз.


4-1082205614
вразлет
2004-04-17 16:40
2004.05.30
BIOS


14-1084447526
Tamagoci
2004-05-13 15:25
2004.05.30
Использование Thread при обновлении состояния Action ов