![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Незнаю как назвать. (Заполнение свойства при создании объекта)
RASkov © (2006-10-04 00:35:00)Есть такое вот дело (код компанента):
TArrRect: array of TRect;
....
-----------
ArrRect: TArrRect;
....
published
property MCount: Integer read GetMCount;
property SList: TStrings read FSList write SetSList;
constructor T<name>.Create(...);
begin
SList := TStringList.Create;
...
end;
function T<name>.GetMCount: Integer;
begin
Result:=SList.Count;
end;
procedure T<name>.SetRect;
begin
SetLength(ArrRect, MCount); //MCount=0 ????
for N := 0 to MCount-1 do...
end;
procedure T<name>.SetSList(const Value: TStrings);
begin
SList.Assign(Value);
// SetLength(ArrRect, SList.Count);
SetRect;
end;
procedure T<name>.Paint;
begin
Canvas.TextOut(10, 10, IntToStr(MCount)+' - '+IntToStr(Length(ArrRect)));
end;
Такая вот конструкция неправильна.
Вопрос: как при создании экземпляра T<name> заполнить поле ArrRectпри условии, что поле SList заполняется в инспекторе объектов?
при выполнении Paint рисует 5 - 0 ????(аргентина-ямайка, блин) - в SList - 5 строк....
ЗЫ SetLength в SetSList проблему не решает.
ЗЫЫ Если нужно, могу привести полное описание T<name>
Zeqfreed (2006-10-06 22:48:00) [21][23] не пробовал?
RASkov (2006-10-06 22:41:00) [22]> [25] Percent (06.10.06 22:12)
Они выставляются в 0 (ноль) пробовал и так
FStartHeight := Height;
и так
StartHeight := Height;
> [26] Zeqfreed © (06.10.06 22:23)
Да вот не хотелось бы по умолчанию, а хотелось бы после того как
Align := alClient;
"Расплылся" по контейнеру и тут узнать его новые Width и Height и прировнять их StartWidth и StartHeight. Нельзя ли как отловить эти изменения в конструкторе, ведь вызываются же SetAlign у предка т.е. у TControl'a и его FWidth принимает новое значение.... Ух запутался уже.
Zeqfreed (2006-10-06 22:23:00) [23]> [25] Percent (06.10.06 22:12)
Угу и как не устанавливать StartHeight в инспекторе св-в, при запуске программы оно будет устанавливаться равным обычному Height. В этом и есть проблема автора. Здесь надо использовать значения св-в по умолчанию, мне кажется.
Percent (2006-10-06 22:12:00) [24]как сделать так, что бы, когда кидаем на форму компанент то в инспекторе - свойства Height и Width продублировались(скопировались) в StartHeight и StartWidth соответственно?
constructor TPicMenus.Create(AOwner: TComponent);
begin
inherited;
FBitmap := TBitmap.Create;
Align := alClient;
FStartHeight := Height;
FStartWidth := Width;
end;
И нечего городить огород...
Zeqfreed (2006-10-06 21:40:00) [25]Или просто установить default значения для свойств.
Zeqfreed (2006-10-06 21:25:00) [26]if csDesigning in ComponentState then кажется должно помочь.
RASkov (2006-10-06 21:15:00) [27]Блин, вот сюда же о том же...
Мне очень помогло:
procedure Loaded;
Здесь я все понял и сделал - немного другой вопрос но все о том же...
вот куски кода паблишед свойств и конструктор компанента - вопрос ниже:
published
....
property Height stored False;
property StartWidth: Integer read FStartWidth write SetStartWidth;
property StartHeight: Integer read FStartHeight write SetStartHeight;
property Picture: TBitMap read FBitmap write SetBitmap;
property Width stored False;
....
end;
Конструктор
constructor TPicMenus.Create(AOwner: TComponent);
begin
inherited;
FBitmap:=TBitmap.Create;
Align:=alClient;
//FStartHeight:=Height;
//FStartWidth:=Self.Width;
end;
Вот вопрос, извеняюсь если до ужоса глупый и простое решение, как сделать так, что бы, когда кидаем на форму компанент то в инспекторе - свойства Height и Width продублировались(скопировались) в StartHeight и StartWidth соответственно? Далее эти свойства могут менятся независимо от ширины и высоты, например в SetBitmap они могут установится в высоту и ширину рисунка, но это уже не суть. Нужно именно когда кидаем в дизайнтайме на форму или на еще какой контейнер. А то они в ноль устанавливаются а вручки придумывать/устанавливать в конструкторе от балды не то.
ЗЫ пробовал в Loaded и Notification не то получается или не так делал:(
срабатывает как то не сразу... Спасибо.
RASkov (2006-10-04 02:28:00) [28]> [17] Percent (04.10.06 01:54)
А про это то я знал... ну чето даже и не подумал о них.... всетаки компанент...новый... в конструкторе создается поле (ну и что, что класс)...Ух... А вот про Loaded забыл да еще и незнал:)
RASkov (2006-10-04 02:24:00) [29]> [19] sniknik © (04.10.06 01:58)
Извеняюсь... Усе понял... Спасибо..
> [17] Percent (04.10.06 01:54)
Очень и очень в тему Loaded; (не знал про него - см[13]) уже сделал - то что надо. Спасибо.
sniknik (2006-10-04 01:58:00) [30]> Так здесь по моему все просто...
именно. и это именно то, что ты (имхо) пытаешся повторить в своем компаненте. для того там у тебя и присутствует массив рекордов и попытка совместить размеры, чтобы сделать аналог. (т.е. велосипед)
> Ну т.е. в [12] ничего нового/полезного для моего конкретного случая. Сорри.
ну, значит мощьность телепатора уже не та... сорри.
Percent (2006-10-04 01:55:00) [31]RASkov (04.10.06 01:48) [16]
> [15] RASkov (04.10.06 01:48)
образно/утрировано...
Это если очень образно...
Percent (2006-10-04 01:54:00) [32]См. также
TStringList.OnChange()
TStringList.OnChanging()
RASkov (2006-10-04 01:48:00) [33]> [15] RASkov (04.10.06 01:48)
образно/утрировано...
RASkov (2006-10-04 01:48:00) [34]Или, если я правильно понял, БуттонКлик - это и есть procedure Loaded; override;
RASkov (2006-10-04 01:46:00) [35]> [12] sniknik © (04.10.06 01:32)
Так здесь по моему все просто... инициализация по кнопке. У меня в конструкторе моего компанентасоздается StringList и следом нужно заполнить массив в зависимости от кол-ва введенных строк в инспекторе в дизайнтайме. Ну т.е. в [12] ничего нового/полезного для моего конкретного случая. Сорри.
RASkov (2006-10-04 01:40:00) [36]> [11] Zeqfreed © (04.10.06 01:31)
Ничё бывает, бывает и хуже.
Это я просто первый свой компанет делаю (никогда в жизни их не писал). Кстати полезная вещь - писать компаненты - стока многова и полезнова про сам язык узнаешь:) ну от сюда такие вот глупые вопросы, к сожалению.
Спасибо Вам, всем кто помогает в таких случаях, а не издевается:) типа про метлы:).
sniknik (2006-10-04 01:32:00) [37]> Если есть какие варианты подругому - пожалуйста - я весь внимание.
внимай! (если телепатор не подвел ;)
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
ts: TStringList;
public
end;
PRect = ^TRect;
TRect = record
x,y: integer;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
ts:= TStringList.Create;
Randomize;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
i: integer;
begin
for i:= 0 to ts.Count-1 do
Dispose(PRect(ts.Objects[i]));
ts.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Rect: PRect;
i: integer;
begin
for i:= 0 to 10 do begin
New(Rect);
Rect.x:= i*10+Random(20);
Rect.y:= i*15+Random(20);
ts.AddObject(InttoStr(i), Pointer(Rect));
end;
Refresh;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
i: integer;
begin
for i:= 0 to ts.Count-1 do
if i=0 then Canvas.MoveTo(PRect(ts.Objects[i]).x, PRect(ts.Objects[i]).y)
else Canvas.LineTo(PRect(ts.Objects[i]).x, PRect(ts.Objects[i]).y)
end;
end.
думаю все ясно из кода и его работы.
Zeqfreed (2006-10-04 01:31:00) [38]Как-то плохо на меня институт влияет. Буйный стал :(
RASkov (2006-10-04 01:31:00) [39]> [9] Zeqfreed © (04.10.06 01:30)
Initializes the component after the form file has been read into memory.
Вроде понял.:)
Спасибо
Zeqfreed (2006-10-04 01:30:00) [40]> [7] RASkov (04.10.06 01:29)
Тебе уже сказали, переопредели поведение компонента в методе Loaded.