Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.09;
Скачать: CL | DM;

Вниз

Как создать новый класс?   Найти похожие ветки 

 
anod ©   (2003-05-30 05:15) [0]

Вообщем такой код выдает ошибку при первом е присваивании значения переменной

type TMyTrackBar = class
private
Fmin : integer;
FMax : integer;
Fpos : integer;
FThumbRect :TRect;
FRect : TRect;
FParentWnd :HWND;
procedure setTBMinMax(min,max:integer);
procedure setTBPos(p :integer);
procedure SetTBThumbRect(r :Trect);
procedure SetTBRect(r :Trect);

function GetTBMin:integer;
function GetTBMax:integer;
function GetTBPos:integer;
function GetTBThumbRect:Trect;
function GetTBRect:Trect;
function ReallyThumbRect: TRect;

procedure Draw;
public
constructor Create(ParentWnd :HWND);
end;

implementation

constructor TMyTrackBar.Create(ParentWnd :HWND);
begin
FParentWnd:=ParentWnd; //Вот здесь ну или в любом
setTBMinMax(0,100); //другом таком же месте
setTBPos(0);
setTBRect(Rect(5,5,150,15));
setTBThumbRect(Rect(1,1,20,14));
Draw;
end;
procedure TMyTrackBar.setTBMinMax(min,max:integer);
begin
Fmin:=min;
Fmax:=max;
end;
function TMyTrackBar.GetTBMin:integer;
begin
Result:=FMin;
end;
function TMyTrackBar.GetTBMax:integer;
begin
Result:=FMax;
end;
procedure TMyTrackBar.setTBPos(p :integer);
begin
//
end;
function TMyTrackBar.GetTBPos:integer;
begin
Result:=Fpos;
end;
procedure TMyTrackBar.SetTBThumbRect(r : Trect);
begin
FThumbRect:=r;
end;
function TMyTrackBar.GetTBThumbRect:Trect;
begin
Result:=FThumbRect;
end;
procedure TMyTrackBar.SetTBRect(r : Trect);
begin
FRect:=r;
end;
function TMyTrackBar.GetTBRect:Trect;
begin
Result:=FRect;
end;
function TMyTrackBar.ReallyThumbRect: TRect;
var thR: TRect;
begin
thR.Left:=GetTBRect.Left+GetTBThumbRect.Left;
thR.Top:=GetTBRect.Top+GetTBThumbRect.Top;
thR.BottomRight:=GetTBThumbRect.BottomRight;
Result:=thR;
end;
procedure TMyTrackBar.Draw;
var DC: HDC;
begin
DC:=GetDc(FParentWnd);
FillRect(DC,GetTBRect,CreateSolidBrush(RGB(99,133,171)));
FillRect(DC,ReallyThumbRect,CreateSolidBrush(RGB(232,232,232)));
ReleaseDC(FParentWnd,DC);
end;


Расскажите в чем ошибка?


 
Юрий Зотов ©   (2003-05-30 05:45) [1]

Вы отнаследовали TMyTrackBar от TObject, а у него никаких ParentWnd нет.


 
LexusR ©   (2003-05-30 07:23) [2]

у меня Ваш класс работает и нормально рисует
на панельке TrackBar

procedure TForm1.BitBtn1Click(Sender: TObject);
var
Fnew : TMyTrackBar;
begin
Fnew := TMyTrackBar.Create(Panel1.Handle);
end;


 
Юрий Зотов ©   (2003-05-30 07:33) [3]

Ух-ты, елы-палы, а код-то я толком и не посмотрел!
Сорри. Предыдущий постинг, конечно, отменяется. Компенсация за невнимательность будет чуть позже.


 
Юрий Зотов ©   (2003-05-30 08:51) [4]

Обещанная компенсация за невнимательность - тот же объект, но выполненный в стиле нормального компонента.

type
TMyTrackBar = class(TGraphicControl)
private
FMin: integer;
FMax: integer;
FPos: integer;
FThumbColor: TColor;
procedure SetMax(const Value: integer);
procedure SetMin(const Value: integer);
procedure SetPos(const Value: integer);
procedure SetThumbColor(const Value: TColor);
protected
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
published
property Align;
property Anchors;
property Color default $AB8563;
property Constraints;
property Height default 24;
property ParentColor default False;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property Visible;
property Width default 100;
property Min: integer read FMin write SetMin default 0;
property Max: integer read FMax write SetMax default 100;
property Pos: integer read FPos write SetPos default 0;
property ThumbColor: TColor read FThumbColor write SetThumbColor default $E8E8E8;
property OnClick;
property OnContextPopup;
property OnDblClick;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;

constructor TMyTrackBar.Create(AOwner: TComponent);
begin
inherited;
FMax := 100;
FThumbColor := $E8E8E8;
Color := $AB8563;
SetBounds(Left, Top, 100, 24)
end;

procedure TMyTrackBar.Paint;
var
X: integer;
begin
X := Round((FPos- FMin)/(FMax - FMin) * Width);
if X > Width then X := Width;
with Canvas, Brush do
begin
if FPos > FMin then
begin
Color := ThumbColor;
FillRect(Rect(0, 0, X, Height))
end;
if FPos < FMax then
begin
Color := Self.Color;
FillRect(Rect(X, 0, Width, Height))
end
end
end;

procedure TMyTrackBar.SetMax(const Value: integer);
begin
if (FMax <> Value) and (Value >= FPos) then
begin
FMax := Value;
Invalidate
end
end;

procedure TMyTrackBar.SetMin(const Value: integer);
begin
if (FMin <> Value) and (Value <= FPos) then
begin
FMin := Value;
Invalidate
end
end;

procedure TMyTrackBar.SetPos(const Value: integer);
begin
if (FPos <> Value) and (Value >= FMin) and (Value <= FMax) then
begin
FPos := Value;
Invalidate
end
end;

procedure TMyTrackBar.SetThumbColor(const Value: TColor);
begin
if FThumbColor <> Value then
begin
FThumbColor := Value;
Invalidate
end
end;


 
anod ©   (2003-05-30 09:26) [5]

Юрий Зотов
1. Мне такой код не подходит, так как там есть отступ THUMB"a от основы.
2. Мне надо чтоб эта компонента без форм работала.
Чтобы в программу на ВинАпи встроить.

А что такое Invalidate?

LexusR
И НЕ ВЫЛЕТАЕТ?? СТРАННО.

Если я меняю строчку с
type TMyTrackBar = class
на
type TMyTrackBar = object
то все работает?
Объясните разницу?
Я могу ловить сообщение onMouseMove если object?


 
Skier ©   (2003-05-30 09:29) [6]

>anod


> Вообщем такой код выдает ошибку при первом е присваивании
> значения переменной

А как присваиваешь ? Покажи...


 
anod ©   (2003-05-30 09:39) [7]

2Юрий Зотов
Извините насчет 1 - тоже не посмотрел.
Но у меня ничего не отображается на форме

procedure TForm1.Button1Click(Sender: TObject);
begin
TB:= TMyTrackBar.Create(Form1);
end;



 
anod ©   (2003-05-30 09:40) [8]

2Skier
В коде есть место, помеченно //


 
Skier ©   (2003-05-30 09:51) [9]

>anod © (30.05.03 09:40)
ОК. Тогда так : как создаешь экземпляр класса TMyTrackBar ? Код.


 
anod ©   (2003-05-30 10:08) [10]

2Skier
Намек понял - заработало.

Может подскажите как мне onMouseMove отследить


 
LexusR ©   (2003-05-30 10:11) [11]

у тебя же параметр конструктора Handle а не форма
я ж написал как вызывать нуно

procedure TForm1.Button1Click(Sender: TObject);
begin
TB:= TMyTrackBar.Create(Form1.Handle);
end;



 
LexusR ©   (2003-05-30 10:14) [12]

и надеюсь

var
TB : TMyTrackBar

декларирована в форме а то мало-ли :)))))


 
anod ©   (2003-05-30 10:17) [13]

2LexusR

Ну вообщем все заработала, я напутал немного и все.


 
Skier ©   (2003-05-30 10:19) [14]

>anod © (30.05.03 10:08)
Сомневаюсь что экземпляры класса TMyTrackBar = class( TObject) будут получать
мышиные сообщения. Лучше наследуй свой класс от TControl
и уже в своём наследнике TControl-а перекрой MouseMove.


 
anod ©   (2003-05-30 10:28) [15]

2Skier
А как мне быть с AOwner, если у меня в проекте нет форм (на Вин32) Что там присваивать, и будет ли вообще работат?
Если нет, как можно самому onMouseMove написать?


 
Skier ©   (2003-05-30 10:33) [16]

>anod
Oops. Просмотрел. "Чтобы в программу на ВинАпи встроить"
Отменяется...

Как ты думаешь Windows знает что-нибудь о классах Delphi ?


 
Anatoly Podgoretsky ©   (2003-05-30 10:39) [17]

Ну и теперь все объявления переменной Form1


 
anod ©   (2003-05-30 10:44) [18]

2Skier

Ну к программе можно подключить классы.
секция юзес для этого подходит


 
Skier ©   (2003-05-30 10:48) [19]

>anod © (30.05.03 10:44)
Ну если ты настаиваешь, тогда продолжим...:)

> А как мне быть с AOwner, если у меня в проекте нет форм
> (на Вин32)

А где же тогда твой компонент будет отображаться...
А если он невизуальный то зачем ему мышиные сообщения ?


 
anod ©   (2003-05-30 10:51) [20]

2Skier

1. Поэтому я передаю хэндл
2. >Если нет, как можно самому onMouseMove написать?


 
Skier ©   (2003-05-30 10:57) [21]

>anod © (30.05.03 10:51)
Ага...Уловил...
1) FindControl(хэндл)
2) Подменяешь у найденного окна оконную процедуру (см. тип
TWndMethod) и уже в ней пишешь свою обработку сообщения
3) Можно ещё делать через Hook (про Hook-и есть статья Алексея
Павлова на этом сайте )


 
anod ©   (2003-05-30 11:06) [22]

Skier
Ага..ПО-моему и я уловил...
Т.е., т.к. программа на ВинАпи и при создании контролла Я передаю Хэндл окна, то мне нужно просто обрабатывать сообщение WM_MOUSEMOVE?
Но, тут ещё один вопрос - если я создаю класс - я подключаю модул дельфи, а как это реализовать без модулей, или без класса. Может модно создать дочернее оконо и переназначить ему оконную процедуру?


 
Skier ©   (2003-05-30 11:17) [23]

>anod © (30.05.03 11:06)

> Может модно создать дочернее оконо и переназначить ему оконную
> процедуру?

Дочернее по отношению к чему ?


 
anod ©   (2003-05-30 11:22) [24]

по отношеню к главному окну. Ну как кнопка - окно.
Только какой класс ставить в CreateWindow и какие флаги?


 
Skier ©   (2003-05-30 11:27) [25]

>anod © (30.05.03 11:22)
Изучай : http://www.wasm.ru/publist.php?list=1


 
anod ©   (2003-05-30 11:29) [26]

2SKIER
Iczelion - это сила, пасибо что напомнил


 
Skier ©   (2003-05-30 11:35) [27]

>anod © (30.05.03 11:29)
:))) Но лучше просто читать Help, там много чего полезного...



Страницы: 1 вся ветка

Текущий архив: 2003.06.09;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.02 c
1-26489
Zelius
2003-05-27 15:05
2003.06.09
Как отлавливать ВСЕ Exceptionы программы с помощью JclDebug?


8-26622
SDS
2003-02-21 14:27
2003.06.09
Как уменьшить размер TBitmap


14-26703
Caesar
2003-05-21 16:30
2003.06.09
Отчет без принтера


1-26584
baracuda
2003-05-28 15:06
2003.06.09
запись в файл


1-26467
Andryushka
2003-05-27 17:01
2003.06.09
Надо сделать CRC32 любого файла равной 0