[ franjo_tahi @ 17.09.2008. 10:21 ] @
Kreirao sam kontrolu koja je nasljednik TDBEdit-a

postoji event: OnExit

kako dodati event: BeforeExit koji bi se startao prije izlaska iz kontrole, i prije pokušaja upisa podatka u tablicu.

Problem je kako kontrolirati korisnikov upis tako da program ne javi pogrešku prilikom izlaska iz TDBEdit-a ako je npr. field TDate, a korisnik je upisao podatak koji se ne može upisati kao datum.

Isto tako bih npr korisnikov upis: "01" atumatski pretvarao u "01.takuči mjesec.tekuća godina" i još ponešto, ali za sve mi treba event koji se starta prije upisa u tablicu.
[ Markanto @ 17.09.2008. 11:45 ] @
Zasto ne stavis DateTimePicker?
Stavis da ti u DateTimePickeru datum prikazuje danasnji.
Onda samo mijenjas dan.
Tako korisnik ne moze staviti nista osim datuma!

Ili taj dio mozes napraviti na onKeyDown!
Ako je unesena vrijednost datum onda izadji, a ako nije onda
me napravi npr. setFocus na taj TDBEdit.
[ savkic @ 17.09.2008. 13:56 ] @
> Kreirao sam kontrolu koja je nasljednik TDBEdit-a
> postoji event: OnExit
> kako dodati event: BeforeExit koji bi se startao prije izlaska iz kontrole, i prije pokušaja upisa podatka u tablicu.

Možeš overajdovati DoExit, uraditi šta želiš i po potrebi pozvati inherited DoExit (koji poziva OnExit).
[ franjo_tahi @ 17.09.2008. 20:14 ] @
lakše je s TEdit kontrolom, tj. napravio sam kontrolu TDateEdit kao nasljednika TEdit.
U njoj sam definirao

fDataSource: TDataSource;
fDataField: TField;

published
property DataSet: TIBDataSet read GetDataSet write SetDataSet;
property DataField: TFied read fDataField write fDataField;

...

vezao sam se na procedure AfterPost i BeforePost tako da odradim što mi treba i osvježim podatak koji se prikazuje, to je ok.

e, sad što me muči:

kako dobiti da mi Object Inspector za property DataField nudi samo field-ove iz dodjeljenog DataSeta. Sada mi nudi sve fieldnove, iz svih DataSet-ova koji su na formi (ili vidljivi preko uses iz drugih formi)

moža preko kreiranja tipa:

type
fSetField=(Field1, Field2...);

taba bih definirao

property DataField: fSetField

ali, kako dinamički kreirati set budući da unaprijed ne znam field-ove?


[ priki @ 01.10.2008. 14:22 ] @
bolje uzmi neki drugi način za rešavanje toga
pošto je takva kontrola krajnje jednostavna

a za recimo dodavanje nekog eventa ide ovako
(u zavisnosti koji dodaješ i kad)

Code:

... deklaracija klase

private
  procedure ExitDateEvent(Sender: TObject)

procedure TMojaForma.FormCreate(Sender: TObject);
begin
  dbInvoiceDate.OnExit := ExitDateEvent;
end;

procedure TMojaForma.ExitDateEvent(Sender: TObject)
begin
{
   kod koji nesto radi sa recimo:
  TDBEdit(Sender).Text
}
end;
[ Rapaic Rajko @ 01.10.2008. 15:42 ] @
Ja predlazem da se vratimo na pocetak :) , odnosno na TDBEdit. Evo malo koda:

Code:

  TDBEditModifExit = class(TDBEdit)
  private
    procedure CMExit(var Msg: TCMExit); message CM_EXIT;
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
  end;


i jos

Code:

  procedure TDBEditModifExit.CMExit(var Msg: TCMExit);  
  begin
    ShowMessage('Ovo je pre inherited CMExit()'); // ovde se zapravo izmeni text po nahodjenju
    inherited;
  end;


A evo sta radi kod u inherited (originalnoj) metodi:

Code:

  procedure TDBEdit.CMExit(var Message: TCMExit); 
  begin
    try
      FDataLink.UpdateRecord;
    except
      SelectAll;
      SetFocus;
      raise;
    end;
    SetFocused(False);
    CheckCursor;
    DoExit;
  end; 


Ja sam pokusao ovo, i dobio sam taj ShowMessage iz prve (cak i bez "kacenja" na bazu); znaci, trebalo bi da radi.

Rajko
[ franjo_tahi @ 02.10.2008. 11:29 ] @
Nisam vidio odgovore. Hvala na pomoči.

Problem sam rješio malo zaobilazno: Uzeo sam kompletnu definiciju TDBEdita, promjenio mu ime u TDBDateEdit i sve što sam trebao je napraviti override KeyDown i KeyPress. Sve što mi je trebalo sam stavio unutra.

Kontrola radi odlično.

Neke od stvari zbog kojih sam radio svoju kotrnolu:
- nije potrebno unositi "." - sam zna gdje je i dodaje automatski. npr: nakon unosa "12" pritiskom na "3" će formiati tekst: "12.3"
- dozvoljava unos nepostoječeg datuma do trenutka izlaza iz kontrole. npr: 31.02.2008. Ovo zato što me mućila izmjena datuma u dtpickeru koji ovo ne dozvoljava, pa se izmjena datuma sa npr 28.02.2008 na 31.03.2008 mora početi od mjeseca
- umjesto "." prihvača bilo što osim numerika
- "+" i "-" na num. tastaturi mijenjaju dan, sa CTRL - mjesec, sa ALT godinu
- SPACE - postavlja tekući datum
- izmjena podatka ne briše ciji datum, mijenja se samo dan, mjesec ili godina
- podatak koji se ostavi prazan (d,m ili g) popunjava s trenutnim.
[ priki @ 02.10.2008. 12:13 ] @
pardon, loše pročitano :)