Створення кнопки програмно

Підкажіть мені, будь ласка, як створити динамічно візуальний компонент (кнопку) на формі в Delphi.

Btn: = TButton.Create (Self);
Btn.Parent: = Self;
Btn.Left: =
Btn.Top: =
Btn.Caption: = "Click me";
Btn.Visible: = true;

procedure TForm1.ButtonClick (Sender: TObject);
begin

Велике дякую! Вийшло!


> А то після Ctrl + S процедура зникне :)

Це якщо декларація в published. Я зазвичай навіть обробники, якщо не в design-time призначаю, розміщую в private, знову ж якщо інші потреби не виникають. Тоді нічого не зникає. )

Але ес-но в тому місці, де обробник створюється за замовчуванням мається на увазі published, оскільки все що там є доступно через ІВ.


> Пішов зроблю собі пару-трійку харакірі.
>

"Досить однієї Таблетка" (с)


>> Пішов зроблю собі пару-трійку харакірі.> "Досить
> Одній Таблетка "(с)
Так це я харакірі з хачапурі переплутав :) Але ось чому в Дельфи секція published явно не прописується - незрозуміло. Сиди, гадай за непрямими ознаками (хоча, все і один раз). При створенні компонент (ів) зрозуміло: хочеш бачити # XA0; властивість в ІС - розташовуйте в published. Але! Вони все в лівій частині! А то, що навішується - в правій. Крім дочірніх (синових?) Компонент (ів). Вони взагалі зверху. Але ось так, з ходу, ні можу пригадати жодної книги, в якій говорилося, що верхня, неіменованая секція - published.

> Сиди, гадай за непрямими ознаками

Хіба ви не гадай, а прочитай доку.

Для класів, відкомпільованих з директивою та їхніх спадкоємців дефолтна секція - published, для інших - public.


> Але ось чому в Дельфи секція published явно не прописується
> - незрозуміло.

Так вона призначена саме для компонент, имхо. Для проекту вона надлишкова. Знову ж имхо.

> Але ось так, з ходу, ні можу пригадати жодної книги, в
> Якій говорилося, що верхня, неіменованая секція - published.
>

Ну раз дядько Борланд її так не називає, значить і ні в якій книзі (Флёнов йде лісом) цього не прочитаєш. -)

Note: The TPersistent class defined in the Classes unit of the VCL and CLX is declared in the state, so any class derived from TPersistent will have RTTI generated for its published sections. The VCL / CLX uses the runtime type information generated for published sections to access the values ​​of a component "s properties when saving or loading form files. Furthermore, the IDE uses a component" s runtime type information to determine the list of properties to show in the Object Inspector.

There is seldom, if ever, any need for an application to directly use the $ M compiler switch. "

У Конопки це є точно. Бачив десь ще, але де - не пам'ятаю.

Довідка D7, розділ Delphi Language Reference / Visibility of class members:

Members at the beginning of a class declaration that don "t have a specified visibility are by default published, provided the class is compiled in the state or is derived from a class compiled in the state; otherwise, such members are public.

Підкажіть, а як створити програмно Label? Задати шрифт, розмір? Розташування?


> Підкажіть, а як створити програмно Label? Задати шрифт,
> # XA0; розмір? Розташування?

Аналогічно як і TButton


> [21] Mariya # XA0; (03.10.07 09:18)

Оголосіть весь список, пожалста

lbl: = TLabel.Create (Form1);
Lbl.Parent: = Form1;
lbl.Caption: = Ini.ReadString ( "Label", "lbl1", "Ласкаво просимо!");
lbl.Font.Size: = 20;
lbl.Font. (Повинен бути жирний, не знаю як правильно написати!)

Як правильно поставити, щоб було в центрі зверху форми (типу aligned: = center; top? Не знаю, в загальному заголовок!)
lbl.Left: =?
lbl.Top:=?
lbl.Height: =?
lbl.Width: =?


> Щоб було в центрі зверху форми

елементарна арифметика

> Повинен бути жирний, не знаю як

lbl.Font.Style: = [fsBold];

> Щоб було в центрі зверху форми

Виставити мітці Align = alTop і Alignment = taCenter


> D6

Пишу в D6 довелося вираховувати математично, вийшло. Все встало на місце. Кнопки я динамічно створила, як прописати в них правильно:
ShellExecute (handle, nil, "WINWORD.EXE", NiL, NiL, SW_SHOWNORMAL);
в bottone якщо створювати його з панелі, то так, а як в динамічно створеному?


> Вираховувати математично

викреслювати геометрично
випікати кулінаріческі
вироджуватися генеалогічно
..
)


> Mariya # XA0; (03.10.07 14:16) [30]

Може, ну його нафік, це Програмування?
Найміть програміста.

Ох, нелегке життя: ((, я їм зараз тут і є.

> Найміть програміста.

Найміть мене. гигиги.

Створити свою віконну процидурку для кнопок, через SetWindowLong повісити її поверх основної і по BM_CLICK робити те що треба.

пов я в сенсі відповів на [30].

І все ж як програмно прописати на динамічно створеної кнопці, що вона повинна відкрити який-небудь екзешник!

> І все ж як програмно прописати на динамічно створеної
> Кнопці, що вона повинна відкрити який-небудь екзешник!

Призначити їм обробники натискання # 133

function Obrabotcik_dinamiceskoi_knopki_Button1 (hWnd: HWND; Msg: LongInt; wParam, lParam: Longint): longInt; stdcall;
begin
# XA0; if Msg = BM_CLICK then begin
# XA0; # XA0; Zapusk_kakoynibud_progi;
# XA0; end;
# XA0; Result: = CallWindowProc (Pointer (Button1.Tag), hWnd, Msg, wParam, lParam);
end;

Button1.Tag: = SetWindowLong (Button1.Handle, GWL_WNDPROC, LongInt (@ Obrabotcik_dinamiceskoi_knopki_Button1));

Скажіть, а чи немає способу простіше? Може бути, є? І, може бути, навіть набагато простіше?

Може і є. Але я повний дуб в ВЦЛ, тому тепер ваша черга.

Ну втомила вже ця бодяга (НЕ губка). пишеш метод типу:
TForm1.ButtonClick (Sender: TObject). в якому викликаєш, че-нить типу [30], створюєш кнопку, нехай це буде Button1, далі:
Button1.OnClick: = ButtonClick; При натисканні Button1 все, що в тілі ButtonClick виповниться. Алилуйя!

Тоді навіщо давати початківцям поради рівня API? Ви розумієте, що такими порадами Ви тільки їх заплутує і нічого більше?

Доброго нового дня! Це все вийшло!

> Алилуйя!

Залишилося майже останнє, що я упустила, а як програмно задати розміри форми? На якій все це і малюється. Я пишу так:

Form1.Caption: = Ini.ReadString ( "Form", "Cap", "Навігатор");
Form1.Height: = Ini.ReadInteger ( "Form", "Height", 500);
Form1.Width: = Ini.ReadInteger ( "Form", "Width", 700);
Ігнорує, не ставить за замовчуванням 500 на 700.

А! Ще, щодо меню, саме меню створила, а як вкладки прописати?

Вже ранок, прокидайтеся! Допоможіть свеженачінающей. )

Default is an integer value to use if there is no key corresponding to Section or no data value corresponding to Ident.

Sorry? What does it mean.

> [48] Mariya # XA0; (04.10.07 08:33)

Це витяг з help "а до функції ReadInteger.

Підкажіть, plz, як створити програмно меню, за подобою Боттона не виходить.

> За подобою Боттона

Десь так:

function TMenuInsertColleague.AddMenuItem (MainMenu: TMainMenu;
# XA0; MenuData: TMenuItemData): Boolean;
var
# XA0; I: Integer;
# XA0; TempMenuItem: TMenuItem;
begin
# XA0; Result: = False;
# XA0; if Assigned (MenuData) and Assigned (MainMenu) then
# XA0; begin
# XA0; # XA0; for I: = 0 to MainMenu.Items.Count # 151; 1 do
# XA0; # XA0; begin
# XA0; # XA0; # XA0;
# XA0; # XA0; # XA0; if MainMenu.Items [I] .Caption = MenuData.Section then
# XA0; # XA0; # XA0; begin
# XA0; # XA0; # XA0; # XA0;
# XA0; # XA0; # XA0; # XA0; TempMenuItem: = TMenuItem.Create (MainMenu);
# XA0; # XA0; # XA0; # XA0; TempMenuItem.Caption: = MenuData.Caption;
# XA0; # XA0; # XA0; # XA0; TempMenuItem.ImageIndex: = MenuData.ImageIndex;
# XA0; # XA0; # XA0; # XA0; TempMenuItem.Tag: = Integer (MenuData.CommandClass);
# XA0; # XA0; # XA0; # XA0; TempMenuItem.OnClick: = MenuClickEvent;
# XA0; # XA0; # XA0; # XA0;
# XA0; # XA0; # XA0; # XA0; MainMenu.Items [I] .Add (TempMenuItem);
# XA0; # XA0; # XA0; # XA0; Result: = True;
# XA0; # XA0; # XA0; # XA0;
# XA0; # XA0; # XA0; # XA0; Exit;
# XA0; # XA0; # XA0; end;
# XA0; # XA0; end;
# XA0; # XA0;
# XA0; # XA0; TempMenuItem: = TMenuItem.Create (MainMenu);
# XA0; # XA0; TempMenuItem.Caption: = MenuData.Section;
# XA0; # XA0; MainMenu.Items.Add (TempMenuItem);
# XA0; # XA0;
# XA0; # XA0; Result: = AddMenuItem (MainMenu, MenuData);
# XA0; end;
end;

TMenuItemData # 151; тобі не потрібен. Там Хроні рядки типу «ім'я пункту» меню итд # 133

Але для ясності даю і його:

TMenuItemData = class
# XA0; strict private
# XA0; # XA0; FSection: string; # XA0; # XA0; # XA0;
# XA0; # XA0; FCaption: string;
# XA0; # XA0; FCommandClass: TCustomCommandClass;
# XA0; # XA0; FImageIndex: Integer;
# XA0; public
# XA0; # XA0; constructor Create (Section: string; Caption: string;
# XA0; # XA0; # XA0; CommandClass: TCustomCommandClass; ImageIndex: Integer = # 151; 1);

# XA0; # XA0; property Section: string read FSection;
# XA0; # XA0; property Caption: string read FCaption;
# XA0; # XA0; property CommandClass: TCustomCommandClass read FCommandClass;
# XA0; # XA0; property ImageIndex: Integer read FImageIndex;
# XA0; end;

Ой, спасибі, але не думала, що так складно! Спробую.

> Ой, спасибі, але не думала, що так складно! Буду пробувати # 133

Можна все сильно спростити # 151; це шматок з проекту. Тобі досить:

TempMenuItem: = TMenuItem.Create (MainMenu);
# XA0; # XA0; # XA0; TempMenuItem.Caption: = "Мій пункт";
# XA0; # XA0; # XA0; TempMenuItem.OnClick: = MenuClickEvent; // <— Клик
# XA0; # XA0; # XA0;
# XA0; # XA0; # XA0; MainMenu.Items [I] .Add (TempMenuItem);

де:
MainMenu.Items [I] # 151; це пункт верхнього рівня наприклад «Файл
»


> TempMenuItem: = TMenuItem.Create (MainMenu);
> # XA0; # XA0; # XA0; TempMenuItem.Caption: = "Мій пункт";
> # XA0; # XA0; # XA0; TempMenuItem.OnClick: = MenuClickEvent; // <— Клик
> # XA0; # XA0; # XA0;
> # XA0; # XA0; # XA0; MainMenu.Items [I] .Add (TempMenuItem);

Видає помилки. Невідомо MenuClickEvent і OnClick

MenuClickEvent це оброблювач
його треба написати

Напишіть Mariya хто небудь програму.


> Марія, ти знущаєшся?

НІ! Уже все вийшло, Спасибі всім ВЕЛИЧЕЗНЕ.

if MessageDlg ( "Вийти?", mtConfirmation, [mbYes, mbNo], 0) = mrYes then.

написати, щоб замість Yes і No було ТАК і НІ?

MessageBox () на російській винде покаже Та й Ні


> Ця бодяга (НЕ губка)

якщо губка, то тоді вже ба дяга = Spongilla lacustris.


> Якщо губка, то тоді вже бодяга = Spongilla lacustris.
Ok, екселенція

Схожі статті