主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档: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;
开始
if Owner is TCustomForm then Result := TForm(Owner as TCustomForm)
else Result := nil;
结束;



далее в любой процедуре:
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]

>鼠标
覆盖 пишешь для своего конструктора ?



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

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

Вот например непонятно, почему функция
function TFormPos.GetForm: TForm;
开始
if Owner is TCustomForm then Result := TForm(Owner as TCustomForm)
else Result := nil;
结束;
не дает правильной ссылки на форму предка, чтобы писать 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;

接口

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

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


类型
TFormPos = class(TComponent)
私立

TimCheckMouse:TTimer;
FInfoPanel:Tpanel;

FormPosition:TFormPosition;
AllowMoveMessage:boolean;

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

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

{私人声明}
保护
procedure TimCheckMouseTimer(sender :tobject);
procedure SetFormPos(aFormPos:TformPosition);
procedure wmmove(var mess:twmmove); message wm_move ;

property Form: Tcustomform read GetForm;

{受保护的声明}
公开
constructor create (Aowner:Tcomponent);override;
{公开声明}
出版
property IsActive: Boolean read Factive write FActive default true;
property FormWidth: integer read SetGetFormWidth;
property MyOwner: string read GetMyOwner;
{已发布的声明}
结束;

程序登记;

履行

程序登记;
开始
RegisterComponents("Additional", [TFormPos]);
结束;

{ TFormPos }

constructor TFormPos.create(Aowner: Tcomponent);
开始
继承Create(AOwner);

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

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

function TFormPos.GetForm: Tcustomform;
开始
if Owner is TForm then Result := TCustomForm(Owner)
否则结果:= nil;
结束;


procedure TFormPos.wmmove(var mess: twmmove);
开始
继承;
if not AllowMoveMessage then
开始
AllowMoveMessage:=true;
出口;
结束;
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) ;
结束;

procedure TFormPos.SetFormPos(aFormPos:TFormPosition);
开始

case aFormPos of
fpLeft:
开始
GetForm.Left:=0;
结束;
fpRight:
开始
GetForm.Left:=screen.Width-GetForm.width;
结束;
fpTop:
开始
GetForm.Top:=0;
结束;
fpBottom:
开始
GetForm.top:=screen.Height-GetForm.height;
结束;
结束;
结束;

procedure TFormPos.TimCheckMouseTimer(sender: tobject);
VAR
x,y:整数;
开始
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);

结束;


function TFormPos.SetGetFormWidth: integer;
开始
result:=twincontrol(owner).Width ;
结束;

function TFormPos.GetMyOwner: string;
开始
result:= (owner as tpersistent).GetNamePath
结束;



结束。





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. А вот WHY эта иерархия построена именно так, а не иначе, каковы ESSENCE и 任命 каждого класса в ней, 如何 эти классы взаимодействуют с 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 得到 ONLY окна. И все. Больше 没有人 класс VCL никаких сообщений от Windows не получает. Уже хотя бы потому, что Windows ни о какой VCL и ни о каких ее классах не имеет ни малейшего понятия. Даже и о потомках TWinControl. Она знает ONLY сами окна, но не инкапсулирующие их объекты VCL. Тем более, она не знает всего остального.

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


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

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


TObject
TPersistent
TComponent
TControl
TWinControl
TCustomControl
TGraphicControl


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

- для чего нужен EVERY из этих классов, в чем его ESSENCE 为了什么 КОНКРЕТНО он отвечает;

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

- какие из этих новых методов являются статическими, какие - динамическими, какие - виртуальными, какие - абстрактными, а какие - классовыми и WHY ;

- какие из этих новых свойств (и событий) объявлены в секции protected, какие - в public, а какие - в published (и WHY );

- какие из этих классов имеют соответствующий метакласс и WHY этот метакласс нужен;

- 从 WHO и 如何 может получать сообщения EVERY из этих классов, 如何 он их может обрабатывать и WHY они ему нужны.

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

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



Страницы: 1 整个分支

论坛:“主要”;
当前存档:2003.05.01;
下载:[xml.tar.bz2];

楼上









内存:0.64 MB
时间:0.045 c
1-570
BBCHa
2003-04-18 11:33
2003.05.01
来自dll的调用不起作用


1-612
DeMoNitUs
2003-04-19 00:30
2003.05.01
如何在exe shnik中编写/加载? 串羊


4-826
KVA
2003-03-03 16:45
2003.05.01
在表单系统菜单中的透明背景图片


1-589
anbezr
2003-04-18 15:04
2003.05.01
形成一个组件


6-668
Blacki
2003-03-06 00:26
2003.05.01
FTP问题





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本性玩偶 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский