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

Вниз

Создание кнопки программно   Найти похожие ветки 

 
Mariya   (2007-10-02 15:27) [0]

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


 
clickmaker ©   (2007-10-02 15:30) [1]

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


 
clickmaker ©   (2007-10-02 15:31) [2]

ах да... еще

Btn.OnClick := ButtonClick;

procedure TForm1.ButtonClick(Sender: TObject);
begin

end;


 
Германн ©   (2007-10-02 15:35) [3]


> clickmaker ©   (02.10.07 15:31) [2]
>
> ах да... еще
>
> Btn.OnClick := ButtonClick;
>
> procedure TForm1.ButtonClick(Sender: TObject);
> begin
>
> end;
>

Тогда уж лучше
procedure TForm1.ButtonClick(Sender: TObject);
begin
 //
end;

а то после Ctrl+S процедура исчезнет :)


 
Mariya   (2007-10-02 15:45) [4]

Спасибо огромное! Получилось!


 
evvcom ©   (2007-10-02 16:01) [5]


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

Это если декларация в published. Я обычно даже обработчики, если не в design-time назначаю, помещаю в private, опять же если другие надобности не возникают. Тогда ничего не исчезает. :)


 
Германн ©   (2007-10-02 21:49) [6]


> evvcom ©   (02.10.07 16:01) [5]
>
>
> > а то после Ctrl+S процедура исчезнет :)
>
> Это если декларация в published.

Эээ. Это если декларация там, где она по умолчанию создаётся. Там, кстати, слова published нет. ;-(


 
korneley ©   (2007-10-02 23:31) [7]


>Германн ©
> ...Там, кстати, слова published нет

 так и не надо. По моему, это все таки public. Или нет?


 
Германн ©   (2007-10-03 00:07) [8]


> korneley ©   (02.10.07 23:31) [7]
>
>
> >Германн ©
> > ...Там, кстати, слова published нет
>
>  так и не надо. По моему, это все таки public. Или нет?
>

Нет. public там в другом месте. И явно указан.

Но ес-но в том месте, где обработчик создается по умолчанию подразумевается published, поскольку всё что там есть доступно через ИО.


 
korneley ©   (2007-10-03 00:16) [9]


> Германн ©

>  ...доступно через ИО...
Аргумент, однако... Пошел сделаю себе пару-тройку харакири...


 
Германн ©   (2007-10-03 00:26) [10]


> Пошел сделаю себе пару-тройку харакири...
>

"Достаточно одной таблэтки" (с)


 
korneley ©   (2007-10-03 00:42) [11]


> > Пошел сделаю себе пару-тройку харакири...> "Достаточно
> одной таблэтки" (с)
Да это я харакири с хачапури перепутал :) Но вот почему в дельфи секция published явно не прописывается - непонятно. Сиди, гадай по косвенным признакам (хотя, всего и один раз). При создании компонент(ов) понятно: хочешь видеть  свойство в ИО - помещай в published. Но! Они все в левой части! А то, что навешивается - в правой. Кроме дочерних (сыновьих?) компонент(ов). Они вообще сверху. Но вот так, с ходу, ни могу припомнить ни одной книги, в которой говорилось, что верхняя, неименованая секция - published.


 
Юрий Зотов ©   (2007-10-03 01:20) [12]

> korneley ©   (03.10.07 00:42) [11]

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

Или не гадай, а прочитай доку.

Для классов, откомпилированных с директивой {$M+} и их наследников дефолтная секция - published, для остальных - public.


 
Германн ©   (2007-10-03 01:20) [13]


> Но вот почему в дельфи секция published явно не прописывается
> - непонятно.

Так она предназначена именно для компонент, имхо. Для проекта она избыточна. Опять же имхо.

> Но вот так, с ходу, ни могу припомнить ни одной книги, в
> которой говорилось, что верхняя, неименованая секция - published.
>

Ну раз дядя Борланд её так не именует, значит и ни в какой книге (Флёнов идёт лесом) этого не прочитаешь! :-)


 
Германн ©   (2007-10-03 01:31) [14]


> Юрий Зотов ©   (03.10.07 01:20) [12]
>
> > korneley ©   (03.10.07 00:42) [11]
>
> > Сиди, гадай по косвенным признакам
>
> Или не гадай, а прочитай доку.
>
> Для классов, откомпилированных с директивой {$M+} и их наследников
> дефолтная секция - published, для остальных - public.
>

А какую доку, Юр?
Справка из Д6 говорит о..., но не объясняет ничего:
"The $M switch directive controls generation of runtime type information (RTTI). When a class is declared in the {$M+} state, or is derived from a class that was declared in the {$M+} state, the compiler generates runtime type information for fields, methods, and properties that are declared in a published section. If a class is declared in the {$M-} state, and is not derived from a class that was declared in the {$M+} state, published sections are not allowed in the class. Note that if a class is forward declared, the first declaration of the class must be declared with the $M switch.

Note: The TPersistent class defined in the Classes unit of the VCL and CLX is declared in the {$M+} 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."


 
Юрий Зотов ©   (2007-10-03 01:39) [15]

> Германн ©   (03.10.07 01:31) [14]

У Конопки это есть точно. Видел где-то еще, но где - не помню.


 
korneley ©   (2007-10-03 01:40) [16]


> Германн ©

> А какую доку, Юр?
Вот я и говорю, что как-то... невнятно, что ли. И это при том, что Паскаль = однозначность толкования на этапе трансляции (ну, или предполагается, что так)


 
Германн ©   (2007-10-03 01:48) [17]


> Юрий Зотов ©   (03.10.07 01:39) [15]

Посмотрю завтра в книге Рэя. Сейчас уже лень искать в хардкопи. :)
Ну нет у меня Конопки  в эл -формате. :-(


 
Юрий Зотов ©   (2007-10-03 02:01) [18]

Справка 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 {$M+} state or is derived from a class compiled in the {$M+} state; otherwise, such members are public.


 
Германн ©   (2007-10-03 02:09) [19]


> Юрий Зотов ©   (03.10.07 02:01) [18]
>
> Справка D7,

Ну нет  у меня Д7! Максмум - это Д6!
А BDS установлен в другой ОС :)


 
korneley ©   (2007-10-03 02:18) [20]


> Юрий Зотов ©  [18]
Ок, нашел. Картина мира опять приобрела несвойственную ей гармоничность ;-)


 
Mariya   (2007-10-03 09:18) [21]

Подскажите, а как создать программно Label? Задать шрифт, размер? Расположение?


 
Ega23 ©   (2007-10-03 09:25) [22]


> Подскажите, а как создать программно Label? Задать шрифт,
>  размер? Расположение?


Аналогично как и TButton


 
clickmaker ©   (2007-10-03 09:48) [23]


> [21] Mariya   (03.10.07 09:18)

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


 
Mariya   (2007-10-03 10:32) [24]

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:=?


 
Palladin ©   (2007-10-03 10:37) [25]

lbl.Font.Style:=[fsBold];

lbl.Left:=0;
lbl.Top:=0;
lbl.Width:=ClientWidth;
lbl.Height:=по вкусу


 
clickmaker ©   (2007-10-03 10:37) [26]


> чтобы было в центре сверху формы

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

> должен быть жирный, не знаю как

lbl.Font.Style := [fsBold];


 
Mariya   (2007-10-03 12:44) [27]


> clickmaker


> lbl.Font.Style := [fsBold];

работает, спасибо.


 
{RASkov} ©   (2007-10-03 13:18) [28]

> чтобы было в центре сверху формы

Выставить метке Align = alTop и Alignment = taCenter


 
Palladin ©   (2007-10-03 13:38) [29]


> {RASkov} ©   (03.10.07 13:18) [28]

Не знаю как в остальных Delphi, но в D6 TLabel таким свойством не обладает


 
Mariya   (2007-10-03 14:16) [30]


> D6

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


 
Сергей М. ©   (2007-10-03 14:25) [31]


> высчитывать математически


Мдя..

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


 
Плохиш ©   (2007-10-03 14:33) [32]


> Mariya   (03.10.07 14:16) [30]

Может, ну его нафик, это программированние?
Наймите программиста...


 
Mariya   (2007-10-03 16:05) [33]


> Наймите программиста...


Ох, нелегкая жизнь :((, я им сейчас здесь и являюсь!!!


 
Dib@zol ©   (2007-10-03 16:25) [34]

> Наймите программиста...

Наймите меня!!! гыгыгы...

Создать свою оконную процедурку для кнопок, через SetWindowLong повесить её поверх основной и по BM_CLICK делать то что надо.


 
Dib@zol ©   (2007-10-03 16:25) [35]

эт я в смысле ответил на [30].


 
Mariya   (2007-10-03 16:52) [36]

И все же как программно прописать на динамически созданной кнопке, что она должна открыть какой-нибудь экзешник!


 
Kolan ©   (2007-10-03 17:01) [37]

> И все же как программно прописать на динамически созданной
> кнопке, что она должна открыть какой-нибудь экзешник!

Назначить им обработчики нажатия&#133


 
Dib@zol ©   (2007-10-03 17:07) [38]

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

...

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


 
Юрий Зотов ©   (2007-10-03 18:38) [39]

> Dib@zol ©   (03.10.07 17:07) [38]

Скажите, а нет ли способа попроще? Может быть, есть? И, может быть, даже намного проще?


 
Zeqfreed ©   (2007-10-03 18:39) [40]

> Dib@zol ©   (03.10.07 17:07) [38]

Ой, мамочки.


 
Dib@zol ©   (2007-10-03 18:45) [41]

Может и есть. Но я полный дуб в ВЦЛ, поэтому дело за вами.


 
korneley ©   (2007-10-03 18:57) [42]

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


 
Юрий Зотов ©   (2007-10-03 21:46) [43]

> Dib@zol ©   (03.10.07 18:45) [41]

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


 
Dib@zol ©   (2007-10-03 22:22) [44]

> Юрий Зотов ©   (03.10.07 21:46)

Понимаю. И даже сам другим частенько об этом напоминаю. А сегодя вот вдруг накатило... Ну туплю сегодня, ну отосплюсь и всё пройдёт...


 
Mariya   (2007-10-04 07:30) [45]

Доброго нового дня! Это все получилось!

> Алилуйя!

Осталось почти последнее, что я упустила, а как программно задать размеры формы? На которой все это и рисуется. Я пишу так:

Form1.Caption:=Ini.ReadString("Form", "Cap", "Навигатор");
Form1.Height:=Ini.ReadInteger("Form", "Height", 500);
Form1.Width:=Ini.ReadInteger("Form", "Width", 700);
Игнорирует, не ставит по умолчанию 500 на 700.

А! Еще, насчет меню, само меню создала, а как вкладки прописать?


 
Mariya   (2007-10-04 07:43) [46]

Уже утро, просыпайтесь! Помогите свеженачинающей! :)


 
engine ©   (2007-10-04 08:12) [47]

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


 
Mariya   (2007-10-04 08:33) [48]

Sorry? What does it mean???


 
engine ©   (2007-10-04 09:06) [49]

> [48] Mariya   (04.10.07 08:33)

Это выдержка из help"а к функции ReadInteger.


 
Mariya   (2007-10-04 09:14) [50]

Подскажите, plz, как создать программно меню, по подобию боттона не получается.


 
Kolan ©   (2007-10-04 09:27) [51]

> по подобию боттона

Где-то так:

function TMenuInsertColleague.AddMenuItem(MainMenu: TMainMenu;
 MenuData: TMenuItemData): Boolean;
var
 I: Integer;
 TempMenuItem: TMenuItem;
begin
 Result := False;
 if Assigned(MenuData) and Assigned(MainMenu) then
 begin
   for I := 0 to MainMenu.Items.Count — 1 do
   begin
     {Ищем куда вставить пункт. MenuData.Section, например может быть «Файл» или «Правка». То есть пункт «верхнего уровня»}
     if MainMenu.Items[I].Caption = MenuData.Section then
     begin
       {Собссно создание пункта}
       TempMenuItem := TMenuItem.Create(MainMenu);
       TempMenuItem.Caption := MenuData.Caption;
       TempMenuItem.ImageIndex := MenuData.ImageIndex;
       TempMenuItem.Tag := Integer(MenuData.CommandClass);
       TempMenuItem.OnClick := MenuClickEvent;
       {Добавление созданого пункта в меню.}
       MainMenu.Items[I].Add(TempMenuItem);
       Result := True;
       {Выход}
       Exit;
     end;
   end;
   {Если «верхний» пункт меню не найден(не вышли в Exit), то он создаётся.}
   TempMenuItem := TMenuItem.Create(MainMenu);
   TempMenuItem.Caption := MenuData.Section;
   MainMenu.Items.Add(TempMenuItem);
   {Рекурсивно вызывается создание пункта.}
   Result := AddMenuItem(MainMenu, MenuData);
 end;
end;


TMenuItemData — тебе не нужен. Там хронятся строки типа «имя пункта» меню итд&#133

Но для ясности даю и его:

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

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


 
Mariya   (2007-10-04 09:34) [52]

Ой, спасибо, но не думала, что так сложно! Буду пробовать...


 
Kolan ©   (2007-10-04 09:43) [53]

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

Можно все сильно упростить — это кусок из проекта. Тебе достаточно:

TempMenuItem := TMenuItem.Create(MainMenu);
      TempMenuItem.Caption := "Мой пункт";
      TempMenuItem.OnClick := MenuClickEvent; // <&#151; Клик
      {Добавление созданого пункта в меню.}
      MainMenu.Items[I].Add(TempMenuItem);


Где:
MainMenu.Items[I] &#151; это пункт верхнего уровня например &laquo;Файл
&raquo;


 
Mariya   (2007-10-04 12:44) [54]


> TempMenuItem := TMenuItem.Create(MainMenu);
>       TempMenuItem.Caption := "Мой пункт";
>       TempMenuItem.OnClick := MenuClickEvent; // <— Клик
>       {Добавление созданого пункта в меню.}
>       MainMenu.Items[I].Add(TempMenuItem);

Выдает ошибки. Неизвестно MenuClickEvent и OnClick


 
clickmaker ©   (2007-10-04 12:50) [55]

MenuClickEvent это обработчик
его надо написать


 
Mariya   (2007-10-04 12:54) [56]

А Как?


 
clickmaker ©   (2007-10-04 12:59) [57]

Мария, ты издеваешься?
см [2]


 
Palladin ©   (2007-10-04 13:08) [58]

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


 
Mariya   (2007-10-04 13:48) [59]


> Мария, ты издеваешься?

НЕТ! Уже все получилось, Спасибо всем ОГРОМНОЕ!!!


 
Mariya   (2007-10-04 14:43) [60]

Как в

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

написать, чтобы вместо Yes и No было ДА и НЕТ?


 
clickmaker ©   (2007-10-04 14:45) [61]

MessageBox() на русской винде покажет Да и Нет


 
Anatoly Podgoretsky ©   (2007-10-04 14:45) [62]

> Mariya  (04.10.2007 14:43:00)  [60]

MessageBox


 
Mariya   (2007-10-04 14:48) [63]

Thank you!


 
Amoeba ©   (2007-10-04 19:36) [64]


> эта бодяга (не губка)

если губка, то тогда уж бадяга = Spongilla lacustris.


 
korneley ©   (2007-10-04 22:12) [65]


> если губка, то тогда уж бадяга = Spongilla lacustris.
Ok, экселенц



Страницы: 1 2 вся ветка

Текущий архив: 2007.10.28;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.027 c
3-1182679985
Ulugbek
2007-06-24 14:13
2007.10.28
Помогите DBGRID без вертикал скролла


2-1191770141
Alex-r
2007-10-07 19:15
2007.10.28
Как заархивировать несколько файлов в один архив?


3-1182251256
ambhtr
2007-06-19 15:07
2007.10.28
Создание DBF файлов


10-1139173733
Nadi
2006-02-06 00:08
2007.10.28
Выравнивание Картинки в тексте Word


15-1190847996
SerJaNT
2007-09-27 03:06
2007.10.28
Вопрос по HTML