Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
4-26847
Severen
2003-04-07 16:21
2003.06.09
Как убрать программу из ctrl+alt+del в WinXP?


1-26523
Raduga
2003-05-27 13:31
2003.06.09
Как работает таймер


1-26539
KA-87
2003-05-27 23:40
2003.06.09
Как получить хандл кнопки...


8-26612
_Alex
2003-02-27 03:24
2003.06.09
Работа с графикой


1-26545
OlegM
2003-05-28 09:36
2003.06.09
Про фришты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский