Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> определить событие для динамических кнопок, не получаеца... 
V
    Опции темы
kr3v3tkus
Дата 5.3.2009, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 8.3.2008

Репутация: 1
Всего: 1



знаю, уже были такие темы, но не могу сообразить как сделать:( помогите пожалуйста
Код

type
  TForm1 = class(TForm)
    web: TWebBrowser;
    Button1: TButton;
    SbTemplate: TSpeedButton;
    procedure Button1Click(Sender: TObject);
    procedure SbTemplateClick(Sender: TObject);
    procedure Butt_click(Sender: TObject; num: integer);


Код

procedure TForm1.Butt_click(Sender: TObject; num: integer);
begin
//
end;

procedure ololo;
...
        B[q].OnClick := Form1.Butt_click;


пишет [Error] Unit1.pas(125): Incompatible types: 'Parameter lists differ'
если указать параметры, то [Error] Unit1.pas(125): Incompatible types: 'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter'

Это сообщение отредактировал(а) kr3v3tkus - 5.3.2009, 00:47
PM MAIL   Вверх
Virtuals
Дата 5.3.2009, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 1
Всего: 11



kr3v3tkus, 
у меня все работает, что я делаю не так?
Код

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    Buttons: array[0..2] of TButton;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
 Memo1.lines.add('=');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Buttons[0]:=TButton.Create(Form1);
Form1.InsertControl(Buttons[0]);
Buttons[0].OnClick:=Button2Click;
Buttons[0].Left:=2;
Buttons[0].Top:=2;
Buttons[0].Width:=50;
Buttons[0].Height:=50;
end;


Добавлено через 2 минуты и 47 секунд
TForm1.Butt_click(Sender: TObject; num: integer);
что оно сдесь делает?

PM MAIL ICQ   Вверх
Kbl4AH
Дата 5.3.2009, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 4
Всего: 15



kr3v3tkus, списки параметров стандартного обработчика события и твоей процедуры-обработчика должны быть одинаковые. См. пост выше.
PM MAIL ICQ   Вверх
Christoph
Дата 5.3.2009, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



Код

type 
  TNotifyEvent = procedure(Sender: TObject) of object;
/.........
property OnEnter: TNotifyEvent read FOnEnter write FOnEnter;




--------------------
user posted image
PM MAIL ICQ   Вверх
MetalFan
Дата 5.3.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



гыг) мне чтоли еще отписаться до кучи? )))
з.ы. если автору надо определить, у какой кнопки вызвался обработчик OnClick, то это он может сделать несколькими способами:
1. прописать при динамическом создании кнопки ее св-во tag, а в OnClick проверять TButton(Sender).Tag
2. Искать Sender'а в массиве кнопок и по делать вывод индексу.
наверное 1 самое простое и быстрое решение


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
~FoX~
Дата 5.3.2009, 10:16 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 5
Всего: 68



[off]
MetalFan, что ж вы бедное свойство таг совсем замучили. У контролов уже есть свойство которое по определению уникальное...Его нама. И не надо морочиться с заполнением свойств, проверкой на несовпадение и т.д. 
[/off]



--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
kr3v3tkus
Дата 5.3.2009, 11:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 8.3.2008

Репутация: 1
Всего: 1



всем большое спасибо smile я олень  smile 
PM MAIL   Вверх
MetalFan
Дата 5.3.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



~FoX~, а что эффективнее? сравнить stringовый name или 4байта tag? а при дин.создании св-во name вроде как никто не заполняет, а при заполнении опять же надо будет следить за уникальностью (или ловить исключения, что такое имя уже есть)
з.ы. согласись, что оба способа идентификации кнопки(через тэг или нэйм) имеют право на жисть

Это сообщение отредактировал(а) MetalFan - 5.3.2009, 13:10


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
m007kuzya
Дата 20.4.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.4.2009

Репутация: нет
Всего: нет



Интересно, здесь не очень ругаются, за поднятие старых тем? smile Я тут новенький, если что - извиняйте smile

На самом деле у меня чисто академический интерес.

Тут MetalFan говорит:
Цитата

при дин.создании св-во name вроде как никто не заполняет


Это так, в том числе и я не заполняю smile Соответственно у меня возник вопрос. А как сама программа идентифицирует динамически созданные кнопки? 
Вот у меня к примеру такой код:
Код

...
var
  Form1: TForm1;
  Butt:TButton;
...
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Butt:=TButton.Create(Self);
Butt.Parent:=self;
butt.Top:=y;
butt.Left:=x;
butt.Caption:=IntToStr(x);
Butt.Visible:=true;
butt.OnClick:=myBttClick;

динамически создаёт кнопки в месте щелчка мышой. 
При этом я никак их не идентифицирую, т.е. все кнопки я создаю абсолютно одинаковыми. Вообще, я когда такое писал, боялся, что не смогу различить клик на разные кнопки (они ведь абсолютно, совсем одинаковые!). Т.е. я думал что нажимая на одну кнопку, будут нажиматься сразу все созданные. Однако мои страхи оказались напрасны, и программа созданные кнопки как-то всётаки различает smile
Вот тут-то мне и непонятно smile Я описал ОДНУ переменную (не массив!), а создал десяток объектов! Это как ваще?%)
И, раз уж программа их как-то отличает, нельзя ли и мне включится в этот процесс? В смысле чтобы не заморачиваться с тагами/именами, а использовать какой-то внутренний идентификатор, который видимо скрыто где-то присутствует.

P.s.: использую Delphi 2009.
PM MAIL   Вверх
Kbl4AH
Дата 20.4.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 4
Всего: 15



Цитата(m007kuzya @  20.4.2009,  10:25 Найти цитируемый пост)
Я описал ОДНУ переменную (не массив!), а создал десяток объектов! Это как ваще?%)

Ты описал не переменную, а указатель...
При создании нового объекта, выделенный под предыдущий объект кусок памяти не переписывается (как в обычных переменных), а выделяется новый кусок памяти...
Цитата(m007kuzya @  20.4.2009,  10:25 Найти цитируемый пост)
В смысле чтобы не заморачиваться с тагами/именами, а использовать какой-то внутренний идентификатор, который видимо скрыто где-то присутствует.

Код

procedure TForm1.myBttClick(Sender: TObject);
begin
  ShowMessage(IntToStr((Sender as TControl).ComponentIndex));
end;

или
Цитата

TWinControl.Handle Property 
Provides access to the underlying Windows screen object for the control.

Код

procedure TForm1.myBttClick(Sender: TObject);
begin
  ShowMessage(IntToStr((Sender as TWinControl).Handle));
end;


Это сообщение отредактировал(а) Kbl4AH - 20.4.2009, 17:06
PM MAIL ICQ   Вверх
Christoph
Дата 20.4.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



Код

var
  Form1: TForm1;
  Butt:TButton;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Butt:=TButton.Create(Self);
Butt.Parent:=self;
butt.Top:=100;
butt.Left:=500;
butt.Caption:=IntToStr(100);
Butt.Visible:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Butt:=TButton.Create(Self);
Butt.Parent:=self;
butt.Top:=500;
butt.Left:=50;
butt.Caption:=IntToStr(100);
Butt.Visible:=true;
end;


Ну например, как через Handle обратится к 1 кнопке, например я хочу поменять значение какого то либо свойства? Handle не постоянное, каждый раз другое....


--------------------
user posted image
PM MAIL ICQ   Вверх
Kbl4AH
Дата 20.4.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 4
Всего: 15



Цитата(Christoph @  20.4.2009,  18:35 Найти цитируемый пост)
Ну например, как через Handle обратится к 1 кнопке

Ну так при содании 1 кнопки запиши ее хендл в переменную и обращайся smile 
PM MAIL ICQ   Вверх
m007kuzya
Дата 20.4.2009, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.4.2009

Репутация: нет
Всего: нет



м-м-м... 
Не совсем понял про указатель :/ Я ведь в разделе объявления переменных, объявляю конкретную переменную - "Butt", конкретного типа - "TButton"... :/ Или TButton это и есть указатель на убласть памяти? И чтобы там разместить кнопку мы делаем *.create? Вообще-то логично... Ладно, потом разберусь smile
А за подсказку с "Handle" и "ComponentIndex" - спасибо smile
PM MAIL   Вверх
Kbl4AH
Дата 20.4.2009, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 4
Всего: 15



Цитата(m007kuzya @  20.4.2009,  18:55 Найти цитируемый пост)
Не совсем понял про указатель :/ Я ведь в разделе объявления переменных, объявляю конкретную переменную - "Butt", конкретного типа - "TButton"... :/ Или TButton это и есть указатель на убласть памяти? И чтобы там разместить кнопку мы делаем *.create? Вообще-то логично...

Цитата

Когда вы объявляете переменную некоторого типа класса, как например...
var
  MyVar: TMyClass;
....всех вас интересует: что делает в этом случае компилятор и достаточно ли распределено памяти, чтобы хранить указатель на экземпляр данного класса в куче памяти. Знайте же: вы не распределили память для данного класа, вы только что распределили память для указателя. Компилятор всегда инициализирует этот указатель в $FFFFFFFF, а это значит, что распределенный блок памяти пуст. Во всяком случае этого достаточно, чтобы сказать что указатель *не* указывает на верную "позицию" памяти и ваш класс *не* содержит никаких данных. 
Delphi распределит и заполнит память за вас, но и вы должны немного потрудиться. Когда вы используете один из классов Delphi или свой собственный, вы должны создать его экземпляр. Что это значит: вы должны распределить память и установить на распределенный блок памяти указатель. В некоторых языках это выглядит безобразно, в Delphi же это выглядит так...
MyVar := TMyClass.Create; 
Это действительно просто, поскольку метод конструктора Create класса TMyClass является классовым методом - он работает в классе, а не в отдельном объекте. Когда вы вызываете конструктор, Delphi распределяет память и возвращает значение указателя. Присмотритесь: не похоже ли это на вызов функции? Хорошо, если вы раньше не знали, что возвращалось при вызове, то теперь вы это знаете. Вызов TMyClass.Create возвращает указатель на объект типа TMyClass. 
В конце концов то, что вам действительно нужно помнить, это... 
1) Объявление объектной переменной некоторого типа. 
2) Создание объекта вызовом метода конструктора класса. 
3) Использование объекта по назначению. 
4) Освобождение объекта.

(с) delphiworld
PM MAIL ICQ   Вверх
Christoph
Дата 20.4.2009, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



Это каждый контрол проверять на TButton и затем проверять Хендл? матеро


--------------------
user posted image
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2853 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.