Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: ООП моё первое начало  (Прочитано 6754 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
crossmark
Гость
« : 18-03-2007 14:13 » 

Всем привет! Пожалуйста помогите разобраться с ООП. Решил к этому подойти вплотную, и теперь куча вопросов и проблем. Задумал одну программку, помогите на ней разъяснить..... Может что-то надо изменить..... Суть дела, в том, что надо на форму вывести 5 кружков, создать их и вывести, и еще чтобы можно учитывать клик мышкой.
type
tFAlarm=class
private
{ Private declarations }
fCircle:Timage;
fBcircle:Timage;
fAlCircle:Timage;
fname:string;
public
{ Public declarations }
procedure ShowFAlarm;
end;

var fAlarm:tFAlarm;

procedure tFAlarm.ShowFAlarm;
begin
fcircle.fimg:=Timage.Create(form2.PnlAlarm);
fcircle.fimg.Parent:=form2.PnlAlarm;
fcircle.fimg.Picture.LoadFromFile(fpath+'Texture\AlCirlce.bmp');
end;
fAlarm:=tFAlarm.Create;
fAlarm.fAlCircle:=Timage.Create(form2.panelAlarm);
fAlarm.fAlCircle.Parent:=form2.PanelAlarm;
fAlarm.fAlCircle.Show;
fAlarm.fAlCircle.Picture.LoadFromFile(fpath+'Texture\AlCirlce.bmp');
fAlarm.fAlCircle.AutoSize:=true;
fAlarm.fAlCircle.Transparent:=true;
end;

Как правильно можно все это организовать и что вписывать в constructor?
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #1 : 19-03-2007 14:51 » 

смысл ООП во многом в том, чтобы не писать уже существующий код. Код, который реализовывает сходный описанному функционал - есть, например, есть класс TShape, который "лёгким движением руки" превращается в "кружочеГ".

делаем новый юнит, и в нём описываем унаследованный класс:

Код:
unit Unit2;

interface

uses
  Classes, ExtCtrls, Graphics;

type
  TfAlarm = class (TShape)
  public
    constructor Create (AOwner: TComponent); override;
  end;

implementation

{ TfAlarm }

constructor TfAlarm.Create(AOwner: TComponent);
begin
  // Здесь пишется любой код, который будет связан с инициализацией "кружочеГа", например, стиль заливки и цвет.
  inherited;
  Shape := stCircle;
end;

end.

теперь в основной форме заюзам новый класс:
Код:
unit Unit1;

interface

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

type
  TForm2 = class(TForm)
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure OnAlarmClick (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  end;

var
  Form2: TForm2;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm2.BitBtn1Click(Sender: TObject);
var
  i: integer;
begin
  for i := 1 to 5 do
    with TfAlarm.Create(Self) do begin
      Name := 'Alarm' + IntToStr (i);
      Parent := Self;
      Left := 100 * i;
      Top := 100;
      OnMouseUp := OnAlarmClick;
    end;
end;

procedure TForm2.OnAlarmClick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ShowMessage ((Sender as TfAlarm).Name + ' clicked!');
end;

end.

как видно, на форме находится одна единственная кнопка. при нажатии на эту кнопку будет создано 5 "кружочеГов", на событие мыши присваивается обработчик.

этот пример использует создание компонентов в runtime, т.е. компонент на форме создаётся только тогда, когда пользователь нажимает на кнопку. путём нехитрых добавлений ко второму модулю можно заставить компонент "жить" в палитре Дельфей и создавать его в design-time, т.е. также, как создаётся кнопка. но для приведённого примера в этом нет особого смысла, потому что стандартный класс TShape от нового класса почти не отличаются.
Записан

crossmark
Гость
« Ответ #2 : 20-03-2007 08:32 » 

Спасибо x77 так хорошо описал. А можно еще объяснить (встречный такой вопросик). Создан у меня класс например TMyClass=class(TImage); и созданы объекты этого класса их около пяти штук: var scircle:TMyClass, bcircle:TMyClass...... У TMyClass есть метод, что-то вроде для события onMouseMove. Я хочу чтобы при наведении на созданныe (Image) эти scircle, bcircle..... изменять картинку (picture.loadFromFile). Как так сделать, чтобы картинку изменяд тока однин какой-то объект (на который мышка была наведена scircle, bcircle....) Вроде-бы можно через Sender, а что-то не получается....
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 20-03-2007 15:06 » new

есть такое понятие - приведение типов. в дельфи это реализовывается оператором AS. например, есть классы

Код:
A = class
  Color: integer;
end;

B = class (A)
  Shape: integer;
end;

допустим, нам нужна процедура, которая меняет цвет переменной, заданной любым из этих классов:

procedure ChangeColor (Sender: object; NewColor: integer);
begin
  (Sender as A).Color := NewColor;
end;

поскольку мы не знаем, для какого именно класса будет использоваться процедура, то типом параметра мы указываем объект (т.е. вообще любой класс), а внутри процедуры приводим этот объект к классу А, в котором такое свойство гарантировано есть.

примерно той же логикой руководствуется Борланд в своих обработчиках событий. почти каждый из них имеет параметр Sender: TObject, в котором передаётся объект, вызвавший даный обработчик. Дельфи не знает, что это за объект, из какого класса был создан, какие у нег освойства и т.д. а вот сам программист это знать обязан, и он в процедуры приводит параметр Sender к тому классу, который ему нужен, и таким образом получает доступ к свойствам и методам этого класса.

в твоём случае в OnMouseMove надо сказать что-то типа (Sender as TMyClass).Picture.LoadFromFile (..);

но вообще говоря, более грамотно было бы реализовать в TMyClass метод, например, Switch (который будет менять картинки) и из основной процедуры просто вызывать этот метод.
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines