Главная страница
    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.6 MB
Время: 0.041 c
4-1082300345
Privet10
2004-04-18 18:59
2004.05.30
Как управлять PGP


14-1084524523
yzy
2004-05-14 12:48
2004.05.30
Как скрыть вводимые данные в консольном приложении?


7-1082550689
химик
2004-04-21 16:31
2004.05.30
Как программно добавить язык (раскладку) в системе?


6-1081170420
Raptoridze
2004-04-05 17:07
2004.05.30
md5 хеш или хз


14-1083921184
fag2000
2004-05-07 13:13
2004.05.30
Как дождаться завершения выполнения команды?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский