Текущий архив: 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.56 MB
Время: 0.034 c