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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2009, 12:02   #1
dardreams
Пользователь
 
Регистрация: 19.02.2009
Сообщений: 20
По умолчанию Как работать с массивом компонентов

Добрый день.
В первый раз решил создать массив из компонентов и вот в действиях запутался, кто нибудь скажите почему здесь происходит ошибка ?, Причем сообщение приходит с номером, а действие перекрашивание вызывает ошибку:
Код:
unit Unit1; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls, ExtCtrls, Grids; 
 
type 
  TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
  private 
    { Private declarations } 
  public 
  Procedure PanelOnClick(Sender: TObject); 
    { Public declarations } 
 
  end; 
 
var 
       Form1: TForm1; 
       Panel: array[0..811] of Tpanel; 
       x,y,z:integer; 
implementation 
 
{$R *.dfm} 
 
 
procedure TForm1.FormCreate(Sender: TObject); 
var i,j:integer; 
begin 
y:=-20; 
Width:=585; 
Height:=586; 
for j:=0 to 32 do 
 begin 
  y:=y+20; 
  i:=0; 
  x:=0; 
for i:=0 to 28 do 
 begin 
  Panel[i]:=Tpanel.Create(Self); 
  Panel[i].Parent:=self; 
  Panel[i].Width:=20; 
  Panel[i].Height:=20; 
  Panel[i].Tag:=z; 
  Panel[i].Left:=x; 
  Panel[i].Top:=y; 
  Panel[i].OnClick:=PanelOnClick; 
  x:=x+20; 
  Inc(z); 
  end; 
 end; 
end; 
 
Procedure TForm1.PanelOnClick(Sender: TObject); 
var a:integer; 
begin 
a:=(Sender as TPanel).tag; 
ShowMessage(FloatToStr(a)); 
Panel[a].Color:=clBlack; 
end; 
end.
dardreams вне форума Ответить с цитированием
Старый 21.02.2009, 12:22   #2
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Перед циклом создания панелей поставь Z:=0;

И потом лучше так :
Код:
Procedure TForm1.PanelOnClick(Sender: TObject);
var a:integer;
begin
(Sender as TPanel).Color:=clBlack;
end;
"Заряженному танку в дуло не смотрят" @Dekmer in WoT

Последний раз редактировалось Kotofff; 21.02.2009 в 12:27.
Kotofff вне форума Ответить с цитированием
Старый 21.02.2009, 12:50   #3
dardreams
Пользователь
 
Регистрация: 19.02.2009
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Kotofff Посмотреть сообщение
Перед циклом создания панелей поставь Z:=0;

И потом лучше так :
Код:
Procedure TForm1.PanelOnClick(Sender: TObject);
var a:integer;
begin
(Sender as TPanel).Color:=clBlack;
end;
Работает !!!!!!!!!!!
Спасибо большое ! ВЫ гений !
dardreams вне форума Ответить с цитированием
Старый 21.02.2009, 13:22   #4
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

А все из-за того что у тебя
Код:
Panel[i]:=Tpanel.Create(Self);
i 33 раза принимает значение от 0 до 28
лучше как сказали перед циклом
Код:
z := 0;
и
Код:
Panel[z]:=...;
в цикле
s.Creator вне форума Ответить с цитированием
Старый 22.02.2009, 08:59   #5
dardreams
Пользователь
 
Регистрация: 19.02.2009
Сообщений: 20
По умолчанию

Как исправить ошибку ?
Я хотел чтобы на нажатие правой кнопкой мыши на Tpanel в caption записывалось значение 'X' но когда в обработчике событий пишу
Код:
for j:=1 to 32 do
 begin
  y:=y+15;
  x:=StringGridLeft.Width;
for i:=1 to 27 do
 begin
  Panel[i,j]:=Tpanel.Create(Self);
  Panel[i,j].Parent:=self;
  Panel[i,j].Width:=15;
  Panel[i,j].Height:=15;
  Panel[i,j].Tag:=z;
  Panel[i,j].Left:=x;
  Panel[i,j].Top:=y;
  Panel[i,j].OnClick:=PanelOnClick;
  Panel[i,j].OnDblClick:=Panel1DblClick;
  Panel[i,j].ShowHint:=true;
  Panel[i,j].PopupMenu:=PopupMenu1;
  Panel[i,j].Hint:=IntToStr(i)+'x'+IntToStr(j);
  p:=i;
  o:=j;
  x:=x+15;
  Inc(z);
  end;
 end;
end;
//Вырезано

procedure TfmMain.PopupMenu1Popup(Sender: TObject);
begin
(Sender As Tpanel).Caption:='x'
end;

end.
Ошибка Invalid Typecast
Я так понял что это не совсестимо, скажите как можно совместить чтобы можно было не только из действий панели это вызывать а и из других, напрмер вот PopupMenu
Я нашел выход просто сделал действие: procedure TfmMain.anelContextPopup()
Но мне все равно желательно знать как можно вызывать с других действий.

Последний раз редактировалось dardreams; 22.02.2009 в 09:13.
dardreams вне форума Ответить с цитированием
Старый 22.02.2009, 09:19   #6
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

В данном случае событие
Код:
PopupMenu1Popup(Sender: TObject)
вызывает компонент PopupMenu1
Значит и Sender = PopupMenu1

Почитай про событие OnContextPopup панели
Код:
Panel1ContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
s.Creator вне форума Ответить с цитированием
Старый 22.02.2009, 09:22   #7
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Сапера что-ли пишешь ? ....

Попробуй добавь сообщение OnMouseUp :
Код:
Panel[i,j].OnMouseUp := PanelMouseUp;
И сама процедура :
Код:
procedure TForm1.PanelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbRight then // правая кнопка мыши
      (Sender as TPanel).Caption := 'X';
end;
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 22.02.2009, 09:33   #8
dardreams
Пользователь
 
Регистрация: 19.02.2009
Сообщений: 20
По умолчанию

Нет пишу не сапера, а "Японскую картинку" если кто знает
Понимаете мне нужно научиться запускать именно с другого места я для примера взял popup можно хоть button лишь бы работало. Я хочу понять ка правильно работать с Sender я уже разобрался что
Цитата:
вызывает компонент PopupMenu1
Значит и Sender = PopupMenu1
Но как сделать чтобы работал именно мой код ?
Именно в этой процедуре:
procedure TfmMain.PopupMenu1Popup(Sender: TObject);
begin
(Sender As Tpanel).Caption:='x'
end;

end.
dardreams вне форума Ответить с цитированием
Старый 22.02.2009, 09:33   #9
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от dardreams Посмотреть сообщение
Но мне все равно желательно знать как можно вызывать с других действий.
используй массив Panel[i,j] - ты же его создал
s.Creator вне форума Ответить с цитированием
Старый 22.02.2009, 09:40   #10
dardreams
Пользователь
 
Регистрация: 19.02.2009
Сообщений: 20
По умолчанию

s.Creator
Не понимаю как ? можете написать код ?
Код:
procedure TfmMain.PopupMenu1Popup(Sender: TObject);
begin
Panel[i,j].Caption:='x';
end;
Так не работает .
dardreams вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как работать с изображениями eliyas Помощь студентам 4 10.03.2011 22:27
Как работать с массивом Edit-ов subsonic Общие вопросы Delphi 3 02.03.2009 07:36
Как работать с XML? Никки Общие вопросы Delphi 7 18.01.2008 00:56
как правильно работать с массивом TStrings Air Общие вопросы Delphi 6 19.12.2007 17:55