Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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, "&#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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.014 c
2-1133740879
HF-Trade
2005-12-05 03:01
2005.12.18
Прервать работу основной процедуры - из вызванной процедуры...


14-1132694308
Богдан1024
2005-11-23 00:18
2005.12.18
Файлы *.HXI


11-1114235176
BelchonokH
2005-04-23 09:46
2005.12.18
Создание МСК компонентов из чисто КОЛовских


14-1132582270
stone
2005-11-21 17:11
2005.12.18
Люди и Майкрософт


2-1133260791
nickmas
2005-11-29 13:39
2005.12.18
Компонент TabControl





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