Форум: "Основная";
Текущий архив: 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.011 c