Текущий архив: 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