Форум: "Начинающим";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];
ВнизНе могу динамически создать кнопку на форме. Найти похожие ветки
← →
Formcreater (2005-11-28 21:55) [0]
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.
Форма появляется, а кнопка нет. Где ошибка?
← →
Palladin © (2005-11-28 22:02) [1]:) ну а где она должна появиться то, если ты ей ни родителя ни владельца не назначил....
B:=TButton.Create(F);
B.Parent:=F;
← →
Formcreater (2005-11-28 22:07) [2]2 Palladin
Я так тоже пробовал, всё равно не появляется.
← →
Profi © (2005-11-28 22:11) [3]Formcreater (28.11.05 22:07) [2]
А F у тебя что?
← →
Palladin © (2005-11-28 22:13) [4]Я надеюсь ты ее создаешь в той же процедуре что и создаешь форму?
← →
Palladin © (2005-11-28 22:14) [5]Скорее всего ты ее создаешь до создания и показа формы, как я понимаю из твоего кода... тогда чего ты хотел...
← →
Alexandr Bydantcev © (2005-11-28 22:18) [6]А назначать ширину и высоту пробовал?
← →
Palladin © (2005-11-28 22:20) [7]а оно по умолчанию...
← →
Юрий Зотов © (2005-11-28 22:22) [8]> Где ошибка.
Про одну уже сказали в [1]. Вторая ошибка в том, что ни форма, ни кнопка не будут работать, поскольку в программе нет цикла выборки сообщений.
← →
Formcreater (2005-11-28 22:24) [9]>А F у тебя что?
F-это сама форма.
>Я надеюсь ты ее создаешь в той же процедуре что и создаешь форму?
Это не процедура, а вся программа.
>Скорее всего ты ее создаешь до создания и показа формы, как я понимаю
>из твоего кода... тогда чего ты хотел
Я пробовал использовать try..except для формы, результат-тот же.
← →
Formcreater (2005-11-28 22:28) [10]>А назначать ширину и высоту пробовал?
Пробовал, не помогает.
>Про одну уже сказали в [1]. Вторая ошибка в том, что ни форма, ни кнопка
>не будут работать, поскольку в программе нет цикла выборки сообщений.
Это я знаю, потом приделаю.
← →
Юрий Зотов © (2005-11-28 22:29) [11]> Formcreater (28.11.05 22:24) [9]
> Я пробовал использовать try..except для формы, результат-тот же.
Хоть десять раз, все равно результат будет тем же. Структура GUI программы для Windows должна быть совсем другой, не такой, как у Вас .
← →
Юрий Зотов © (2005-11-28 22:30) [12]> Formcreater (28.11.05 22:28) [10]
> Это я знаю, потом приделаю.
Так сначала приделайте, после этого и вопрос исчезнет. А так - чему же удивляться, что программа не работает? Она ж не дописана, вот и не работает.
← →
Palladin © (2005-11-28 22:31) [13]
> Я пробовал использовать try..except для формы
А что? try...except помогает в таких случаях?
> Это не процедура, а вся программа.
Это как это "вся программа"? Когда я вижу операторные скобки
begin
F:=TForm.create(nil);
with F do begin
parent:=nil;
caption:="---><---";
F.showmodal;
end;
и неизвестно откуда взявшийся кусок кода с созданием кнопки совершенно оттельно от вышеприведенных скобок в которых то и создается форма... что позволяет мне сделать вывод что этот кусок кода никак с кодом создания формы не связан... последовательности исполнения не видно.
← →
Formcreater (2005-11-28 22:32) [14]Нашёл ошибку!
Надо было
F.showmodal;
в самый конец переместить!
← →
Юрий Зотов © (2005-11-28 22:33) [15]> Palladin © (28.11.05 22:31) [13]
Там еще один begin, к нему и end относится. Это действительно вся программа. В ней создаются два оконных объекта - и все, больше ничего не делается.
← →
Palladin © (2005-11-28 22:35) [16]а... :) теперь я понял что это такое... прошу прощенья... форматирование сбило с толку...
можно поинтересоваться по какой причине нужно было писать подобное?
← →
Юрий Зотов © (2005-11-28 22:36) [17]> Formcreater
Просмотрел, что там вызываеется ShowModal, был невнимателен. Да, если так, то работать будет - потому что в ShowModal есть свой цикл выборки сообщений.
← →
Alexandr Bydantcev © (2005-11-28 22:38) [18]Ну да. Но все-же Parent и Owner должны назначатся.
← →
Formcreater (2005-11-28 22:40) [19]>можно поинтересоваться по какой причине нужно было писать подобное?
Я начинающий, и только осваиваю делфи. Поэтому меня интересуют различные тонкости, в том числе и динамическое создание приложения.
← →
Palladin © (2005-11-28 22:55) [20]По сути говоря, подобное может понадобиться всего лишь в двух случаях: Вывод сплэш-формы (программа такая то, картинка у программы такая то, автор у программы такой то, версия такая то), или вывод окна авторизации пользователя. Но и в том и в другом случае формы можно нарисовать заранее, тогда все сводится только к созданию объекта формы, показа формы и уничтожения объекта. А подобное динамическое создание приложения как такового никак себя не оправдывает. Тонкости же создания компонентов в режиме времени выполнения можно узнать в это замечательной статье http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342
← →
Юрий Зотов © (2005-11-28 22:56) [21]> 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.
← →
Formcreater (2005-11-28 23:20) [22]Спасибо всем, пойду разбираться.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.014 c