Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
14-93687
SoX
2004-01-06 15:34
2004.01.29
Важные и срочные вопросы


4-93740
brn
2003-11-22 17:27
2004.01.29
Получение класса окна


6-93608
S@shka
2003-11-18 15:30
2004.01.29
Передача аудио по сети


1-93522
А. Владимир
2004-01-18 13:56
2004.01.29
LoadLibrary


3-93382
Grotesk
2003-12-30 18:28
2004.01.29
DataSet в качестве Базы Данных





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