![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не могу динамически создать кнопку на форме.
Formcreater © (2005-11-28 21:55:00)
program Project1;
uses Forms,stdctrls;
{$R *.RES}
var F:TForm; B:Tbutton;
begin
F:=TForm.create(nil);
with F do begin
parent:=nil;
caption:='---><---';
F.showmodal;
end;
B:=TButton.Create(nil);
B.Parent:=nil;
B.top:=100;
B.Left:=100;
B.Caption:='button';
end.
Форма появляется, а кнопка нет. Где ошибка?
Formcreater (2005-11-28 23:20:00) [1]Спасибо всем, пойду разбираться.
Юрий Зотов (2005-11-28 22:56:00) [2]> Formcreater (28.11.05 22:40) [19]
Тогда эта статья для Вас:
http://www.delphikingdom.com/asp/section.asp?id=16
Еще разберите детально вот этот код, очень полезно будет (это готовая программа, можно сохранить ее на диске в файл под именем TrayWithoutVCL.dpr, потом открыть в Delphi, запустить и посмотреть, как она работает).
program TrayWithoutVCL;
{$M 1024, 1024}
uses
Windows,
Messages,
ShellAPI;
const
AppName = 'WinApiTrayApp';
WM_TRAYMSG = WM_USER + 100;
var
WndClass: TWndClassEx;
WndHandle: HWND = 0;
Msg: TMsg;
IconData: TNotifyIconData;
IconMenu: HMENU = 0;
SecondIcon: HICON;
function WndFunc(Wnd, Msg: DWORD; wParam, lParam: integer): integer;
stdcall;
var
P: TPoint;
begin
case Msg of
WM_DESTROY, WM_QUERYENDSESSION:
begin
Result := Integer(Msg = WM_QUERYENDSESSION);
PostQuitMessage(0)
end;
WM_TRAYMSG:
begin
Result := 0;
if (lParam = WM_RBUTTONDOWN) and GetCursorPos(P) then
begin
SetForegroundWindow(Wnd);
TrackPopupMenuEx(IconMenu, 0, P.X, P.Y, Wnd, nil);
PostMessage(Wnd, WM_NULL, 0, 0)
end
end;
WM_COMMAND:
begin
Result := 0;
case wParam and $FFFF of
0: begin
if IconData.hIcon = SecondIcon then
IconData.hIcon := WndClass.hIcon
else
IconData.hIcon := SecondIcon;
Shell_NotifyIcon(NIM_MODIFY, @IconData)
end;
1: PostMessage(Wnd, WM_CLOSE, 0, 0)
end
end;
else
Result := DefWindowProc(Wnd, Msg, wParam, lParam)
end
end;
{
--------------------------------------------------------------------------------------------
}
begin { main }
with WndClass do
begin
cbSize := SizeOf(WndClass);
Style := CS_HREDRAW or CS_VREDRAW ;
lpfnWndProc := @WndFunc;
hIcon := LoadIcon(0, IDI_EXCLAMATION);
hCursor := LoadCursor(0, IDC_ARROW);
hbrBackground := hBrush(COLOR_WINDOW);
lpszMenuName := nil;
lpszClassName := AppName;
hIconSm := hIcon
end;
WndClass.hInstance := hInstance;
if RegisterClassEx(WndClass) = 0 then
Exit;
WndHandle := CreateWindowEx(WS_EX_TOOLWINDOW, AppName, AppName,
WS_OVERLAPPEDWINDOW,
0, 0, 0, 0, 0, 0, hInstance, nil);
if WndHandle = 0 then
Exit;
with IconData do
begin
cbSize := SizeOf(IconData);
Wnd:= WndHandle;
uID := 100;
uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
uCallbackMessage := WM_TRAYMSG;
hIcon:= WndClass.hIcon;
szTip := AppName
end;
if Shell_NotifyIcon(NIM_ADD, @IconData) then
try
IconMenu := CreatePopupMenu;
if IconMenu 0 then
try
if AppendMenu(IconMenu, MF_STRING, 0, 'Ñìåíèòü èêîíêó') and
AppendMenu(IconMenu, MF_STRING, 1, 'Âûõîä') then
begin
SecondIcon := LoadIcon(0, IDI_QUESTION);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg)
end
end
finally
DestroyMenu(IconMenu)
end;
finally
Shell_NotifyIcon(NIM_DELETE, @IconData)
end
end.
Palladin (2005-11-28 22:55:00) [3]По сути говоря, подобное может понадобиться всего лишь в двух случаях: Вывод сплэш-формы (программа такая то, картинка у программы такая то, автор у программы такой то, версия такая то), или вывод окна авторизации пользователя. Но и в том и в другом случае формы можно нарисовать заранее, тогда все сводится только к созданию объекта формы, показа формы и уничтожения объекта. А подобное динамическое создание приложения как такового никак себя не оправдывает. Тонкости же создания компонентов в режиме времени выполнения можно узнать в это замечательной статье http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342
Formcreater (2005-11-28 22:40:00) [4]>можно поинтересоваться по какой причине нужно было писать подобное?
Я начинающий, и только осваиваю делфи. Поэтому меня интересуют различные тонкости, в том числе и динамическое создание приложения.
Alexandr Bydantcev (2005-11-28 22:38:00) [5]Ну да. Но все-же Parent и Owner должны назначатся.
Юрий Зотов (2005-11-28 22:36:00) [6]> Formcreater
Просмотрел, что там вызываеется ShowModal, был невнимателен. Да, если так, то работать будет - потому что в ShowModal есть свой цикл выборки сообщений.
Palladin (2005-11-28 22:35:00) [7]а... :) теперь я понял что это такое... прошу прощенья... форматирование сбило с толку...
можно поинтересоваться по какой причине нужно было писать подобное?
Юрий Зотов (2005-11-28 22:33:00) [8]> Palladin © (28.11.05 22:31) [13]
Там еще один begin, к нему и end относится. Это действительно вся программа. В ней создаются два оконных объекта - и все, больше ничего не делается.
Formcreater (2005-11-28 22:32:00) [9]Нашёл ошибку!
Надо было
F.showmodal;
в самый конец переместить!
Palladin (2005-11-28 22:31:00) [10]
> Я пробовал использовать try..except для формы
А что? try...except помогает в таких случаях?
> Это не процедура, а вся программа.
Это как это "вся программа"? Когда я вижу операторные скобки
begin
F:=TForm.create(nil);
with F do begin
parent:=nil;
caption:='---><---';
F.showmodal;
end;
и неизвестно откуда взявшийся кусок кода с созданием кнопки совершенно оттельно от вышеприведенных скобок в которых то и создается форма... что позволяет мне сделать вывод что этот кусок кода никак с кодом создания формы не связан... последовательности исполнения не видно.
Юрий Зотов (2005-11-28 22:30:00) [11]> Formcreater (28.11.05 22:28) [10]
> Это я знаю, потом приделаю.
Так сначала приделайте, после этого и вопрос исчезнет. А так - чему же удивляться, что программа не работает? Она ж не дописана, вот и не работает.
Юрий Зотов (2005-11-28 22:29:00) [12]> Formcreater (28.11.05 22:24) [9]
> Я пробовал использовать try..except для формы, результат-тот же.
Хоть десять раз, все равно результат будет тем же. Структура GUI программы для Windows должна быть совсем другой, не такой, как у Вас .
Formcreater (2005-11-28 22:28:00) [13]>А назначать ширину и высоту пробовал?
Пробовал, не помогает.
>Про одну уже сказали в [1]. Вторая ошибка в том, что ни форма, ни кнопка
>не будут работать, поскольку в программе нет цикла выборки сообщений.
Это я знаю, потом приделаю.
Formcreater (2005-11-28 22:24:00) [14]>А F у тебя что?
F-это сама форма.
>Я надеюсь ты ее создаешь в той же процедуре что и создаешь форму?
Это не процедура, а вся программа.
>Скорее всего ты ее создаешь до создания и показа формы, как я понимаю
>из твоего кода... тогда чего ты хотел
Я пробовал использовать try..except для формы, результат-тот же.
Юрий Зотов (2005-11-28 22:22:00) [15]> Где ошибка.
Про одну уже сказали в [1]. Вторая ошибка в том, что ни форма, ни кнопка не будут работать, поскольку в программе нет цикла выборки сообщений.
Palladin (2005-11-28 22:20:00) [16]а оно по умолчанию...
Alexandr Bydantcev (2005-11-28 22:18:00) [17]А назначать ширину и высоту пробовал?
Palladin (2005-11-28 22:14:00) [18]Скорее всего ты ее создаешь до создания и показа формы, как я понимаю из твоего кода... тогда чего ты хотел...
Palladin (2005-11-28 22:13:00) [19]Я надеюсь ты ее создаешь в той же процедуре что и создаешь форму?
Profi (2005-11-28 22:11:00) [20]Formcreater (28.11.05 22:07) [2]
А Fу тебя что?