Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.04.20;
Скачать: CL | DM;

Вниз

Возможно ли задать Application свою главную форму?   Найти похожие ветки 

 
Болезный человек   (2013-10-29 17:51) [0]

program Project1;

uses
 Forms;

{$R *.res}

type
 TMyForm = class(TForm)
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 myForm: TMyForm;

begin
 Application.Initialize;
 Application.MainFormOnTaskbar := True;
//  Application.CreateForm(TMyForm, myForm); // без ресурсов не создается
 myForm := TMyForm.CreateNew(nil); // создается. но не является главной формой
 Application.Run;
end.


 
брат Птибурдукова   (2013-10-29 18:06) [1]

просмотр исходников Forms.pas неизвращённых способов не указал. Через absolute можно и запихнуть, конечно…


 
Kerk ©   (2013-10-29 18:11) [2]

Возможно, найдутся другие варианты решения проблемы, если ты ее опишешь.


 
Юрий Зотов ©   (2013-10-29 18:29) [3]

Есть полухакерский способ. Основан на том, что свойство MainForm имеет прямой доступ к полю (по крайней мере, в D1-D7, а как сейчас - надо проверять). Суть в следующем:

var
 P: pointer;

P := @Application.MainForm; // Получаем адрес поля.
P^ := Моя_Форма; // Переназначаем главную форму.


 
jumping jack   (2013-10-30 09:08) [4]

второй полухакерский способ:

type
 TMyApplication = class(TComponent) // скопировано из Forms.pas Delphi 7, вставлено "My"
 private // в других версиях может быть по-другому
   FHandle: HWnd;
   FBiDiMode: TBiDiMode;
   FBiDiKeyboard: string;
   FNonBiDiKeyboard: string;
   FObjectInstance: Pointer;
   FMainForm: TForm; // копировать достаточно до этой строки
 end;
...
TMyApplication(Application).FMainForm := Form1;


 
DVM ©   (2013-10-30 10:17) [5]

Жалко, что class helpers не имеют доступа к приватным полям, был красивый способ.


 
brother ©   (2013-10-30 10:45) [6]

> не имеют доступа к приватным полям

вот и правильно, ибо нефиг...


 
брат Птибурдукова   (2013-10-30 11:12) [7]


> jumping jack   (30.10.13 09:08) [4]
Только зотовский способ будет работать пока не станет property MainForm read GetMainForm, а твой в моей XE4 не заработает


 
jumping jack   (2013-10-30 11:37) [8]

брат Птибурдукова, я думал, что достаточно ясно намекнул, что копировать нужно из Forms.pas своей версии дельфей

насчет работы во всех следующих версиях - тут нет гарантий у обоих способов

а для безопасности и там и там лучше сделать "if ...=nil then..."


 
Болезный человек   (2013-10-30 11:51) [9]

brother ©   (30.10.13 10:45) [6]
> вот и правильно, ибо нефиг...

Да фиг знает. Не пойму чем обусловлена невозможность создания главной формы вручную (из класса без dfm).

Задача как раз в этом-то и стоит.

В предложенном методе от Юрия, форма всеравно не становится главной, ибо в CreateForm выполняются определенные действия. Т.е. ее вызов все-таки обязателен. Но без dfm"а она не может быть создана. Какого спрашивается? У меня класс формы сам все строит, что надо.

Короче, извернулся просто сделав пустой dfm :(


 
Palladin ©   (2013-10-30 11:54) [10]

изворотливый какой


 
jumping jack   (2013-10-30 12:18) [11]

> форма всеравно не становится главной

как определили?

> ибо в CreateForm выполняются определенные действия. Т.е. ее вызов все-таки обязателен

HandleNeeded что ли? ну скопировали бы его к себе (и всё остальное оттуда, что, возможно, не поняли, зачем нужно, но хотите, "чтобы было", как это делают служители карго-культа)


 
Inovet ©   (2013-10-30 12:31) [12]

> [11] jumping jack   (30.10.13 12:18)
> служители карго-культа

Это которые без dfm в трюме отчаливают?


 
Inovet ©   (2013-10-30 12:31) [13]

> [12] Inovet ©   (30.10.13 12:31)
> отчаливают

не отчаливают


 
ухты   (2013-10-30 14:12) [14]

а откуда взялась форма без dfm ? и зачем ей сейчас пустой dfm?


 
jumping jack   (2013-10-30 14:16) [15]

> служители карго-культа
http://ru.wikipedia.org/wiki/%D0%9A%D1%83%D0%BB%D1%8C%D1%82_%D0%BA%D0%B0%D1%80%D0%B3%D0%BE


 
Inovet ©   (2013-10-30 14:46) [16]

> [15] jumping jack   (30.10.13 14:16)

А, вон они как называются. Не в трюмах кораблей, а в хрюхах железных птиц dfm.


 
Leonid Troyanovsky ©   (2013-10-30 19:11) [17]


> Болезный человек   (30.10.13 11:51) [9]

> действия. Т.е. ее вызов все-таки обязателен. Но без dfm"а
> она не может быть создана. Какого спрашивается? У меня класс
> формы сам все строит, что надо.

В данном случае хакерство не требуется.
Нужно лишь перекрыть конструктор главной формы.
See also:
https://groups.google.com/d/msg/fido7.ru.delphi/QsFvEncf7K0/7-UCZheFnmAJ

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2013-10-30 19:24) [18]


> Leonid Troyanovsky ©   (30.10.13 19:11) [17]

Любопытно, что способ, показанный ЮЗ, родился также
благодаря обсуждению с участием Владимира Титова.
http://groups.google.com/d/msg/fido7.ru.delphi/OLVrSKVTURM/W23kbOJnoXIJ

Какие мы уже замшелые :(

--
Regards, LVT.


 
Юрий Зотов ©   (2013-10-30 23:16) [19]

> Болезный человек   (30.10.13 11:51) [9]

Дружище, я ведь советы просто так не даю. Стараюсь, во всяком случае.

Этот способ был использован в реальном коммерческом проекте, работал много лет, у многих юзеров, на многих машинах, под разными ОС - и ни разу нареканий не вызвал. Более того, в этот проект был встроен визуальный конструктор форм, так что юзер имел возможность создавать свои собственные формы, прямо в runtime - и любую из них он мог тут же сделать главной, даже без перезапуска программы.

> В предложенном методе от Юрия, форма все равно не становится
> главной, ибо в CreateForm выполняются определенные действия. Т.е.
> ее вызов все-таки обязателен. Но без dfm"а она не может быть
> создана.


Приведенный ниже код работает без проблем (проверил в D7 под XP).
Как видим, в этом коде:
1. Наша форма становится главной.
2. Хотя CreateForm не вызывается.
3. И наша форма не имеет DFM.

Причем наша форма становится главной не только формально, она и ведет себя именно как главная. Запустите код - убедитесь сами.

program Project1;

uses
 Forms;

{$R *.res}

type
 TMyForm = class(TForm);

var
 P: PPointer;

begin
 Application.Initialize;
 P := @Application.MainForm;
 P^ := TMyForm.CreateNew(Application);
 Application.Run;
end.


 
Юрий Зотов ©   (2013-10-30 23:21) [20]

А если все же есть сомнения, то перед Application.Run вставьте строчку:

with Application.MainForm do Caption := ClassName;



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

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

Наверх




Память: 0.52 MB
Время: 0.006 c
15-1382689684
ПЛОВ
2013-10-25 12:28
2014.04.20
Как правильно активировать дочернее окно


2-1372686573
Vasa777
2013-07-01 17:49
2014.04.20
ActionToolBar надписи на кнопках


15-1383230513
123456qqq
2013-10-31 18:41
2014.04.20
Скролл в ListView


15-1382992203
Юрий
2013-10-29 00:30
2014.04.20
С днем рождения ! 29 октября 2013 вторник


2-1372955872
OlegSem
2013-07-04 20:37
2014.04.20
WinAPI