Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.03.2011, 00:16
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию как создать объекты на форме? (кнопку)

здраствуйте.подскажите пожалуйста,как при нажатии на кнопку,создать N кол-во кнопок (кол-во вводим в Edit1)?

у меня получаеться создать тока одну кнопку
Код:
var
  Form1: TForm1;
  Button2 : Tbutton;
<...>
procedure TForm1.Button1Click(Sender: TObject);
begin
  Button2 := TButton.Create(Form1);
  Button2.Parent := Form1;
  Button2.Height := 25;
  Button2.left:=72 ;
  Button2.Top:=8;
   Form1.ActiveControl:=Button2;
  
 end;
если же я делаю так:
Код:
var
  Form1: TForm1;
  Button2 : Tbutton;
<...>
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
 for i:=1 to N do
 begin
  Button2 := TButton.Create(Form1);
  Button2.Parent := Form1;
  Button2.Height := 25;
  Button2.left:=20*i ;//с расположением пока не работал еще особо.это так для вида
  Button2.Top:=8;
  Form1.ActiveControl:=Button2;
 end;
  
 end;
если так сделать,то потом я могу обратиться тока к подследней созданной кнопке,всмысле не нажать ее (нажать можно любую) а изменить атрибут.(типа Button2.caption:='1')-атрибут измениться только у последней,а как у других менять?

Последний раз редактировалось Snake22, 09.03.2011 в 00:17. Причина: подписался на тему))
Ответить с цитированием
  #2  
Старый 09.03.2011, 02:37
Аватар для ryderx34
ryderx34 ryderx34 вне форума
Активный
 
Регистрация: 22.01.2010
Сообщения: 211
Версия Delphi: 7, 2010
Репутация: 1349
По умолчанию

Нужен массив кнопок:
Код:
var
  MyButtons: array of TButton;
Создаёшь кнопки так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  SetLength(MyButtons, StrToInt(Edit1.Text)); // задаёшь разиер массива (кол-во кнопок)
  for I := 0 to Length(MyButtons) - 1 do 
  begin  // в цикле создаёшь кнопки и сохраняешь указатели на них в массиве
    MyButtons[i] := TButton.Create(Form1);
    // здесь делаешь с созданной кнопкой что нужно
    MyButtons[i].Parent := Form1;
    // и т. д.
  end;
end;
Потом работаешь с ними так:
Код:
MyButtons[0].Caption := 'My button 1';
MyButtons[1].Caption := 'My button 2';

Последний раз редактировалось ryderx34, 09.03.2011 в 02:40.
Ответить с цитированием
  #3  
Старый 09.03.2011, 11:28
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

Спасибо! с учебы приду заценю)
Ответить с цитированием
  #4  
Старый 09.03.2011, 17:23
Janom Janom вне форума
Начинающий
 
Регистрация: 04.02.2011
Адрес: Москва
Сообщения: 148
Версия Delphi: 7
Репутация: 133
По умолчанию

Или так:
Код:
var
  Form1: TForm1;
  Button2 : Tbutton;
<...>
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
for i:=1 to 10 do
 begin
   With Button2 do
     begin
       TButton.Create(Form1);
       Parent := Form1;
       Height := 25;
       left:=72 ;
       Top:=8;
       Name:='Btn'+IntToStr(i);
     end;
 end;
 end;
Потом производиш поиск по имени. Если кнопка нашлась присвоить ей какое-либо событие...

Последний раз редактировалось Janom, 09.03.2011 в 17:28.
Ответить с цитированием
  #5  
Старый 09.03.2011, 17:43
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от Janom
Если кнопка нашлась присвоить ей какое-либо событие...
Вопрос тысячелетия: почему нельзя назначить кнопке эвент при создании? Причём, даже не на одну, а на все кнопки? И определять, какая из них нажата, по свойству Tag?
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #6  
Старый 09.03.2011, 17:51
Janom Janom вне форума
Начинающий
 
Регистрация: 04.02.2011
Адрес: Москва
Сообщения: 148
Версия Delphi: 7
Репутация: 133
По умолчанию

Можно, но тэг тоже отслеживать надо...
Я про такой вариант:
Код:
var FindComp:TComponent;
...
for i:=0 to form1.componentcount-1 do
    begin
      if form1.components[i].name=('Btn7') then
        begin
           FindComp:=form1.findcomponent(form.components[i].name);
           TButton(FindComp).Caption:='Кнопка7';
        end;
    end;

Последний раз редактировалось Janom, 09.03.2011 в 18:02.
Ответить с цитированием
  #7  
Старый 09.03.2011, 18:00
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Сто кнопок и сто разных действий?
В case затолкать тэг да и все дела.
Ну уж если уж очень надо, можно сделать потомка от TButton с какоим-нибудь свойством.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #8  
Старый 10.03.2011, 19:51
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

Спасибо всем за советы.воспользовался первым.
еще вопрос,как этой кнопке событие сделать?
Ответить с цитированием
  #9  
Старый 10.03.2011, 22:50
Аватар для ryderx34
ryderx34 ryderx34 вне форума
Активный
 
Регистрация: 22.01.2010
Сообщения: 211
Версия Delphi: 7, 2010
Репутация: 1349
По умолчанию

Создаёшь процедуру (она должно быть одним из методов, поэтому не забудь объявить её в описании TForm1):
Код:
type
  TForm1 = class(TForm)
    //. . .
    procedure BtnClick(Sender: TObject);
Код:
procedure TForm1.BtnClick(Sender: TObject);
begin
  // здесь нужный код
end;
И при создании кнопки назначай:
Код:
MyButtons[i].OnClick := BtnClick;
Ответить с цитированием
  #10  
Старый 11.03.2011, 14:02
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

ага спасибо.пока работает)
и еще вопрос уже не по теме,
почему функция Delete(string,pos,pos) не удаляет из Memo1.text
Код:
Delete(Memo1.text, Pos('<', Memo1.text), Pos('>', Memo1.text) - Pos('<', Memo1.text) + 1);
пишет ошибку " Constant object cannot be passed as var parameter"
а если вмсто Memo1.text вставить переменную типа string то работает.
решил проблему тем что содержимое мема1 присвоил в s:string, и потом удалил нужную часть и обратно мему1 присвоил s.
Но интересно почему напрямую с мемо.техт не работает
Ответить с цитированием
  #11  
Старый 14.03.2011, 13:19
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

еще вопрос по созданию.как сделать чтоб компонент создавалася на заднем фоне?
т.е. вот у меня есть на форме Shape,я нажимаю на кнопку и под этим шейпом должен появиться еще один шейп,размером чуть больше этого,и должен появиться так,чтобы было видно его края,а все остальное перекрывал бы уже существующий шейп.а то уменя он поверх существующего появляется.
Ответить с цитированием
  #12  
Старый 14.03.2011, 13:32
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Shape2.SendToBack;
либо
Shape1.BringToFront;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #13  
Старый 14.03.2011, 13:38
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

ага,спасибо
Ответить с цитированием
  #14  
Старый 14.03.2011, 16:35
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

еще загвоздка,при создании формы я создаю шейп
Код:
var
  Form1: TForm1;
  Sh,Sh1:TShape;
<...>
procedure TForm1.FormCreate(Sender: TObject);

begin
 Sh:=TShape.Create(Self) ;
 Sh.Name:='shape1';
 Sh.Top:=40;
 Sh.left:=60;
 Sh.Height:=100;
 Sh.Width:=100;
 Sh.OnMouseDown:=NewSh;//ВЫЛЕЗАЕТ ОШИБКА!
 Sh.Parent:=Form1;

end;

Код:
procedure Tform1.NewSh(Sender: TObject);
begin
 Sh1:=TShape.Create(Self) ;
 Sh1.Top:=Sh.Top-2; //ЭТО НАДО ИЗМЕНИТЬ
 Sh1.left:=Sh.left-2; //И ЭТО
 Sh1.Height:=104;
 Sh1.Width:=104;
 Sh1.Brush.color:=clred;
 Sh1.Parent:=Form1;
 Sh1.SendToBack;
end;
вот,во первых вылезает ошибка.как исправить?(
во вторых, при вызове процедуры NewSh у создаваемого шейпа, left и Тор должы браться не из Sh а из того компонента,на котором мышка нажималась(процедуру Newsh планирую запускать из нескольких мест,но это всё доработаю..) это както через sender.tobject надо делать.
для начала вот эти два вопроса,помогите пожалуйста
Ответить с цитированием
  #15  
Старый 14.03.2011, 17:15
Janom Janom вне форума
Начинающий
 
Регистрация: 04.02.2011
Адрес: Москва
Сообщения: 148
Версия Delphi: 7
Репутация: 133
По умолчанию

1. Метод не совсем подходит... поменяй заголовок процедуры на:
Код:
procedure TForm1.NewSh(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
...
end;
2. Опиши глобальную переменную: MySender:TObject
там на чем кликаешь: MySender:=Sender; А в NewSh пиши
Код:
Sh1.left:=TShape(MySender).left-2
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter