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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2011, 08:06   #1
Bronya
Новичок
Джуниор
 
Регистрация: 24.03.2011
Сообщений: 2
По умолчанию Работа с массивами объектов

Здраствуйте! Помогите пожалуйста, в Делфи я создаю одно приложение которое содержит кнопку при нажатии на которую создается 5 лейболов в в виде массива. И у каждый из них есть процедуры Нажатия, отпускания и перемещения этих лейбелов(что-то типо Зацепи и тащи). Вопрос встал как узнать на какой из этих лейболов я нажал т.е. с кем мне сейчас работать.

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Label1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Label1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    lab:array[1..5] of TLabel;
    i:integer;
        Procedure LabMDown (Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer) ;
      Procedure LabMUp (Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer) ;
      Procedure LabMMove (Sender: TObject; Shift: TShiftState; X,
  Y: Integer) ;

    end;

var
    Form1: TForm1;
    f:boolean;

implementation

{$R *.dfm}

procedure TForm1.Label1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    f:=false;
     Label1.Font.Color:=clBlack;
end;

procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    f:=True;
     Label1.Font.Color:=clRed;
end;

procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
   if f then begin
       label1.Top:=label1.Top+y-Label1.Height div 2;
       Label1.Left:=x+Label1.Left-Label1.Width div 2;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
   for i:=1 to 5 do
   begin
   Lab[i]:=Tlabel.Create(self);
   Lab[i].Parent:=self;
   lab[i].Name:='Lab'+intToStr(i);
   lab[i].Caption:=lab[i].Name;
   lab[i].OnMouseDown:=LabMDown;
   lab[i].OnMouseMove:=labMMove;
   lab[i].OnMouseUp:=LabMUp;
   lab[i].Font.Size:=16;
   lab[i].Top:=i*50;
   end;

end;

procedure TForm1.LabMUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    f:=false;

end;

procedure TForm1.LabMDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    f:=True;
end;

procedure TForm1.LabMMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
   if f then begin

    end;
end;
end.
Получается нужна процедура LabMMove. Спасибо.

___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 25.03.2011 в 15:42.
Bronya вне форума Ответить с цитированием
Старый 25.03.2011, 12:46   #2
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Label1, Label2, Label3 можно в общем описать как TLabel(Sender)
тоесть, если процедура вызвана Label3 то в параметре Sender храница именно она

пример:
Код:
procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if f then begin
TLabel(Sender).Top:=TLabel(Sender).Top+y-TLabel(Sender).Height div 2;
TLabel(Sender).Left:=x+TLabel(Sender).Left-TLabel(Sender).Width div 2;
end;
end;
VirusN13

Последний раз редактировалось ArtGrek; 25.03.2011 в 12:48.
ArtGrek вне форума Ответить с цитированием
Старый 25.03.2011, 15:21   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

(моё имхо, основаное на смутных воспоминаниях) вроде, кастовать tlabel(sender) не очень правильно, лучше кастовать (sender as tlabel)

упд. хотя для данной задачи не особо принципиально

Последний раз редактировалось phomm; 25.03.2011 в 15:24.
phomm вне форума Ответить с цитированием
Старый 25.03.2011, 15:22   #4
Bronya
Новичок
Джуниор
 
Регистрация: 24.03.2011
Сообщений: 2
По умолчанию

Премного благодарен!!!!!
Теперь можно дальше продолжать работать!!!
Bronya вне форума Ответить с цитированием
Старый 30.03.2011, 17:21   #5
belyjj
Пользователь
 
Регистрация: 20.03.2011
Сообщений: 29
По умолчанию

phomm а как это кастовать так? У меня такая проблема: массив из стринггридов, и нужно выделять ячейку процедурой

Код:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 if (gdSelected in State) then        //ÿ÷åéêà, êîòîðóþ õîòèì çàêðàñèòü
  with TStringGrid(Sender).Canvas do
   begin
     Brush.Color:=clGreen;           //öâåò çàêðàñêè
     FillRect(Rect);
     //Font.Size:=Font.Size+2;
     //Font.Color:=clYellow;
     TextOut(Rect.Left+2,Rect.Top+2,TStringGrid(Sender).Cells[ACol,Arow]);
   end
  else
   with TStringGrid(Sender).Canvas do
   begin
     Brush.Color:=clWhite;           //öâåò çàêðàñêè
     FillRect(Rect);
     //Font.Size:=Font.Size+2;
     //Font.Color:=clYellow;
     TextOut(Rect.Left+2,Rect.Top+2,TStringGrid(Sender).Cells[ACol,Arow]);
   end
end;
но выделение работает только в первом стринггриде , а в массиве нет
belyjj вне форума Ответить с цитированием
Старый 01.04.2011, 08:16   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

У тебя скорее всего дело не в касте (typecast), а просто надо всем гридам на OnDrawCell поставить вызов твоей этой StringGrid1DrawCell

про кастовать я имел ввиду (я смутно припоминаю, что что-то такое в виде рекомендации читал в мануалах), что способ с (sender as что-то) безопаснее , чем что-то(sender), т.е. в твоем случае поидёт замена TStringGrid(sender) на (sender as TSstringGrid)
phomm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с массивами Gausse Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 23.01.2011 03:06
Работа с массивами GaSST Microsoft Office Excel 5 24.03.2010 05:12
C(Си)-Работа с массивами Zheka288 Общие вопросы C/C++ 3 24.12.2009 17:28
Работа с массивами mchip Microsoft Office Excel 8 22.04.2009 11:46
Работа с массивом объектов Newnata Паскаль, Turbo Pascal, PascalABC.NET 2 06.12.2007 07:13