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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.11.2008, 16:37
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию Клонировать компоненты

здравствуйте... на форме задан какой-либо компонент (например label) необходимо создать еще таких же компонентов несколько и обрабатывать их на события OnClick и OnMouseMove.

помогите осуществить данную вещь..
Ответить с цитированием
  #2  
Старый 13.11.2008, 17:08
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

в каком режиме - выполнения или дизайна?
Ответить с цитированием
  #3  
Старый 13.11.2008, 17:08
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

выполнения

ну не редактирования.. чтобы программно создавать компонент.. уже во время выполнения программы.. и после чего обрабатывать на события..
Ответить с цитированием
  #4  
Старый 13.11.2008, 17:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну и создавай их.
Пусть label1 уже есть.
тогда создание так:

Код:
var
  I : Integer;
  ANewLabel : TLabel;
begin
  For I := 1 To 10 Do // make 10 labels
  Begin
    ANewLabel := TLabel.Create(Self);
    ANewLabel.Parent := Self;
    ANewLabel.Top := Random(100);
    ANewLabel.Left := Tandom(300);
    ANewLabel.Caption := 'label #' + InttoStr(I);
    ANewLabel.OnClick := Label1.OnClick;
    ANewLabel.OnMouseMove := Label1.OnMouseMove;
  End;
end;
Ответить с цитированием
  #5  
Старый 13.11.2008, 17:13
dmdx dmdx вне форума
Начинающий
 
Регистрация: 24.05.2008
Адрес: Москва
Сообщения: 133
Репутация: 15
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    Procedure ClickObj(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
Procedure TFOrm1.ClickObj(Sender: Tobject);
begin
 ShowMessage('Тут обработка');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 obj: TLabel;
begin
 obj := TLabel.Create(Label1);
 obj.Caption:='Лейбел 1';
 obj.Parent := Self;
 obj.Left:= Label1.Left+40;
 obj.Top:= Label1.Top+20;
 obj.OnClick := ClickObj;
end;

end.
__________________
Програмист приходит на стрельбище. Стреляет. Прапор смотрит на мешень и говорит
Прапор: вы не попали ни один раз.
Программист: Пули вылетели, проблемы у вас.
Ответить с цитированием
  #6  
Старый 13.11.2008, 17:18
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

спасибо, надеюсь поможет)
Ответить с цитированием
  #7  
Старый 15.11.2008, 10:02
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

подскажите пожалуйста, как получить сам объект, на который навели мышью или кликнули...

пишу игрушку (чисто для себя)

создается некий label с текстом "." и эти точки движуться по экрану.. надо кликать на каждую и этим самым этот компонент исчезает с формы (для этого ведь необходимо сначала узнать какой элемент должен исчезнуть, да и сколько их на форме неизвестно, т.к. они в рандомном порядке прибавляются через определенный интервал времени). если точки зашли за данную площадь, то идет отсчет жизней назад (за каждую прошедшую точку).

Так же должны будут организовываться бонусы.. Например разноцветные цифры бегут по форме. При наведении на них мышью идёт суммирование очков (по значению на этом лебеле). Далее та цифра пропадает. Так же и жизни чтобы были. Но достаточно мне просто сказать как получить управление над кликнутым элементом а остальное я смогу сам сделать... Нужно ведь как-то получить элемент. Это не массив и индекса там нет, по этому надо другим каким-либо способом получить элемент..

Подскажите, каким?
Ответить с цитированием
  #8  
Старый 15.11.2008, 10:06
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

вот например мы указываем некий класс элементу

obj := TLabel.Create(Label1);

label1 как я понял.

но по моей идее надо так: label[n+1] но так нельзя наверное.. где n это индекс..

ведь мы не знаем сколько label'ов там будет.. да и не писать же в коде:

label1
label2
label3
label4
label5
label6

...

label100

если будет 100 элементов..

или надо каждый label запихать в массив? (да я и динамические массивы не знаю, а ведь число label'ов растет)
Ответить с цитированием
  #9  
Старый 15.11.2008, 16:52
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

неужели нет возможности указать это всё? 0_о
Ответить с цитированием
  #10  
Старый 15.11.2008, 18:57
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
Подмигивание

Если я тебя прально понял... :
При создании объекта приравниваем его тег к его порядковому номеру...
Код:
...
var
ObjLabel : TLabel;
...
For I{это и есть порядковый номер}:= 0 to 100 do
begin 
ObjLabel := TLabel.Create...// ну это и до меня написано
...
ObjLabel.Tag := I;//прировняли...
...
Потом при обработке события....
[code]procedure TLabelClick.....// здесь надо что то с Sender'ом мутить написанно было в книжке, но с собой нет это было на форуме
{если будешь делать разные события для лабелов(что делать не советую) то...}
If TLabel.Tag = 5 then ...// ну дальше понятно...[code]
Если закончишь выложи код... нужная вещь...
СОВЕТ! : Я б на твоем месте использовал Canvas т. к. там намного удобней...(в твоем случае все будет без мерцания!) =) Если прально сделать...
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
  #11  
Старый 15.11.2008, 19:46
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

я канвас не очень знаю =) я может почитаю пару статей сегодня

...
ObjLabel.Tag := I;//прировняли...
...

и как выдрать из ObjLabel.Tag нужный label?

или TLabel.Tag = 5 он и есть?

где 5 это номер самого label'а
Ответить с цитированием
  #12  
Старый 16.11.2008, 20:17
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
По умолчанию

Цитата:
и как выдрать из ObjLabel.Tag нужный label?
не понял... что значит "выдрать"???
Тут такое дело менять все свойства объекта (Label.Left.. top.. font..) можно через массив...
Код:
ObjLabel[6].Top := ObjLabel[6].Top + 15; // "опустим"(=)) надпись на 15 пикселей вниз...
Но вот обрабатывать клик на токо что созданом (либо если их оч. много) объекте (насколько я помню... ) можно так...
Допустим:
1. У нас 32 Label (или массив из них...)
2. У них у всех различные позиции... (Top & Left)
3. По клику на каждую из них ее надо удалить...
Для 3 этапа(первые 2 вроде понятны...) надо созать процедуру-обработчик события OnClick для класса TLabel
(то есть обрабатываться будет при клике на абсалбтно любом объекте типа TLabel, поэтому начинать "раздовать" Tag'и лучше с 1...)
Код:
procedure TLabelOnClick // это надо ручками писать ...
// в этом участке неточности ... завтра исправлю...
Этот код будет реагировать на клик по любой надписи существующей на форме. Теперь осталось только удалить надпись...
Код:
ObjLabel[TLabel.Tag].Destroy;  {а может и sender завтра уточню}
То есть выбираем из массива Label'ов Label с индексом равным Tag'у надписи по которой кликнули и уничтожаем...
С канвасом могу помочь (знаний для этого момента хватает...) пиши в личку, а лучше в асю...
--------------------------------------------------------------------------
P.S. В этом коде допущенны ошибки... найду книжку - исправлю
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
  #13  
Старый 16.11.2008, 20:41
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

ошибки не беда

ты аську свою оставь в личку (просто при нажатии ICQ на форуме, вылезает окно "страница не найдена". Либо опера глючит, либо форум не в порядке).
Ответить с цитированием
  #14  
Старый 16.11.2008, 21:43
Alexo Alexo вне форума
Начинающий
 
Регистрация: 24.01.2007
Сообщения: 191
Репутация: 15
По умолчанию

Компоненты создавай использую Массив

вот тебе и индекс

labelar : array[0..10] of TLabel;

//

сор не вник нормально, что там предлогал Interface, посмотрел, что там все tag да tag
__________________
Delphi - это лишь инструмент, а что ты сможешь создать при помощи этого инструмента, зависит исключительно от тебя.

Последний раз редактировалось Alexo, 16.11.2008 в 21:46.
Ответить с цитированием
  #15  
Старый 16.11.2008, 22:19
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

не знал что можно строить массив из компонентов

с тагами все понятно, только немного грамозко...

лучше конечно-же канвасом делать игру но спасибо за совет)

только мне непонятно как каждому элементу событие представить, как их отобразить на форме, и как определить к какому именно элементу обращаются при клике на него ))
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter