Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.031 c
1-1084819311
AndrewVolkov
2004-05-17 22:41
2004.05.30
Анимация нажатия кнопки


1-1084893344
Alek_1
2004-05-18 19:15
2004.05.30
Запись и считывания масива из файла


3-1084383853
SeregaC
2004-05-12 21:44
2004.05.30
Сохранение БД


6-1081950490
Yurec66
2004-04-14 17:48
2004.05.30
У кого в сети еще запущена моя программа


4-1081936017
human
2004-04-14 13:46
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский