Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1160142543
worldmen
2006-10-06 17:49
2006.10.22
Работа с датой


3-1156155450
tytus
2006-08-21 14:17
2006.10.22
Первичнй ключ по двум столбцам?


2-1160036406
Kolan
2006-10-05 12:20
2006.10.22
Виртуальный конструктор. Как правильно переопределять?


15-1159773469
laok
2006-10-02 11:17
2006.10.22
JVCL для Delphi 10


2-1160116351
Alex_C
2006-10-06 10:32
2006.10.22
Еще вопрос по SynEdit





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