Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.62 MB
Время: 0.041 c
2-1191494799
Mariya
2007-10-04 14:46
2007.10.28
Вместо Yes - Да


15-1191019788
Beks
2007-09-29 02:49
2007.10.28
Как вычислить значение..?


15-1190704588
Некто
2007-09-25 11:16
2007.10.28
Сообщение: "Автономные файлы - Автономная работа"


2-1191768817
Jimmy
2007-10-07 18:53
2007.10.28
Динамическая ошибка при CreateOleObject


2-1191533338
Альберт
2007-10-05 01:28
2007.10.28
потоки





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