Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2014, 16:47   #1
Nikolas_555
Пользователь
 
Аватар для Nikolas_555
 
Регистрация: 16.11.2013
Сообщений: 47
Вопрос присваивание событий, type, SpeedButon.

Понимаете, у меня на форме есть одна кнопка, ButtonA1 типа SpeedButton , с ней связаны все события с массивом Buttons, который создаётся при создании самой формы..

Код:
{============процедуры_событий=====================}
procedure TForm6.ButtonA1Click(Sender: TObject);
begin
     if (kol mod 2 <> 0) then
                          begin
                           ImageList1.GetBitMap(1,TSpeedButton(Sender).Glyph);
                       {  ButtonA1.Tag1:=1;  }
                          end

                         else
                          Begin
                           ImageList1.GetBitMap(2,TSpeedButton(Sender).Glyph);
                        {  ButtonA1.Tag2:=2; }
                          End;
end;

procedure TForm6.ButtonA1MouseEnter(Sender: TObject);
begin
 if (F=True) then
     Begin
       if (kol mod 2 <> 0) then
       ImageList1.GetBitMap(1,TSpeedButton(Sender).Glyph)
                            else
       ImageList1.GetBitMap(2,TSpeedButton(Sender).Glyph);
     End;
end;

  procedure TForm6.ButtonA1MouseLeave(Sender: TObject);
begin
 if (F=True) then
     TSpeedButton(Sender).Glyph.LoadFromFile('C:\путь\fon.bmp');

end;

{===========создание_формы====================}

procedure TForm6.FormCreate(Sender: TObject);
var
 i,n,j: integer;
 begin
  kol:=1;
// создание  buttons (массива кнопок)
  for I := Low(buttons) to High(buttons) do
    begin
     buttons[i] := TSpeedButton.Create(Owner);
     buttons[i].Parent := Form6;
     buttons[i].Left := XX[i];
     buttons[i].Top := YY[i];
     buttons[i].Height := 34;
     buttons[i].Width := 34;
     buttons[i].Tag := i;
     buttons[i].Glyph.LoadFromFile('C:\путь\fon.bmp');
     buttons[i].OnClick := ButtonA1Click;
     buttons[i].OnMouseEnter := ButtonA1MouseEnter;
     buttons[i].OnMouseLeave := ButtonA1MouseLeave;
    end;
То есть, все события, что были наложены на ButtonA1, передаются к каждому элементу массива Buttons.
Изначально, и ButtonA1, и сам массив Buttons были типа SpeedButton. Теперь, в процессе программирования, я понял, что мне необходимы ещё дополнительные опции Tag1 и Tag2 к основной (Tag), которая есть у компонента SpeedButton. Из за чего, собственно, и начал работать с типами(type).
вопрос: что мне написать в коде программы, что бы реализовать задуманное? можно ли обойтись без создания типов? как добавить к компоненту дополнительную опцию?
Nikolas_555 вне форума Ответить с цитированием
Старый 12.05.2014, 17:11   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
как добавить к компоненту дополнительную опцию?
только написав свой компонент, как наследника.

Цитата:
Теперь, в процессе программирования, я понял, что мне необходимы ещё дополнительные опции Tag1 и Tag2 к основной (Tag),
пишем примерно так
описываем свой тип переменных
Код:
type 
TMultiTag =record tag1, tag2, tagBase: integer; end;
PMultiTag =^TMultiTag;
"инициализируем" Tag новыми данными (ОДИН РАЗ при создании кнопки или же при создании формы)
Код:
var p: PMultiTag;
   New(p);
 bitBtn.tag:=p;
и после инициализации заносим нужные данные
Код:
PMultiTag(bitbtn.tag).TagBase:=i;
PMultiTag(bitbtn.tag).Tag1:=??????;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 12.05.2014, 17:11   #3
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Код:
...
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
 TButton1 = record
   button: TSpeedButton;
   Tag1, Tag2: integer; // доп тэги
 end;

var
  Form1: TForm1;
    buttons: Array [1..10] of TButton1;
implementation
...
procedure TForm1.FormCreate(Sender: TObject);
var
 i,n,j: integer;
 begin
  kol:=1;
// создание  buttons (массива кнопок)
  for I := Low(buttons) to High(buttons) do
    begin
     buttons[i].button := TSpeedButton.Create(Owner);
     buttons[i].button.Parent := Form1;
     buttons[i].button.Left := XX[i];
     buttons[i].button.Top := YY[i];
     buttons[i].button.Height := 34;
     buttons[i].button.Width := 34;
     buttons[i].button.Tag := i;
     buttons[i].button.Glyph.LoadFromFile('C:\путь\fon.bmp');
     buttons[i].button.OnClick := ButtonA1Click;
     buttons[i].button.OnMouseEnter := ButtonA1MouseEnter;
     buttons[i].button.OnMouseLeave := ButtonA1MouseLeave;
     buttons[i].Tag1 := 123;
     buttons[i].Tag2 := 456;
    end;
end;
Это реализация через Record. И как тебе уже говорили, можно через класс. Если нужно, могу показать.

Цитата:
можно ли обойтись без создания типов?
Да, можно. Для этого создаются доп массивы, равные длине массива кнопок. При инициализации кнопок в Tag кнопки кладёшь индекс. В обработчиках событий кнопок вытаскиваешь индекс из Tag, и берёшь данные из дополнительных массивов по индексу.

Последний раз редактировалось doktor255; 12.05.2014 в 17:18.
doktor255 вне форума Ответить с цитированием
Старый 12.05.2014, 17:14   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Либо описать свой класс наследник TSpeedButton с двумя дополнительными полями. Либо специальную структуру/класс с необходимыми полями и записывать в свойство Tag указатель на эту структуру.
P.S.
А кнопку ButtonA1 можно вообще выбросить. Обработчики никуда не денутся.
northener вне форума Ответить с цитированием
Старый 13.05.2014, 11:04   #5
Nikolas_555
Пользователь
 
Аватар для Nikolas_555
 
Регистрация: 16.11.2013
Сообщений: 47
Смех

northener, doktor255, evg_m
Благодарю за помощь!

воспользовался способом, который описал doktor255.
Nikolas_555 вне форума Ответить с цитированием
Старый 13.05.2014, 20:12   #6
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Цитата:
Nikolas_555
и даже не возникло вопросов по вытягиванию дополнительных тегов в обработчиках? Я думал будет затык в решении.
doktor255 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ not implemented in type 'istream' for arguments of type 'float *'из-за чего эта ошибка и как исправить? Mitax-47 Помощь студентам 1 10.05.2013 15:48
Could not convert variant of the type (String) into type (Boolean) Silly Student C++ Builder 0 19.11.2011 13:06
Could not convert variant of type (Olestr) into type (Double) java_91 Общие вопросы Delphi 1 18.02.2011 18:46
Could not convert variant of type (UnicodeString) into type (Double) postaveche БД в Delphi 11 13.12.2010 16:41
HTML нет событий при передачи методо POST через <input type="image" Mixail HTML и CSS 12 07.06.2009 03:33