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

Pravilno iscrtavanje korisnicke komponente u Design režimu

[es] :: Pascal / Delphi / Kylix :: Pravilno iscrtavanje korisnicke komponente u Design režimu

[ Pregleda: 1719 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

cacafaca
Nemanja Simovic
Beograd, Voždovac

Član broj: 49511
Poruke: 174
*.dynamic.isp.telekom.rs.

ICQ: 68999229


+18 Profil

icon Pravilno iscrtavanje korisnicke komponente u Design režimu02.09.2010. u 08:08 - pre 166 meseci
Napravio sam komponentu izvedenu od TCustomControl. Funkcionalno komponenta se sastoji od TEdit-a i TBitBtn-a. TEdit sliži kako DataBase polje a TBitBtn kao dugme koje poziva novu formu sa tabelom iz koje se bira strani ključ. Slične komponente verovatno postoje ali je meni trebala sa nekim dodatim stvarima pa sam morao sam da je pravim. Sve lepo funkcioniše sem
1. iscrtavanja u Design time-u i
2. nemam ideju kako bi napravio OnExit događaj koji treba da se desi kada se napusti i TEdit i TBitBtn.

1. U Design time-u ako promenim mišem veličinu komponente komponenta se lepo iscrta, ali ako otvorim formu na kojoj se nalazi moja komponenta koja ima promenjenu veličinu onda se ne iscrta kako treba. Ako je promenjena veličina manja od podrazumevane (Height=21; Width=121) onda npr. se samo vidi Edit ili Edit i deo Digmeta. Ako je promenjena veličina veća od podrazumevane onda se iscrta kontrola sa početnim vrednostima a ostatak TCustomControle je prazan. Evo slikakoje ilustruju problem.
Kada ja u design time-u mišem promenim veličinu ili kada kontroli nije promenja veličina →

Kada se otvori forma, koja ima kontrolu sa promenjneom veličinom (različitom od podrazumevane) →

Ja sam samo u konstruktoru i OnResize eventu pozivao proceduru RasiriKontrole() koja menja veličinu. Ne znam na koji događaj još treba da se stavi da bi se kontrola lepo iscrtavala i u Design režimu. U Run time radi dobro.

2. Drugo pitanje kako da detektujem kada ko i TEdit i TBitBtn izgubio fokus, jer hoću da napravim OnExit događaj. Neću da mi se desi da je TEdit kontrola fokusirana pa se klikne na TBitBtn i da se pozove OnExit, nego kada se napusti cela komponenta. Da li samo treba da objavim OnExit od TCustomControl i ona će sama da pozove kada njena deca komponente(TEdit i TBitBtn) i ona samam izgube fokus?

Evo dela koda kodi je bitan:
Code:

type 
  TEditIzbor = class(TCustomControl)
  private
    FEdit: TEdit;
    FBitBtn: TBitBtn;
    ...
    procedure OnResizeNasledjena(Sender: TObject);
    ...
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    ...
  published
    ...
    property OnExit: TNotifyEvent read FOnExit write PostaviOnExit;
    ...
  end;

function TEditIzbor.SirinaDugmeta: Integer;
begin
  // ovo treba da se preradi jer mogu da dodju slike u obzir
  Result := 20;

{
  Paznja! Kada se poziva TextCanvas nesto se dogadja sa OnResize eventom. Treba
  nekako drugacije da se resi sirina dugmeta.
}
  {Result := Canvas.TextWidth('000') + 8;
  if (Result < 20) and (Width div 2 > 20) then
    Result := 20;}
end;

procedure TEditIzbor.RasiriKontrole;
begin
  { Ovde treba da se menja za dugme Left, Width i Height, a za Edit Width i Height }

  FBitBtn.Width := SirinaDugmeta;
  FBitBtn.Left := Width - FBitBtn.Width;
  FBitBtn.Height := Height;

  FEdit.Width := FBitBtn.Left;
  FEdit.Height := Height;
  {FEdit.Text := Format('E(%d, %d, %d, %d); B(%d, %d, %d, %d);', [FEdit.Left, FEdit.Top, FEdit. Width,
    FEdit.Height, FBitBtn.Left, FBitBtn.Top, FBitBtn.Width, FBitBtn.Height]);}
end;

procedure TEditIzbor.OnResizeNasledjena(Sender: TObject);
begin
  RasiriKontrole;
end;

constructor TEditIzbor.Create(AOwner: TComponent);
const
  PodrVisina = 21;
  PodrSirina = 121;
begin
  FIzvestaj := TStringList.Create;
  FPreuzetiZapis := TStringList.Create;
  FUpustvo := TStringList.Create;
  PostaviUpustvo;

  Inherited Create(AOwner);
  OnExit := OnExitEditIzbor;

  FBoje := TBoje.Create;
  with FBoje do
  begin
    Boja := clWindow;
    BojaObavezno := clYellow;
    BojaAktivno := clSkyBlue;
    BojaNijeNadjen := $9191ff;
    BojaNadjenoVise := $aaffaa;
  end;

  // EDIT polje
  FEdit := TEdit.Create(Self);  // create
  FEdit.Parent := Self;
  FEdit.Left := 0;
  FEdit.Top := 0;
  FEdit.OnKeyDown := OnKeyDownNasledjena;
  FEdit.OnKeyPress := OnKeyPressNasledjena;
  FEdit.OnChange := OnChangeNasledjena;
  FEdit.OnExit := OnExitFEdit;
  FTasterBrisanje := False;
  FEditTekstStaro := FEdit.Text;

  // DUGME
  FBitBtn := TBitBtn.Create(Self); // create
  FBitBtn.Parent := Self;
  FBitBtn.Glyph := TBitmap.Create;  // create
  FBitBtn.Top := 0;
  FBitBtn.Caption := '...';
  FBitBtn.TabStop := False;
  FBitBtn.Glyph.OnChange := PromenaSlike;
  FBitBtn.OnClick := OnBtnClick;

  // SelectSQL
  FSelectSQL := TStringList.Create; // create
  FSelectSQL.OnChange := OnChangeFSelectSQL;

  // LINK baza
  FFieldDataLink := TFieldDataLink.Create;  // create
  FFieldDataLink.Control := Self;
  FFieldDataLink.OnDataChange := OnDataChange; // Kada se promene podaci
  FFieldDataLink.OnActiveChange := OnActiveChange; // Kada se menja aktivno stanja DataSet-a
  FFieldDataLink.OnEditingChange := OnEditingChange; // Kada udje ili izadje u Edit state

  // FDlgIzbor
  FDlgIzbor := nil;
  FBaza := nil;
  FDataFieldForeign := '';
  FDataFieldSearch := '';
  FVrednostPoljaPretrage := '';
  FIzborParametri := TParams.Create;

  OnResize := OnResizeNasledjena;  // ovo ne moze da se poziva pre kreiranja ostalih podkomponenata !
  Width := PodrSirina;
  Height := PodrVisina;

  RasiriKontrole;
  FPreuzimanje := False;
  FRezimRucnogUnosa := False;
  FRezimPreuzimanja := False;
  FOgranicenUnos := True;

  FIzborBrojZapisa := 0;  // podrazumevano je nula, a to znaci da ce biti 100 zapisa u izboru
  FIzborBrojZapisaUkucan := 0;
  FIzborMaxZapisa := False; // podrazumevano je false sto znaci da ce biti 100 zapisa u izboru
end;


Hvala unapred na savetima.

[Ovu poruku je menjao cacafaca dana 02.09.2010. u 17:40 GMT+1]
 
Odgovor na temu

cacafaca
Nemanja Simovic
Beograd, Voždovac

Član broj: 49511
Poruke: 174
*.dynamic.isp.telekom.rs.

ICQ: 68999229


+18 Profil

icon Re: Pravilno iscrtavanje korisnicke komponente u Design režimu02.09.2010. u 09:51 - pre 166 meseci
Citat:
2. Drugo pitanje kako da detektujem kada ko i TEdit i TBitBtn izgubio fokus, jer hoću da napravim OnExit događaj. Neću da mi se desi da je TEdit kontrola fokusirana pa se klikne na TBitBtn i da se pozove OnExit, nego kada se napusti cela komponenta. Da li samo treba da objavim OnExit od TCustomControl i ona će sama da pozove kada njena deca komponente(TEdit i TBitBtn) i ona samam izgube fokus?

Upravo tako. Samo sa dodao u published:
Code:

  published
    ...
    property OnExit;
    ...
  end;
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Pravilno iscrtavanje korisnicke komponente u Design režimu02.09.2010. u 12:07 - pre 166 meseci
> 1. U Design time-u ako promenim mišem veličinu komponente komponenta se lepo iscrta, ali ako otvorim formu na kojoj se nalazi moja komponenta koja ima promenjenu veličinu
> onda se ne iscrta kako treba. Ako je promenjena veličina manja od podrazumevane (Height+21; Width+121) onda npr. se samo vidi Edit ili Edit i deo Digmeta. Ako je
> promenjena veličina veća od podrazumevane onda se iscrta kontrola sa početnim vrednostima a ostatak TCustomControle je prazan. Evo slikakoje ilustruju problem.

Ako se ne iscrtava dobro onda je verovatno greška u Paint metodi. Takođe posle Resize ti fali jedan Repaint.
 
Odgovor na temu

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.dial-up.dsl.siol.net.



+14 Profil

icon Re: Pravilno iscrtavanje korisnicke komponente u Design režimu03.09.2010. u 22:05 - pre 166 meseci
Svaka komponenta ima virtuelni metod Loaded koji se poziva kada se kontrola deserijalizuje iz componentstreama (npr. dfm). Override-uj taj metod:

Code (delphi):

procedure TEditIzbor.Loaded; override;
begin
  RasiriKontrole;
end;
 


U Loaded stavljaj i sve override nasledjenih published property-ja, a ne u konstruktor, jer ce sve promene iz konstruktora biti pregažene pri deserijalizaciji.
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
79.143.162.*



+62 Profil

icon Re: Pravilno iscrtavanje korisnicke komponente u Design režimu05.09.2010. u 11:38 - pre 166 meseci
Hm, zar u gornjem kodu ne fali jedan inherited..?

Code:

procedure TEditIzbor.Loaded; override;
begin
  inherited;
  RasiriKontrole;
end;


Pozz

Rajko
 
Odgovor na temu

cacafaca
Nemanja Simovic
Beograd, Voždovac

Član broj: 49511
Poruke: 174
*.dynamic.isp.telekom.rs.

ICQ: 68999229


+18 Profil

icon Re: Pravilno iscrtavanje korisnicke komponente u Design režimu06.09.2010. u 11:42 - pre 165 meseci
Citat:
Boris B.: Svaka komponenta ima virtuelni metod Loaded koji se poziva kada se kontrola deserijalizuje iz componentstreama (npr. dfm). Override-uj taj metod:

Code (delphi):

procedure TEditIzbor.Loaded; override;
begin
  RasiriKontrole;
end;
 


U Loaded stavljaj i sve override nasledjenih published property-ja, a ne u konstruktor, jer ce sve promene iz konstruktora biti pregažene pri deserijalizaciji.
Upravo ovako je proradilo! HVALA SVIMA. POSEBNO BORISU. Sada iscrtava u Design time-u bez problema.
 
Odgovor na temu

cacafaca
Nemanja Simovic
Beograd, Voždovac

Član broj: 49511
Poruke: 174
*.dynamic.isp.telekom.rs.

ICQ: 68999229


+18 Profil

icon Re: Pravilno iscrtavanje korisnicke komponente u Design režimu15.09.2010. u 07:12 - pre 165 meseci
Citat:
Rapaic Rajko: Hm, zar u gornjem kodu ne fali jedan inherited..?

Code:

procedure TEditIzbor.Loaded; override;
begin
  inherited;
  RasiriKontrole;
end;


Pozz

Rajko

Falio je, Rajko. Hvala!
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Pravilno iscrtavanje korisnicke komponente u Design režimu

[ Pregleda: 1719 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

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