Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problemi sa MDI aplikacijom prilikom kreiranja Tform-e i pozivanja odredjenog taba iz tabpagecontrol

[es] :: Pascal / Delphi / Kylix :: Problemi sa MDI aplikacijom prilikom kreiranja Tform-e i pozivanja odredjenog taba iz tabpagecontrol

[ Pregleda: 1869 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mojeKorIme
BiH

Član broj: 59512
Poruke: 350
109.175.50.*



+1 Profil

icon Problemi sa MDI aplikacijom prilikom kreiranja Tform-e i pozivanja odredjenog taba iz tabpagecontrol03.06.2010. u 22:57 - pre 169 meseci
Napravio sam Main i child formu.. pomocu sljedeceg koda otvaram zeljenu formu iz stringa (naziv forme)... zapeo sam u pozivanju/otvaranju tabsheeta iz naziva..to sam rijesio pomocu zadnjih if-ova.. ali bih volio to elegantnije rijesiti da radi parametarski ako me razumijete :) molim za pomoc...pozz
Code:


procedure tglavnaForma.otvoriProzor(nazivProzora:string;tab:integer);
var i:integer;

    fc : TFormClass;
    f : TForm;

begin

if jeLiOtvoren(nazivProzora)=false then
begin
  fc := TFormClass(FindClass('T'+nazivProzora));
  f := fc.Create(Self);
  //f.Show;
  application.ProcessMessages;
end;

showmessage(fc.ClassName);

for i := 0 to glavnaforma.MDIChildCount - 1 do
  if glavnaforma.MDIChildren[i].Name = nazivProzora then
    begin
      if fc.ClassName='TsazetakForma' then TsazetakForma(glavnaforma.MDIChildren[i]).PageControl1.ActivePageIndex:=tab;
      if fc.ClassName='TOpisProizvodaiUsluga' then TOpisProizvodaiUsluga(glavnaforma.MDIChildren[i]).PageControl1.ActivePageIndex:=tab;
    end;

Give me six hours to chop down a tree and I will spend the first four sharpening the axe.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Problemi sa MDI aplikacijom prilikom kreiranja Tform-e i pozivanja odredjenog taba iz tabpagecontrol04.06.2010. u 01:25 - pre 169 meseci
> Napravio sam Main i child formu.. pomocu sljedeceg koda otvaram zeljenu formu iz stringa (naziv forme)... zapeo sam u pozivanju/otvaranju tabsheeta iz naziva..to sam rijesio
> pomocu zadnjih if-ova.. ali bih volio to elegantnije rijesiti da radi parametarski ako me razumijete :) molim za pomoc...pozz

Prođi kroz sve kontrole novo napravljene forme dok ne nađeš TPageControl kontrolu i njoj promeni ActivePageIndex.
 
Odgovor na temu

rambo
Dejan Petković
Beograd

Član broj: 6095
Poruke: 190
*.dynamic.sbb.rs.



+6 Profil

icon Re: Problemi sa MDI aplikacijom prilikom kreiranja Tform-e i pozivanja odredjenog taba iz tabpagecontrol04.06.2010. u 03:34 - pre 169 meseci
Prvo, umesto ActivePageIndex, bolje je koristiti ActivePage, jer se u toku razvoja aplikacije index (redni broj nekog taba) može promeniti dodavanjem, pomeranjem ili uklanjanjem tabova. ActivePage pokazuje na TTabSheet koji je trenutno aktivan.

Jedna digresija. Ono što ja praktikujem je da SVIM komponentama dajem adekvatna imena prema vrsti komponente i nameni na određenoj formi. Na taj način mi je kasnije mnogo lakše da nađem željenu komponentu i da pristupim njenim svojstvima. Uglavnom praktikujem da nazive komponenti počnem sa 2-3 slova koja definišu tip komponente, pa tako na primer tsPrviTab, tsListaProizvoda, tsZadnjiTab, btnOK, btnCancel, frmGlavnaForma, frmProizvodi i slično.

Ako ne želiš da koristiš imena tabova, onda umesto indexa taba koristi Tag (integer tip) jer isti upravo služi za ovakve stvari. Tag je "user" property, tj. namenjen je da ga koristi programer i standardno se ne koristi nigde unutar VCL.

Imam i jednu malu ispravku/savet. U Pascalu se Boolean evaluacija sa jednim operandom ne poredi sa True ili False. U tvom slučaju imamo:
Code:
if jeLiOtvoren(nazivProzora)=false then

a obično je pravilo da se piše:
Code:
if not jeLiOtvoren(nazivProzora) then

Čak i sa više operanada može da se izbegne poređenje sa True i False. Tvoja konstrukcija nije pogrešna, samo malo odskače od standarda za pisanje jednostavnog i čitljivog koda.

Imam još par stvari koje bih ti rekao u vezi korišćenja ActivePage propertija, ali ću te za sada pustiti da malo sam eksperimentišeš Ako naiđeš na problem, javi se.
"There is a theory which states that if ever anybody discovers exactly what the
Universe is for and why it is here, it will instantly disappear and be replaced by
something even more bizarre and inexplicable. There is another theory which states
that this has already happened."
-- Douglas Adams
 
Odgovor na temu

mojeKorIme
BiH

Član broj: 59512
Poruke: 350
109.175.55.*



+1 Profil

icon Re: Problemi sa MDI aplikacijom prilikom kreiranja Tform-e i pozivanja odredjenog taba iz tabpagecontrol04.06.2010. u 06:22 - pre 169 meseci
Hvala obojici na odgovorima (rambo hvala na lekcijama iz standada :).. ovo je samo experiment pa se nisam "trudio" da stavljam sve nazive i sl. i sl. a i ja inace imam dosta tvojih navika :) )... @Savkic ti si mi dosta vise pomogao... sa savjetom da "pretrcim" po svim kontrolama i nadjem onu koju trebam promjeniti. u ovom dijelu me jos uvijek interesuje može li se code
Code:
  
...
begin
      if fc.ClassName='TsazetakForma' then TsazetakForma(glavnaforma.MDIChildren[i]).PageControl1.ActivePageIndex:=tab;
      if fc.ClassName='TOpisProizvodaiUsluga' then TOpisProizvodaiUsluga(glavnaforma.MDIChildren[i]).PageControl1.ActivePageIndex:=tab;
...


nekako izmjeniti da umjesto da pfovjeravam ClassName uradim nesto ovako
Code:
  
...
begin
       TimeForme(glavnaforma.MDIChildren[i]).PageControl1.ActivePageIndex:=tab;
...


napominjem da je ovo MDI pa da moram paziti na Access Violation :)

hvala jos jednom
Give me six hours to chop down a tree and I will spend the first four sharpening the axe.
 
Odgovor na temu

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.zaslon-telecom.si.



+14 Profil

icon Re: Problemi sa MDI aplikacijom prilikom kreiranja Tform-e i pozivanja odredjenog taba iz tabpagecontrol04.06.2010. u 09:47 - pre 169 meseci
Napravi bolji inheritance chain. Npr.

Code:

type TBasePagedForm = class(TForm) // ili class TBaseForm ako imas BaseForm, ili TMDIForm, whatever
  Pages: TPageControl
protected
  FStartupPage: TTabSheet
public
  procedure ShowStartupPage;
...
implementation

procedure TBasePagedForm.ShowStartupPage;
begin
  Pages.ActiveTabPage := FStartupPage;
end;


Code:

type TSazetakForma = class(TBasePagedForm)
  constructor Create(Owner: TComponent); override;
...
implementation
  constructor TSazetakForma.Create(Owner: TComponent);
  begin
    FStartupPage := TSPage1;
  end;


Code:

type TOpisProizvodaiUsluga = class(TBasePagedForm)
  constructor Create(Owner: TComponent); override;
...
implementation
  constructor TOpisProizvodaiUsluga.Create(Owner: TComponent);
  begin
    FStartupPage := TSPage1;
  end;


onda samo pozivas kad ti treba
Code:

if SomeForm is TBasePagedForm then
  TBasePagedForm(SomeForm).ShowStartupPage;


Druga stvar, kada jednom imas TBasePagedForm onda mozes unutra da trpas sav kod koji ce ti biti zajednicki za sve Paged forme, daleko je konzistentnije i lakse za odrzavanje i nadgradnju, samo pazi da ne preteras sa nivoima apstrakcije, neke stvari ipak moraju biti specificne za formu :)

if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.zaslon-telecom.si.



+14 Profil

icon Re: Problemi sa MDI aplikacijom prilikom kreiranja Tform-e i pozivanja odredjenog taba iz tabpagecontrol04.06.2010. u 09:59 - pre 169 meseci
I jos nesto, izbegavaj da koristis TObject.ClassName. Koristi if SomeInstance is TSomething. To ce ti vrati True za ceo inheritance chain a ne samo za konkretnog descendanta (a da ne pominjem promenu imena klasa, a tebi ostane staro ime posto je hardkodirano kao string). Ako ti zatreba dinamicko kreiranje formi a ne znas runtime klasu (kao sto vidim iz onog tvog jeLiOtvoren), onda koristi metaklase iliti class of keyword. To je jedan od fenomenalnih feature-a Delphija koji ne postoji cak ni u reflection jezicima kao .Net i Java. On ti omogucava npr.

Code:

type TBasePagedForm = class
... //ostatak klase

type TBasePagedFormClass  = class of TBasePagedForm;

type TSazetekFormaClass = class(TBasePagedForm);
...//ostatak klase

//U main formi
function TMainForm.CreatePagedForm(PagedFormClass: TBasePagedFormClass): TBasePagedForm;
begin
  Result := PagedFormClass.Create(Self);
end;

...//Negde u kodu kad ti zatreba instanca
  JednaForma := MainForm.CreatePagedForm(TSazetekForma)


Sto je veoma korisno za MDI aplikacije.

if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Problemi sa MDI aplikacijom prilikom kreiranja Tform-e i pozivanja odredjenog taba iz tabpagecontrol04.06.2010. u 11:18 - pre 169 meseci
> u ovom dijelu me jos uvijek interesuje može li se code

Code:

      if fc.ClassName='TsazetakForma' then TsazetakForma(glavnaforma.MDIChildren[i]).PageControl1.ActivePageIndex:=tab;
      if fc.ClassName='TOpisProizvodaiUsluga' then TOpisProizvodaiUsluga(glavnaforma.MDIChildren[i]).PageControl1.ActivePageIndex:=tab;

> nekako izmjeniti da umjesto da pfovjeravam ClassName uradim nesto ovako

       TimeForme(glavnaforma.MDIChildren[i]).PageControl1.ActivePageIndex:=tab;


Koliko sam shvatio iz tvog prvog primera, promenljiva f je instanca novo kreirane forme, i da njoj moraš setovati tabSheet. Ako je tako, nemaš potrebe da je ponovo tražiš preko MDIChildCount:
Code:

  for i := 0 to glavnaforma.MDIChildCount - 1 do
    if glavnaforma.MDIChildren[i].Name = nazivProzora then


Tebi bi trebalo nešto ovako (netestirano):

Code:

  for i := 0 to f.ComponentCount - 1 do
    if f.Components[i] is TPageControl then
    begin
      TPageControl(f.Components[i]).ActivePageIndex := Tab;
      Exit;
    end;   

 
Odgovor na temu

mojeKorIme
BiH

Član broj: 59512
Poruke: 350
109.175.55.*



+1 Profil

icon Re: Problemi sa MDI aplikacijom prilikom kreiranja Tform-e i pozivanja odredjenog taba iz tabpagecontrol04.06.2010. u 12:41 - pre 169 meseci
hvala vam svima..nekako sam odradio... nisam imao toliko iskustva sa MDI.. ako neko ima iz iskustva nekih savjeta a i vremena molio bih ga da postavi nekoliko rečenica šta izbjegavati, a šta koristiti prilikom pravljenja ove vrste aplikacija...

pozdrav
Give me six hours to chop down a tree and I will spend the first four sharpening the axe.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Problemi sa MDI aplikacijom prilikom kreiranja Tform-e i pozivanja odredjenog taba iz tabpagecontrol

[ Pregleda: 1869 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.