Форум: "Прочее";
Текущий архив: 2014.04.20;
Скачать: [xml.tar.bz2];
ВнизВозможно ли задать 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.002 c