Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу динамически создать кнопку на форме.


Страницы:   1 2

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у тебя что?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо