Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.22;
Скачать: CL | DM;

Вниз

Незнаю как назвать. (Заполнение свойства при создании объекта)   Найти похожие ветки 

 
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]

> Я бы попробовал, но мне лень регистрировать компонент

Что именно?.... Я попробую он у меня уже зарегестрирован:)


 
Zeqfreed ©   (2006-10-06 23:31) [41]

> [40] RASkov   (06.10.06 23:29)

Ничего нового. ComponentState. Не знаю уж что там не работает у тебя. Вообще зачем тебе нужно такое поведение. Зачем при создании сразу растягивать компонент на всю клиентскую область.


 
RASkov   (2006-10-06 23:33) [42]

> [41] Zeqfreed ©   (06.10.06 23:31)

Ну это... такое графическое меню... А StartWidth и StartHeight нужны для дальнейшего (во время работы проги) масштабирования элементов меню...Вот.


 
RASkov   (2006-10-06 23:36) [43]

Т.е. StartWidth и StartHeight можно указать отличные от реальных Width Height в дизайнтайме. Например форму с этим меню в дизайнере можно сделать маленькой а при старте она примет необходимые размеры а StartWidth и StartHeight будут размеры от которых плясать при масштабе... Блин, ну в этом плане.


 
Percent   (2006-10-06 23:50) [44]

public
 procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;

{...}
procedure TMyComponent.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
 inherited;
 if (csDesigning in ComponentState) then
 begin
   FStartHeight := Height;
   FStartWidth := Width;
 end;
end;

Так?

P.S. Научись формулировать мысли. И ставить конкретные задачи. А то мне заказчики уже поперек горла стоят с подобными подходами. А тут еще и ты... Что ни пост - то новая мысль, предыдущей противоречащая...


 
Percent   (2006-10-06 23:58) [45]

Zeqfreed ©   (06.10.06 23:27) [38]
> Это еще почему это?

Вот из-за этой строчки наверное:

> FStartHeight := Height;


А тут подробнее, пожалуйста...


 
RASkov   (2006-10-07 00:03) [46]

> [44] Percent   (06.10.06 23:50)

Спасибо... уже ближе к делу... счас поробую.

> P.S. Научись формулировать мысли. И ставить конкретные задачи.
> А то мне заказчики уже поперек горла стоят с подобными подходами.
> А тут еще и ты... Что ни пост - то новая мысль, предыдущей
> противоречащая...

Как смог сформулировал... вроде усе ясно было и конкретно, чебы кинуть на форму и в инспекторе продублить свойства высоты и ширины компанента.. даже код привел... Извеняюсь если Вы не поняли меня. Под каждого не угодишь....:( Сорри, и спасибо, что в сад не отправили:)


 
Zeqfreed ©   (2006-10-07 00:15) [47]

> [45] Percent   (06.10.06 23:58)

Угу. Был неправ :)


 
RASkov   (2006-10-07 00:30) [48]

> [44] Percent   (06.10.06 23:50)

Ну вот оно то что надо... помоему. Пока результат удовлетворил полностью... посмотрим. Спасибо.



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

Текущий архив: 2006.10.22;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.03 c
1-1158231300
простак
2006-09-14 14:55
2006.10.22
связность графа....


2-1160297204
WoW
2006-10-08 12:46
2006.10.22
Нужен толковой пример по работе с интерфейсами...


15-1159512544
IMHO
2006-09-29 10:49
2006.10.22
Самый лучший коллектив -


2-1159969196
Игорь_
2006-10-04 17:39
2006.10.22
Создание нити и отправка ей сообщения.


2-1159690084
Rem02
2006-10-01 12:08
2006.10.22
InterBase Прошу помочь!!!