[ cacafaca @ 02.09.2010. 08:08 ] @
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] |