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

Вниз

Как изменить свойства формы из своего невизуального компонента   Найти похожие ветки 

 
Мыш   (2003-04-18 17:25) [0]

Компонент кидаю на форму, сделал его на основе tcomponent, код очень простой, он просто по создаваемому таймеру изменяет цвет, вид формы и т.д - тренируюсь.

Как добраться до свойств формы, на которую я кинул свой компонент?
Пробовал так:
1. в конструкторе
tform(aowner).Caption:="asdf";


2 в private:
ftm:^tcomponent;
, в конструкторе:
ftm:=@aowner;

дальше правда не знаю, что с этим указателем делать

3.в private:
function GetForm: TForm;
property Form: TForm read GetForm;


далее в implementation:


function TFormPos.GetForm: TForm;
begin
if Owner is TCustomForm then Result := TForm(Owner as TCustomForm)
else Result := nil;
end;



далее в любой процедуре:
GetForm.Caption:="asfdd";


Везде выдает access violation


 
MBo   (2003-04-18 17:28) [1]

1) ^ и @ не надо.
2) не Owner, а Parent
3) читай много книжек и хелп


 
Игорь Шевченко   (2003-04-18 17:28) [2]

ValidParentForm (AControl : TControl) : TCustomForm


 
MBo   (2003-04-18 17:30) [3]

пардон, мой второй пункт неверен - компонент-то невизуальный


 
Skier   (2003-04-18 17:34) [4]

>Мыш
override пишешь для своего конструктора ?


 
мыш   (2003-04-18 17:43) [5]

Пишу override. Хелп читал, исходники читал, как водится ничего не понял :) Ну я не совсем тупой, просто я понял что такое класс пару дней назад, когда взял себя в руки и прочел от Tobject до Tform всю иерархию. А компонент уже сделал! А неработает только один момент - обидно, а хочется все и сразу :)

Вот например непонятно, почему функция
function TFormPos.GetForm: TForm;
begin
if Owner is TCustomForm then Result := TForm(Owner as TCustomForm)
else Result := nil;
end;
не дает правильной ссылки на форму предка, чтобы писать getform.widht:=... ведь я украл это из rxlib, а там работает такой способ.


 
мыш   (2003-04-18 17:46) [6]

2Игорь Шевченко : а кого мне в параметре передать? Я же не знаю, как конкретный экземпляр компонента будет называться.


 
Skier   (2003-04-18 17:48) [7]

>мыш
Код компонента в студию !


 
мыш   (2003-04-18 18:10) [8]

unit FormPos;

interface

uses
Windows, Messages, SysUtils, Classes,QExtCtrls,forms,QForms,
Variants, Controls,
Dialogs, ExtCtrls, StdCtrls;

type TFormPosition=(fpLeft,fpRight,fpTop,fpBottom,fpCenter);


type
TFormPos = class(TComponent)
private

TimCheckMouse:TTimer;
FInfoPanel:Tpanel;

FormPosition:TFormPosition;
AllowMoveMessage:boolean;

FActive:boolean;
FFormWidth:integer;
FMyOwner:string;

function GetForm: Tcustomform;
function SetGetFormWidth:integer;
function GetMyOwner:string;

{ Private declarations }
protected
procedure TimCheckMouseTimer(sender :tobject);
procedure SetFormPos(aFormPos:TformPosition);
procedure wmmove(var mess:twmmove); message wm_move ;

property Form: Tcustomform read GetForm;

{ Protected declarations }
public
constructor create (Aowner:Tcomponent);override;
{ Public declarations }
published
property IsActive: Boolean read Factive write FActive default true;
property FormWidth: integer read SetGetFormWidth;
property MyOwner: string read GetMyOwner;
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents("Additional", [TFormPos]);
end;

{ TFormPos }

constructor TFormPos.create(Aowner: Tcomponent);
begin
inherited Create(AOwner);

//tform(aowner).Caption:="asdf";

TimCheckMouse:=TTimer.Create(self);
TimCheckMouse.Interval:=100;
TimCheckMouse.OnTimer:=TimCheckMouseTimer;
end;

function TFormPos.GetForm: Tcustomform;
begin
if Owner is TForm then Result := TCustomForm(Owner)
else Result := nil;
end;


procedure TFormPos.wmmove(var mess: twmmove);
begin
inherited;
if not AllowMoveMessage then
begin
AllowMoveMessage:=true;
exit;
end;
FormPosition:=fpcenter;
if mess.XPos<16 then FormPosition:=fpLeft;
if mess.XPos+GetForm.width>screen.Width-16 then FormPosition:=fpRight;
if mess.YPos<32 then FormPosition:=fpTop;
if mess.YPos+GetForm.height>screen.Height-32 then FormPosition:=fpBottom;
SetFormPos(FormPosition);
//GetForm.caption:="mv"+floattostr(mess.XPos)+" "+floattostr(mess.yPos) ;
end;

procedure TFormPos.SetFormPos(aFormPos:TFormPosition);
begin

case aFormPos of
fpLeft:
begin
GetForm.Left:=0;
end;
fpRight:
begin
GetForm.Left:=screen.Width-GetForm.width;
end;
fpTop:
begin
GetForm.Top:=0;
end;
fpBottom:
begin
GetForm.top:=screen.Height-GetForm.height;
end;
end;
end;

procedure TFormPos.TimCheckMouseTimer(sender: tobject);
var
x,y:integer;
begin
if not IsActive then exit;
x:=mouse.CursorPos.X;
Y:=mouse.CursorPos.Y;

if x<32 then setformpos(fpleft);
if x<screen.Width-getform.Width-32 then setformpos(fpright);
if y<32 then setformpos(fptop);
if y>screen.Height-getform.Height-32 then setformpos(fpbottom);

end;


function TFormPos.SetGetFormWidth: integer;
begin
result:=twincontrol(owner).Width ;
end;

function TFormPos.GetMyOwner: string;
begin
result:= (owner as tpersistent).GetNamePath
end;



end.




 
Skier   (2003-04-18 18:16) [9]

Вот это подозрительно !
procedure wmmove(var mess:twmmove); message wm_move ;
Зачем оно ?!


 
мыш   (2003-04-18 18:17) [10]

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


 
Мыш   (2003-04-19 12:10) [11]

^
|
|


 
Юрий Зотов   (2003-04-19 12:49) [12]

> procedure wmmove(var mess:twmmove); message wm_move ;
> чтобы зафиксировать перемещение формы и сразу сделать изменения

Это каким же образом Ваш компонент получит такое сообщение? И от кого?

Как Вы сами говорите, лишь пару дней назад Вы поняли, что такое класс (кстати, Вы точно в этом уверены?) и прочли иерархию VCL вплоть до TForm. А вот ПОЧЕМУ эта иерархия построена именно так, а не иначе, каковы СУТЬ и НАЗНАЧЕНИЕ каждого класса в ней, КАК эти классы взаимодействуют с Windows - это Вы тоже поняли?

Боюсь, что нет. Иначе в Вашем компоненте не появился бы метод, который никогда никем не вызовется. А раз так - то не рановато ли Вы взялись писать компоненты?

Дело в том, что, не поняв хотя бы той АЗБУКИ (!!!), о которой я сказал выше, о написании компонентов нечего даже и думать. Несерьезно это.

Постарайтесь найти книгу Конопки. Прочитав и ПОНЯВ ее, Вы будете долго смеяться над этим Вашим первым "компонентом".


 
мыш   (2003-04-19 14:10) [13]

Насчет wm_move я уже понял, что это была ошибка, ведь это сообщение получают только окна.
Класс - это, такое сборище свойств и процедур обработки их и других данных. Tobject-базовый класс, который отвечает за распределение памяти, выделение ее для вновь создаваемого экземпляра, освобождение и другие основные вещи. Каждый новый класс должен строится на уже существующем, чтобы не писать то, что уже написано програмерами борланда. Каждый класс получает от виндовса свои сообщения, например только окна получают mousedown и т.д., обрабатывают эти сообщения. Можно переопределить обработку сообщений и процедур класса-предка.
Вот вкратце все, что я знаю. Вы по-прежнему думаете, что мне рано писать компонент?
Кстати, я считаю, что ничего никогда не рано, если есть желание, по-любому впрок пойдет. Вот например я никогда не полез бы в эти классы в хелп, если бы не был таким амбициозным и не начал компонент писать.
А книжку я купить себе позволить не могу... :( Но спасибо за совет по автору.


 
vuk   (2003-04-19 14:27) [14]

to мыш:
Если уж Ваш компонент работает только имея наследника TCustomForm в качестве владельца, то почему бы не запретить ему "жить" где-то еще кроме формы? Делается просто:
Шаг 1. Проверка в конструкторе. Если владелец неподходящий - exception.
Шаг 2. Переопределение ValidateContainer. Если контейнер неподходящий - exception.

Тогда не будут нужны проверки типа каждый раз, когда нужна форма.


 
Юрий Зотов   (2003-04-19 14:59) [15]

> Каждый класс получает от виндовса свои сообщения

Нет. Сообщения от Windows получают ТОЛЬКО окна. И все. Больше НИ ОДИН класс VCL никаких сообщений от Windows не получает. Уже хотя бы потому, что Windows ни о какой VCL и ни о каких ее классах не имеет ни малейшего понятия. Даже и о потомках TWinControl. Она знает ТОЛЬКО сами окна, но не инкапсулирующие их объекты VCL. Тем более, она не знает всего остального.

Другое дело, что в VCL существует внутренняя трансляция сообщений (методы Dispatch, Perform и пр.) - но это уже именно ТРАНСЛЯЦИЯ , а не прямое получение сообщений от СИСТЕМЫ .


> Вы по-прежнему думаете, что мне рано писать компонент

В VCL есть такая иерархическая подцепочка:


TObject
TPersistent
TComponent
TControl
TWinControl
TCustomControl
TGraphicControl


Ответьте самому себе на следующие вопросы:

- для чего нужен КАЖДЫЙ из этих классов, в чем его СУТЬ и за что КОНКРЕТНО он отвечает;

- какие в нем появляются ГЛАВНЫЕ свойства, методы и события, и почему они появляются ИМЕННО в нем;

- какие из этих новых методов являются статическими, какие - динамическими, какие - виртуальными, какие - абстрактными, а какие - классовыми и ПОЧЕМУ ;

- какие из этих новых свойств (и событий) объявлены в секции protected, какие - в public, а какие - в published (и ПОЧЕМУ );

- какие из этих классов имеют соответствующий метакласс и ЗАЧЕМ этот метакласс нужен;

- от КОГО и КАК может получать сообщения КАЖДЫЙ из этих классов, ГДЕ он их может обрабатывать и ЗАЧЕМ они ему нужны.

Так вот: как только сможете ответить на эти вопросы с полным пониманием их сути и НИКУДА НЕ ЗАГЛЯДЫВАЯ - так значит, Вы готовы начинать писать НОРМАЛЬНЫЕ компоненты (а не поделки, над которыми можно или плакать, или смеяться, но больше ничего с ними делать нельзя).

Потому что для НОРМАЛЬНОГО Component Writer"а все эти вопросы - это только еще АЗБУКА . Необходимый минимум. А остальное придет с опытом.



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

Форум: "Основная";
Текущий архив: 2003.05.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.008 c
14-720
JibSkeart
2003-04-13 14:10
2003.05.01
Кошмар что вчера за день был у нас ! :о)


1-569
ctapik
2003-04-17 19:01
2003.05.01
Ка это побороть?


6-656
Novichek
2003-03-06 15:20
2003.05.01
TWebBrowser - запрет открытия нового окна по гипперссылке


4-848
neodiX
2003-03-04 15:52
2003.05.01
BitBlt - иногда при копировании экрана в бмп получается


7-796
olimpic
2003-03-12 13:12
2003.05.01
Компонент для сбора информации о компьютере





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский