Какаво е това Aowner ?

15 отговора 352 прегледа
#1

Какаво е това Aowner ?

Здравейте!
Искам да си създам някакъв обект динамично, например фрейм който съм си
подготвил или opendialog но или нищо не излиза или сгърчва делфито.
Предполагам че е заради този AOwner който не разбирам какво да е.
Пробвах да задам формата но явно не е така.
Нясой можели да ми каже как да си създам овект динамично и какво е това
AOwner което се задава в конструктора щом не е главната форма или друга форма?
Благодаря.
vautomation.hit.bg

Отговор
в отговор на v_automation #2

Re: Какаво е това Aowner ?

AOwner е компонент, наследник на TWinControl, който ще има грижата да се отърве от този компонент.
Обикновенно е формата. Тоест като си свърши работата и се free-ва, free-ва и всички контроли в нея.
Може да имаш проблем защото не задаваш Parent. Тоест в кой контрол да се намира твоя контрол. Забележи че за да го сложиш в TPanel му задаваш този панел като Parent. По принциp owner-а си остава формата (не че ще е проблем ако му зададеш панела за owner).

Go on, prove me wrong. Destroy the fabric of the universe. See if I care.
Отговор
в отговор на v_automation #3

Re: Какаво е това Aowner ?

procedure KojatoIzpolzvaTvojaFrame;
var vTvojaFrame: TTvojaFrame;
begin
vTvojaFrame := TTvojaFrame.Create(self);
try
if vTvojaFrame.ShowModal = mrOk then
begin
DoSomething;
end
else
begin
DoSomething;
end;
finally
vTvojaFrame.Release;
end;
end;

Отговор
в отговор на grey #4

Може ли и малко текст?

Здравей!
Защо използваш self а не името на формата в която ще създавам обекта?
На мене като ми сгърчва аз пиша нещо такова:

procedure xxx;
var
zzz:Tfreymami;
begin
zzz.Tfreymami.create(TForm1);
zzz.visible:=true;
end;

Пробвах след конструктора да му задавам някакви параметри обаче то ми гърчи още при създаването.

Пробвах да задам параметри без да създавам обекта и тогава не сгърчи но промените които правех в случая широчината на фрейма се отразяваха на самата форма.

procedure xxx;
var
zzz:Tfreymami;
begin
//zzz.Tfreymami.create(TForm1);
Form1.zzz.width:=50;
end;

Дале не трябва да ъпдейтвам делфито нещо?
Благодаря.
Чао.

Отговор
в отговор на Rincewind #5

Re: Какаво е това Aowner ?

Здравей!
Би ли погледнал какво съм написал по-долу за да получиш по-точна представа какво правя.
Благодаря.
Чао.

Отговор
в отговор на v_automation #6

Re: Може ли и малко текст?

Self -> F1 помага

Отговор
в отговор на v_automation #7

Re: Може ли и малко текст?

Бих ти препоръчал да update- неш познанията си за обектно оприентирано програмиране ;-))) Делфито както виждаш не е само пускане на компоненти ;-))) Има достатъчно книжки на пазара - по добре да започнеш с преведена такава и след това мини на непреводна литература от интернет.

Малко информация по въпроса ти

Self - променлива съдържаща инстанцията на обекта (внимавай за контекста в който я ползваш - т.е. понякога не се вижда от пръв поглед - особенно при nested procedures )

Примерно

TForm.OnClick (...)
begin
Self.Caption := "Това е инстанция на формата";
end;



АOwner - обикновено се ползва като променлива при някои методи и съдържа parent - инстанцията която създава текущия обект - за справки погледни списъците и отделните items (и не само ) в тях - ама това като попрочетеш малко книжки.

Една корекция -
вместо
zzz.Tfreymami.create(TForm1);
използвай
zzz := Tfreymami.create(TForm1);

Всъщност какво то4но се опитваш да направиш - да създадеш динамично фрейм - и да го покажеш във формата ли ?
И ако е това - защо не викаш
Form1.InsertControl(zzz); вместо да ползваш Visible := true ????

Редактирано от PhantomAS на

Отговор
в отговор на v_automation #8

Re: Може ли и малко текст?

Kogato sazdavash frayma vmesto ":=" si na pisal "."
Obarni vnimanie na znaka za prisvoyavane ":="
zzz := Tfreymami.create(TForm1);
ili
zzz := Tfreymami.create(self);

TForm1 sashto stava da bade podaden za parametar AOwner, no
sas self e po-dobre po prichini na prenosimost.
Self vsashtnost posochva tekushtia roditel
i naprimer v procedurata
procedure TMyForm.ImeNaProcedura;
self e ravnostojno na prefiksa TMyForm (v tvoya sluchaj na TForm1, no samo ako
do tozi moment obekta TForm1 veche e sazdaden)

Отговор
в отговор на v_automation #9

За тези които не са разбрали

Здравейте!
Искам да уточня че не става въпрос за синтактичната грешка която съм дапуснал като към давал примера.
Освен това искам да поясня че създавам оиейма в oncreate събитието на главната форма.
Ако това е проблема въпросът ми е как да създам фрейма еднократно при стартирането на програмата освен с oncreate.

Отговор
в отговор на v_automation #10

Re: Може ли и малко текст?

Това че като го компилираш не ти дава грешка не значи че има някакъв смисъл от такъв код. Така че все пак употребата на := е за предпочитане. Иначе се получава нещо като nil.Tfreymami.create(TForm1).
Относно OnCreate виж Project | View Source.

Отговор
в отговор на mn_t #11

Re: Може ли и малко текст?

Napisal sam go kakto si triabva zzz:=......
Zbarkal sam kato go pisah tuk!!!!!
Ne sam napravil copy-paste ot koda mi!!!!!!!!

Отговор
в отговор на v_automation #12

А БЕ ПРИЯТЕЛ - ТИ МОЖЕШ ЛИ ДА ЧЕТЕШ...

и разбираш български?
Вече разбрахме, че не разбираш много много от обектно програмиране - ами вземи прочети какво ти пишат хората - поне 2 отговора - не само моя - в който ти обърнаха внимание на проблема - ОСНОВНИЯ!!!!!
ГРЕШКАТА ТИ НЕ Е СИНТАКТИЧНА - ТЯ Е !!!!!!! Л О Г И Ч Е С К А !!!!!!!!
Втория ти проблем - този че не виждаш създадения фрейм (по начина по който ТИ ГО ПОСОЧИХ НЕ САМО АЗ ) е че не извикваш функция която да добави създадения компонент във формата - и това съм ти посочил.

А ето ти и пълния отговор на въпроса - е и сега ако не разбереш къде грешиш - май не си за тази професия.

//пиша кода on the fly - но се надявам да нямам грешки

procedure TForm1.OnCreate(Sender: TObject);
var MyFrame: TMyFrame;
begin
MyFrame := TMyFrame.Create (Self); // а не MyFrame.Create(Self); - това гърми със EStackOverflow !!!!!
//тука сложи кода за инициализация
//with MyFrame do
//begin
// Top := 10;
// Left := 10;
// Width := 50;
// Height := 50;
// end;
InsertControl(MyFrame); // те това ти показва фрейма във формата
end;

И тичай утре до Славейков (или до най-близката книжарница ) да си купиш книжки.

---
Е т'ва е живот!
Отговор
в отговор на PhantomAS #13

Може да не разбирам нищо но поне имам идеи...

Здравей ПРИЯТЕЛ!
Погледнах постовете ти.
Не желая да продължавам заядливият ти тон.
Благодаря ти за същинската информацея в твоят пост!
Чао.

Отговор
в отговор на v_automation #14

Благодаря на всички които ми отговориха

Здравеите отново!
Благодаря на всички които си направиха труда да ми отговорят.
С този пост не закривам темата.
Който смята че има какво да каже нека да го направи.
Чао.

Отговор
в отговор на v_automation #15

Re: Може да не разбирам нищо но поне имам идеи...

Май афектиран от проблема ;-))) не си разбрал, че реално аз се ШЕГУВАХ - а не съм се заяждал. Виж - не съм искал да те обиждам или нещо подобно - за това ако така са прозвучали думите ми - извинявай.
В това да не знаеш нещо и да питаш няма нищо обидно, но следващия път прочети първо това което си написал - т.е. потърси грешката в себе си преди да обвиняваш съдателите на Delphi(това тотално ме развесели - и на това се дължи тона в първия ми постинг ) или някой от клуба тук - не за друго - ами явно ако някой се е заел да ти отоговори си е направил труда да вникне в това което си писал. А пък в написаното - т.е. там където си публикувал кода - има доста неща - които даже и да не си past-вал директно, не би трябвало да грешиш!

Всъщност ако прочетеш първия пост още веднъж - ще разбереш, че наистина не съм се заяждал - само се опитах да те насоча - а не да ти давам готово решение.

---
Е т'ва е живот!
Отговор
в отговор на PhantomAS #16

Re: Може да не разбирам нищо но поне имам идеи...

Здравей!
Радвам се че е така (че си се майтапил)!
Това с вмъкването на контрола е бил проблема.
Като го написах се получи.
Освен всичко когато някой не знае нещо, той не знае и какво и за какво да пита.
Който разбира обаче няма проблем да го разбере.
Ти си ми отговорил за това за което съм попитал.
Всички мнения и забележки по темата ми бяша полезни.
Още веднъж Благодаря!
Аз ще продължа с въпросите.
Чао.

Отговор