Форум: "Основная";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];
ВнизОпределить имя компонента по его индексу. Найти похожие ветки
← →
Graff (2004-01-18 00:42) [0]Помогите, кто может.
Создаю динамически компонент Tlabel и нужно программно определить что кликнули именно на него. С помощью виндозовских сообщений отлавливаю когда кликнули на него. Тоесть определяю его индекс с помощью функции ComponentIndex. А вот как из индекса получить название не знаю. Заранее благодарен.
← →
Anatoly Podgoretsky (2004-01-18 00:52) [1]А ты его присваивал? Если да то .Name
← →
Graff (2004-01-18 01:01) [2]Ты имееш ввиду Components[ComponentIndex].Name ?
Если так то это не проходит.
← →
Maksss (2004-01-18 01:03) [3]var lab : TLabel;
lab := TLabel.Create(nil);
lab.OnClick := Твоя процедура;
lab.name := "Name";
lab.InsertControl(form1);
prosedure Твоя процедура;
var s : string;
begin
s := (Sender as TLabel).Name
if s = имя той панели зен сделать
end;
← →
cobby (2004-01-18 01:41) [4]тебе повезло! я тока седня вспоминал эту тему, щя дам весь код, чтобы эти злые мастера тебя не путали...
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure btnpush(Sender: TObject;
Shift: TShiftState;x,Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
btn : tbutton;
c : integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
//PopupMenu1.TrackButton := tbLeftButton;
for c := 1 to 10 do begin
btn := tbutton.Create(Form1);
with btn do begin
parent := form1;
Left := 10;
top := 25*c;
name := TButton.ClassName +"0"+ IntToStr(c);
Caption := "comp" + IntToStr(c);
end;
btn.OnMouseMove := btnpush;
end;
end;
procedure Tform1.btnpush(Sender: TObject;
Shift: TShiftState;x,Y: Integer);
var k:integer;
begin
for k:=0 to ComponentCount-1 do begin
if (Components[k] is TButton) and
(Components[k]=Sender) then
showmessage((Sender as TButton).Name);
end;
end;
end.
в этом примере у тебя создается 10 кнопок и при НАВЕДЕНИИ на них мышки вылетает мессаг с ее (кнопки) названием. Юзай.
← →
Graff (2004-01-18 01:43) [5]Допустим создано 10 элементов. Как ты с помощью своего кода собираешся определять на какой из них кликнули? Событие OnClick будет обрабатываться во время создания компонента, а мне это не надо.
← →
Плохиш_ (2004-01-18 02:17) [6]>Graff (18.01.04 01:43) [5]
Что исходник не соответствует 100% твоей задаче? А мозгами пошевелить совсем в облом?
> Событие OnClick будет обрабатываться во время создания компонента
Ага, знания впечатляют.
← →
Piter (2004-01-18 04:13) [7]>Ты имееш ввиду Components[ComponentIndex].Name ?
нет, он наверное имеет в виду TComponent(Components[ComponentIndex]).Name
А вообще ты лукавишь
>С помощью виндозовских сообщений отлавливаю
каким образом?
>с помощью функции ComponentIndex
ComponentIndex - это не функция. Не знаю, как у тебя там все работает, но делаешь ты неправильно.
Ты должен присвоить обработчик Tlabel.OnClick (лучше прямо после создания Label"а) некой процедуре. Например, методу формы, на котором этот TLabel лежит (или другими словами методу компонента, который является Parent для твоего Label)
TForm1 = class(TForm)
procedure LabelClick(Sender: TObject);
end;
А при создании Label делать так:
...
Label:=TLabel.Create...
Label.OnClick:=LabelClick
Тогда при клике на твою метку будет вызываться метод формы TForm.LabelClick. Если создашь десять кнопок таким образом - при клике на любую из низ будет вызываться LabelClick. А понять на какую кнопку кликнули позволяет передаваемый параметр Sender, которая является ссылкой на экземпляр класса TLabel.
Вот реализация при которой Label на который кликнули изменит свой текст на "Click!"
procedure TForm1.LabelClick;
begin
TLabel(Sender).Caption:="Click!";
end;
Хотя безопаснее будет писать(Sender as TLabel).Caption:="Click!";
Заметь, эта процедура может быть присвоена как обработчик события хоть для десяти меток, но Caption будет меняться только у той, на которой кликнули. Потому что параметр Sender от разных Label"ов будет разный.
А вот так можно узнать имя Label"а на который кликнули:
procedure TForm1.LabelClick;
begin
if TLabel(Sender).Name=[чего-то там] then...
end;
← →
Piter (2004-01-18 04:24) [8]>Ты должен присвоить обработчик Tlabel.OnClick (лучше прямо после создания Label"а)
в примере cobby © (18.01.04 01:41) [4] это делается в строчке:
btn.OnMouseMove := btnpush;
Но его код не совсем корректне. Не надо в реализации метода класса обращаться к конкретному экземпляру этого класса. То есть вместо
parent := form1;
лучше все таки написать:
parent := TForm(self);
← →
KSergey (2004-01-18 07:01) [9]Автору: ищем в инете статью "Жизнь и смерть в режиме run-time" и читаем.
← →
goga (2004-01-18 11:52) [10]А самый тупой способ заключается в том, что у каждого экземпляра TLabel задаются отличные друг от друга значения Tag. Я так делал массив[3,3] картинок динамически для программы крестики-нолики. Чтобы знать по какому Image щелкнули и картинку менять на крестик или нолик
← →
Anatoly Podgoretsky (2004-01-18 13:03) [11]goga © (18.01.04 11:52) [10]
А зачем, контрольный выстрел?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c