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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2012, 05:13   #1
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию Массив массивов динамических кнопок - как достучаться до нужной?

Здрасьте.

Вот программно создается 5 страниц, на каждой из которых по 10 кнопок.
Идея в том, чтобы теперь сделать для них разные события. Порыскал по инету нашел, сделал, через Sender и по Tag-у
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ButtonClickDynamicProc(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Buttons: Array of Array [0..9] of TButton;


implementation

{$R *.dfm}
procedure TForm1.ButtonClickDynamicProc(Sender: TObject);
begin
case (Sender as TButton).Tag of
0:showmessage('procedure1');
1:showmessage('procedure2');
2:showmessage('procedure3');
3:showmessage('procedure4');
4:showmessage('procedure5');
5:showmessage('procedure6');
6:showmessage('procedure7');
7:showmessage('procedure8');
8:showmessage('procedure9');
9:showmessage('procedure10');
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i,k:Integer;
begin
i:=0;
k:=0;
setlength(Buttons,4);
for k := 0 to 3 do
begin
 with TTabSheet.Create(PageControl1) do
 begin
  PageControl := Form1.PageControl1;
  Caption := 'Page #' + IntToStr(k);
 end;
 for i := 0 to 9 do
 begin
  Buttons[k][i]:=TButton.Create(nil);
  Buttons[k][i].Height:=21;
  Buttons[k][i].Width:=100;
  Buttons[k][i].Left:=333;
  Buttons[k][i].Top:=250-i*27;
  Buttons[k][i].Visible:=true;
  Buttons[k][i].Tag:=i;
  Buttons[k][i].Parent:=Form1.PageControl1.Pages[Form1.PageControl1.PageCount-1];
  Buttons[k][i].OnClick := ButtonClickDynamicProc;
 end;
end;
end;
end.
Но у меня каждые 10 кнопок в отдельном массиве, как достучаться до той, которая например в 3-ем массиве? Можно конечно специально именовать кнопки, типа btn_Array1, btn_Array2 и так по Name находить и т.п., но так с кэйзом не работает та и вообще это неправильно, неудобно, непрактично

Нашел ещё вариант с пойнтерами, но у меня вынос мозга с ними, я не знаю как указать какая кнопка была нажата и из какого массива .
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Count:Integer = 0;
  Buttons: Array of Array [0..9] of TButton;
  P_Button: Array of Array [0..9] of Pointer;
  LHandler: Array of Array [0..9] of TNotifyEvent;


implementation

{$R *.dfm}
procedure ButtonClickDynamicProc(k,i:integer);
var
p:pointer;
begin
p:=@Buttons[0][0];
Buttons[0][0].Hide;
end;   
{Вот надо чтобы типа
p:=@Buttons[k][i]; 
Buttons[k][i].Hide; 
Но как пропихнуть?)}

procedure TForm1.Button1Click(Sender: TObject);
var
i,k:Integer;
begin
i:=0;
k:=0;
setlength(Buttons,4);
setlength(P_Button,4);
setlength(LHandler,4);
for k := 0 to 3 do
begin
 with TTabSheet.Create(PageControl1) do
 begin
  PageControl := Form1.PageControl1;
  Caption := 'Page #' + IntToStr(k);
 end;
 for i := 0 to 9 do
 begin
  Buttons[k][i]:=TButton.Create(nil);
  Buttons[k][i].Height:=21;
  Buttons[k][i].Width:=56;
  Buttons[k][i].Left:=433;
  Buttons[k][i].Top:=250-i*27;
  Buttons[k][i].Visible:=true;
  Buttons[k][i].Name:='BTN_'+inttostr(k)+'_'+inttostr(i);
  Buttons[k][i].Parent:=Form1.PageControl1.Pages[Form1.PageControl1.PageCount-1];
  P_Button[k][i] := @ButtonClickDynamicProc;
  Move(P_Button[k][i], LHandler[k][i], SizeOf(Pointer));
  Buttons[k][i].OnClick:=LHandler[k][i];
 end;
end;
end;

end.
Есть какой-нибудь способ? Заранее спасибо
WhiskasTM вне форума Ответить с цитированием
Старый 28.04.2012, 10:52   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

все разные процедуры (методы) должны быть написаны
1. описываете столько разных методов обработки сколько хотите.
Код:
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ButtonClickDynamicProc(Sender: TObject);
  private
    procedure Button_Arr1_Click(Sender: TObject);
    procedure Button_Arr2_Click(Sender: TObject);
    procedure Button_Arr3_Click(Sender: TObject);
.........................
2. при генерации кнопок выбираете (назначаете нужную).
Код:
   case k of 
   0:  buttons[i][k].onclick:=button_arr1_click;
   1:  buttons[i][k].onclick:=button_arr2_click;
.........................
  end;
если же вам просто надо узнать индексы нажатой кнопки ( в едином обработчике!)
то либо хранить индекы в tag (примерно так)
Код:
button[i][k].tag:= i* 1000 + k;
и узнавать
Код:
i:=(sender as Tbutton).tag div 1000;
k:=(sender as Tbutton).tag mod 1000;
или же честно искать в массиве(-ах).
if sender =button[i][k] then
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.04.2012 в 11:04.
evg_m вне форума Ответить с цитированием
Старый 28.04.2012, 11:02   #3
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

"Вы ввели over7000 символов. Укоротите до 5000". Извентеляюсь)

Вот мое решение, но лишь в случае если заранее известно, сколько будет создано массивов(или максимальное кол-во). Для неопределенного кол-ва придется делать 100000 кэйзов либо хук на него то бишь на константу X. И походу чисто на асме либо через dll. Это уже чересчур для мене
Дурацкий case не работает с переменными

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
     procedure ButtonClickDynamicProc(Sender:TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Buttons: Array of Array [0..9] of TButton;
  input:integer;
  const x = 0;


implementation

{$R *.dfm}
procedure TForm1.ButtonClickDynamicProc(Sender:TObject);
var
i:integer;
begin
case (sender as TButton).Parent.Tag of
x:
begin
  case (sender as TButton).Tag of
   0:Buttons[x,0].Hide;
   1:Buttons[x,1].Hide;
   2:Buttons[x,2].Hide;
   3:Buttons[x,3].Hide;
   4:Buttons[x,4].Hide;
   5:Buttons[x,5].Hide;
   6:Buttons[x,6].Hide;
   7:Buttons[x,7].Hide;
   8:Buttons[x,8].Hide;
   9:Buttons[x,9].Hide;
  end;
  end;

x+1:
 begin
  case (sender as TButton).Tag of
   0:Buttons[x+1,0].Hide;
   1:Buttons[x+1,1].Hide;
   2:Buttons[x+1,2].Hide;
   3:Buttons[x+1,3].Hide;
   4:Buttons[x+1,4].Hide;
   5:Buttons[x+1,5].Hide;
   6:Buttons[x+1,6].Hide;
   7:Buttons[x+1,7].Hide;
   8:Buttons[x+1,8].Hide;
   9:Buttons[x+1,9].Hide;
  end;
  end;
x+2:
 begin
  case (sender as TButton).Tag of
   0:Buttons[x+2,0].Hide;
   1:Buttons[x+2,1].Hide;
   2:Buttons[x+2,2].Hide;
   3:Buttons[x+2,3].Hide;
   4:Buttons[x+2,4].Hide;
   5:Buttons[x+2,5].Hide;
   6:Buttons[x+2,6].Hide;
   7:Buttons[x+2,7].Hide;
   8:Buttons[x+2,8].Hide;
   9:Buttons[x+2,9].Hide;
  end;
  end;
x+3:
 begin
  case (sender as TButton).Tag of
   0:Buttons[x+3,0].Hide;
   1:Buttons[x+3,1].Hide;
   2:Buttons[x+3,2].Hide;
   3:Buttons[x+3,3].Hide;
   4:Buttons[x+3,4].Hide;
   5:Buttons[x+3,5].Hide;
   6:Buttons[x+3,6].Hide;
   7:Buttons[x+3,7].Hide;
   8:Buttons[x+3,8].Hide;
   9:Buttons[x+3,9].Hide;
  end;
  end;
end;
end;


procedure TForm1.Button1Click(Sender:TObject);
var
i,k:Integer;
begin
i:=0;
k:=0;
input:=3;
setlength(Buttons,input);
for k := 0 to input do
begin
 with TTabSheet.Create(PageControl1) do
 begin
  PageControl := Form1.PageControl1;
  Caption := 'Page #' + IntToStr(k);
 end;
 for i := 0 to 9 do
 begin
  Buttons[k,i]:=TButton.Create(self);
  Buttons[k,i].Height:=21;
  Buttons[k,i].Width:=56;
  Buttons[k,i].Left:=433;
  Buttons[k,i].Top:=250-i*27;
  Buttons[k,i].Visible:=true;
  Buttons[k,i].Tag:=i;
  Buttons[k,i].Name:='BTN_'+inttostr(k)+'_'+inttostr(i);
  Buttons[k,i].Parent:= Form1.PageControl1.Pages[Form1.PageControl1.PageCount-1];
  Buttons[k,i].Parent.Tag:=k;
  Buttons[k,i].OnClick := ButtonClickDynamicProc;
 end;
end;
end;

end.
evg_m, пост взялся из ниоткуда, щас посмотрю
Посмотрел, даже демку сделать удалось. Спасибо, индексы теперь я найду, а там уже и все что угодно, если постараться

Последний раз редактировалось WhiskasTM; 28.04.2012 в 11:36.
WhiskasTM вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Организация динамических массивов. MaSTeD C# (си шарп) 0 29.02.2012 10:18
Из динамических массивов в обычные Zayka Помощь студентам 9 18.04.2011 01:32
удаление динамических массивов Dimarik Общие вопросы C/C++ 20 14.03.2011 12:30
обработка динамических массивов funky Помощь студентам 0 11.05.2009 17:53
Как работать с файлами с помощью динамических массивов Герыч Общие вопросы Delphi 4 10.01.2008 12:22