Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

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

 
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, "&#209;&#236;&#229;&#237;&#232;&#242;&#252; &#232;&#234;&#238;&#237;&#234;&#243;") and
        AppendMenu(IconMenu, MF_STRING, 1, "&#194;&#251;&#245;&#238;&#228;") 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.061 c
1-1132299619
shc
2005-11-18 10:40
2005.12.18
Цвет стрелочки в ComboBox


4-1129785264
Rentgen
2005-10-20 09:14
2005.12.18
Oтправить комбинацию Crtl+C


2-1133357898
JTAG
2005-11-30 16:38
2005.12.18
Еще вопросик как можно проверить существует ли вообще


14-1132365647
4ik
2005-11-19 05:00
2005.12.18
Почитать про ADO


1-1132809968
john_mag
2005-11-24 08:26
2005.12.18
OleContainer