Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1373312945
Андреев Саша
2013-07-08 23:49
2014.04.20
Загрузка из файла в ListView


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


15-1383047999
Demo
2013-10-29 15:59
2014.04.20
Неофициальные исправлния для RAD 2007


15-1382717773
Rouse_
2013-10-25 20:16
2014.04.20
Кто с GitHub работает - как там кодировку настроить?


2-1373253608
Виктор_К
2013-07-08 07:20
2014.04.20
Нужен совет





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский