Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
ВнизНезнаю как назвать. (Заполнение свойства при создании объекта) Найти похожие ветки
← →
RASkov (2006-10-04 00:35) [0]Есть такое вот дело (код компанента):
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-04 00:48) [1]Елки-палки. Если не получается сформулировать мысль по-человечески с первого раза, то лучше подумать и переписать, а не постить свои потоки мыслей в форум.
← →
ProgRAMmer Dimonych (2006-10-04 01:00) [2]Чё вообще приблизительно должен делать компонент, если не секрет?
← →
sniknik © (2006-10-04 01:09) [3]> Чё вообще приблизительно должен делать компонент, если не секрет?
ездить! как и обычный велосипед, только у этого будут квадратные колеса....
← →
ProgRAMmer Dimonych (2006-10-04 01:13) [4]> [3]
:)
← →
Percent (2006-10-04 01:15) [5]как при создании экземпляра T<name> заполнить поле ArrRect при условии, что поле SList заполняется в инспекторе объектов?
procedure Loaded; override; - в ней и заполняй ArrRect.
← →
RASkov (2006-10-04 01:25) [6]Кинули на форму компанент, в инспекторе объектов заполнили поле SList. нажали F9....
При создании компанента нужно заполнить массив ArrRect в зависимости от того сколько строк в SList"е. В дизайнтайме при разработке этого компанента все работает нормально, а вот когда он создается в рунтайм где SList заполняется из ресурса - здесь косяк....:(
> [5] Percent (04.10.06 01:15)
Мне необходимо после создания СРАЗУ в ArrRect иметь данные... Код я привел - это как я пытаюсь сделать, что ниесть правильный. Если есть какие варианты подругому - пожалуйста - я весь внимание.
непонял про
procedure Loaded; override; - в ней и заполняй ArrRect.
????
← →
RASkov (2006-10-04 01:29) [7]В SList список строк - нужно при инициализации компанента в зависимости от кол-ва строк задать длинну массива=кол-ву строк в SList и пробежаться по этому массиву...:( ну как еще объяснить? подскажите.
← →
Zeqfreed © (2006-10-04 01:29) [8]> [6] RASkov (04.10.06 01:25)
> непонял про
> procedure Loaded; override; - в ней и заполняй ArrRect.
LOL! Нет, даже ROFL! Если ты не понял именно про это преложение, тогда на что ты отвечал вот этим:
> Мне необходимо после создания СРАЗУ в ArrRect иметь данные...
> Код я привел - это как я пытаюсь сделать, что ниесть правильный.
> Если есть какие варианты подругому - пожалуйста - я весь
> внимание.
?!
← →
Zeqfreed © (2006-10-04 01:30) [9]> [7] RASkov (04.10.06 01:29)
Тебе уже сказали, переопредели поведение компонента в методе Loaded.
← →
RASkov (2006-10-04 01:31) [10]> [9] Zeqfreed © (04.10.06 01:30)
Initializes the component after the form file has been read into memory.
Вроде понял.:)
Спасибо
← →
Zeqfreed © (2006-10-04 01:31) [11]Как-то плохо на меня институт влияет. Буйный стал :(
← →
sniknik © (2006-10-04 01:32) [12]> Если есть какие варианты подругому - пожалуйста - я весь внимание.
внимай! (если телепатор не подвел ;)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.
думаю все ясно из кода и его работы.
← →
RASkov (2006-10-04 01:40) [13]> [11] Zeqfreed © (04.10.06 01:31)
Ничё бывает, бывает и хуже.
Это я просто первый свой компанет делаю (никогда в жизни их не писал). Кстати полезная вещь - писать компаненты - стока многова и полезнова про сам язык узнаешь:) ну от сюда такие вот глупые вопросы, к сожалению.
Спасибо Вам, всем кто помогает в таких случаях, а не издевается:) типа про метлы:).
← →
RASkov (2006-10-04 01:46) [14]> [12] sniknik © (04.10.06 01:32)
Так здесь по моему все просто... инициализация по кнопке. У меня в конструкторе моего компанента создается StringList и следом нужно заполнить массив в зависимости от кол-ва введенных строк в инспекторе в дизайнтайме. Ну т.е. в [12] ничего нового/полезного для моего конкретного случая. Сорри.
← →
RASkov (2006-10-04 01:48) [15]Или, если я правильно понял, БуттонКлик - это и есть procedure Loaded; override;
← →
RASkov (2006-10-04 01:48) [16]> [15] RASkov (04.10.06 01:48)
образно/утрировано...
← →
Percent (2006-10-04 01:54) [17]См. также
TStringList.OnChange()
TStringList.OnChanging()
← →
Percent (2006-10-04 01:55) [18]RASkov (04.10.06 01:48) [16]
> [15] RASkov (04.10.06 01:48)
образно/утрировано...
Это если очень образно...
← →
sniknik © (2006-10-04 01:58) [19]> Так здесь по моему все просто...
именно. и это именно то, что ты (имхо) пытаешся повторить в своем компаненте. для того там у тебя и присутствует массив рекордов и попытка совместить размеры, чтобы сделать аналог. (т.е. велосипед)
> Ну т.е. в [12] ничего нового/полезного для моего конкретного случая. Сорри.
ну, значит мощьность телепатора уже не та... сорри.
← →
RASkov (2006-10-04 02:24) [20]> [19] sniknik © (04.10.06 01:58)
Извеняюсь... Усе понял... Спасибо..
> [17] Percent (04.10.06 01:54)
Очень и очень в тему Loaded; (не знал про него - см[13]) уже сделал - то что надо. Спасибо.
← →
RASkov (2006-10-04 02:28) [21]> [17] Percent (04.10.06 01:54)
А про это то я знал... ну чето даже и не подумал о них.... всетаки компанент...новый... в конструкторе создается поле (ну и что, что класс)...Ух... А вот про Loaded забыл да еще и незнал:)
← →
RASkov (2006-10-06 21:15) [22]Блин, вот сюда же о том же...
Мне очень помогло: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 не то получается или не так делал:(
срабатывает как то не сразу... Спасибо.
← →
Zeqfreed © (2006-10-06 21:25) [23]if csDesigning in ComponentState then кажется должно помочь.
← →
Zeqfreed © (2006-10-06 21:40) [24]Или просто установить default значения для свойств.
← →
Percent (2006-10-06 22:12) [25]как сделать так, что бы, когда кидаем на форму компанент то в инспекторе - свойства 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 22:23) [26]> [25] Percent (06.10.06 22:12)
Угу и как не устанавливать StartHeight в инспекторе св-в, при запуске программы оно будет устанавливаться равным обычному Height. В этом и есть проблема автора. Здесь надо использовать значения св-в по умолчанию, мне кажется.
← →
RASkov (2006-10-06 22:41) [27]> [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:48) [28][23] не пробовал?
← →
RASkov (2006-10-06 22:50) [29]> [25] Percent (06.10.06 22:12)
Можно конечно и так:FMenuStartWidth:=TControl(AOwner).Width;
но тоже по моему не правильно, т.к. AOwner: TComponent да и размеры получаются разные - после кидания на форму у моего компанента в инспекторе
(например)Width - 463 а StartWidth чуть больше - 471.
← →
RASkov (2006-10-06 22:51) [30]> [28] Zeqfreed © (06.10.06 22:48)
Нет а куда это в Create Loaded или Notifycation?
← →
RASkov (2006-10-06 22:52) [31]> [28] Zeqfreed © (06.10.06 22:48)
И что then?
← →
Zeqfreed © (2006-10-06 22:53) [32]> [31] RASkov (06.10.06 22:52)
then читать справку.
← →
RASkov (2006-10-06 22:55) [33]> [32] Zeqfreed © (06.10.06 22:53)
if csDesigning in ComponentState then читать справку.
:()
Серьезно куда можно это
if csDesigning in ComponentState then FStartWidth := Width;
← →
RASkov (2006-10-06 22:56) [34]> [32] Zeqfreed © (06.10.06 22:53)
По моему это не поможет но сейчас попробую все три варианта т.е.
в Create
в Loaded
в Notifycation....
← →
RASkov (2006-10-06 23:07) [35]в Create никакого результата
в Loaded только после того как сделаешь View as Text и назад (View as Form)
в Notifycation только после кидания другого компанента на форму.procedure T<Class>.Loaded;
var N: Integer;
begin
inherited;
....
// if csDesigning in ComponentState then FMenuStartWidth := Width;
end;
procedure T<Class>.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
// if(AComponent=Self)and(Operation=opInsert)then begin
// FStartWidth:=Width;
// FStartHeight:=Height;
// end;
if csDesigning in ComponentState then FStartWidth := Width;
end;
Комментировал в момент проверок по разному.
Результат 0 :( ну наверное "нельзя" хотя я неверю просто не могу добиться...
← →
Percent (2006-10-06 23:25) [36]Они выставляются в 0 (ноль) пробовал и так
FStartHeight := Height;
и так
StartHeight := Height;constructor TPicMenus.Create(AOwner: TComponent);
begin
inherited;
FBitmap := TBitmap.Create;
Align := alClient;
SetBounds(0, 0, 200, 200);
FStartHeight := Height;
FStartWidth := Width;
end;
Угу и как не устанавливать StartHeight в инспекторе св-в, при запуске программы оно будет устанавливаться равным обычному Height
Это еще почему это?
← →
RASkov (2006-10-06 23:25) [37]Похоже больше вариантов нет...?
← →
Zeqfreed © (2006-10-06 23:27) [38]> Это еще почему это?
Вот из-за этой строчки наверное:
> FStartHeight := Height;
> [37] RASkov (06.10.06 23:25)
> Похоже больше вариантов нет...?
Мозг не работает. Я бы попробовал, но мне лень регистрировать компонент, чтобы он появился в палитре.
← →
RASkov (2006-10-06 23:28) [39]> [36] Percent (06.10.06 23:25)
Так это можно и просто
FStartWidth:=200;
FStartHeight:=200;
Что не хотелось бы...
← →
RASkov (2006-10-06 23:29) [40]> Я бы попробовал, но мне лень регистрировать компонент
Что именно?.... Я попробую он у меня уже зарегестрирован:)
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.049 c