From jahappon@cc.jyu.fiMon Oct 7 10:23:10 1996 Date: Mon, 07 Oct 1996 08:28:16 +0300 From: Jarkko Happonen To: Vesa Lappalainen Subject: Jarkko Happonen/demo4/1-6 Graafisten käyttöliittymien ohjelmointi Demo 4 Jarkko Happonen ********************************* ** Tehtävä 1. Valitaan kaikki komponentit, joille vedä-pudota-ominaisuus halutaan, ja laitetaan DragMode dmAutomaticiksi. Sitten kirjoitetaan/muutetaan seuraavat metodit: procedure TAutolaskuri.FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := True; end; procedure TAutolaskuri.FormDragDrop(Sender, Source: TObject; X, Y: Integer); begin (Source as TControl).Left := X; (Source as TControl).Top := Y; end; Tämä ratkaisu toimii, mutta ei ole kovin siisti: oikeasti pitäisi vielä tutkia, mistä kohtaa komponentista otetaan kiinni ja suhteuttaa tiputus- paikka siihen (=> jokaisen vedettävän komponentin OnMouseUpia muutettava ottamaan paikka ylös, ja em. TAutolaskuri.FormDragDropia laskemaan uusi paikka oikein). Lisäksi esim. nappia ei voi vetää itsensä päälle, joten sen paikkaa on vaikea hienosäätää. Kolmas paha juttu on se, että napit eivät enää toimikaan hiiren vasemmasta näppäimestä - on käytettävä esim. välilyöntiä näppäimistöltä tai pikanäppäintä. ********************************* ** Tehtävä 2. (3.20) +---------------------------------------------------+ | +------------+ +----------------+ +-------------+ | | | Panel3 | | Panel4 | | Panel5 | | | | alLeft | | alClient | | alRight | | | +------------+ +----------------+ +-------------+ | | Panel1 alTop | +---------------------------------------------------+ +--------------+ +----------------+ +---------------+ | | | | | | | Panel6 | | Panel7 | | Panel8 | | alLeft | | alClient | | alRight | | | | | | | | | | | | | +--------------+ +----------------+ +---------------+ +---------------------------------------------------+ | +------------+ +----------------+ +-------------+ | | | Panel9 | | Panel10 | | Panel11 | | | | alLeft | | alClient | | alRight | | | +------------+ +----------------+ +-------------+ | | Panel2 alBottom | +---------------------------------------------------+ (3.21) (Eo. nimillä ja Align-asetuksilla) procedure TFormPanels.FormResize(Sender: TObject); var korkeus, leveys: Integer; begin korkeus := ClientHeight div 4; Panel1.Height := korkeus; Panel2.Height := korkeus; leveys := ClientWidth div 4; Panel3.Width := leveys; Panel5.Width := leveys; Panel6.Width := leveys; Panel8.Width := leveys; Panel9.Width := leveys; Panel11.Width := leveys; end; (3.22) Lomakkeen OnCreate: procedure TFormPanels.FormCreate(Sender: TObject); begin Button1.Align := alClient; Button2.Align := alClient; Button3.Align := alClient; Button4.Align := alClient; end; ********************************* ** Tehtävä 3. a) select * from puh where osoite like "%13%" Tämä ottaa valitettavasti mukaan myös kadunnumeroiset 113 jne. Voisi tietysti laittaa maskiksi "% 13%", mutta vielä parempi olisi (jos kadun numeroilla yleensä tarvitsee hakea) tehdä kadun numerolle oma kenttänsä. b) select nimi from puh where puh like "%13%" or osoite like "%13%" c) select nimi + " " + osoite from puh ********************************* ** Tehtävä 4. Taulu HENKILÖT HENKILÖID numero, primary key SUKUNIMI merkkijono ETUNIMI merkkijono (+ muut tarvittavat tiedot) Taulu PUHELINNUMEROT PUHELINNUMEROID numero, primary key HENKILÖID numero, viittaus kenttään HENKILÖT.HENKILÖID NUMERO merkkijono TYYPPI merkkijono (esim. "koti", "työ", "matka", "fax" jne.) TAVOITETTAVISSA merkkijono (esim. "arkisin 8-16", "iltaisin" jne.) Kentille HENKILÖT.HENKILÖID ja PUHELINNUMEROT.PUHELINNUMEROID annetaan arvot automaattisesti tietuetta luodessa. Tauluja käyttävän Delphi-sovelluksen tekeminen käy näppärimmin expertillä, käyttäen master/detail-tyyppiä. ********************************* ** Tehtävät 5. ja 6. interface ... type TLisaaButton = class(TButton) private FLaskuri: TLaskuri; FLisays: Integer; public constructor Create(AOwner: TComponent); override; procedure Click; override; published property Laskuri: TLaskuri read FLaskuri write FLaskuri; property Lisays: Integer read FLisays write FLisays default 1; end; TNollaa = class(TButton) public procedure Click; override; end; implementation ... constructor TLisaaButton.Create(AOwner:TComponent); begin inherited Create(AOwner); FLisays := 1; end; procedure TLisaaButton.Click; begin inherited; FLaskuri.Inc(FLisays); end; procedure TNollaa.Click; var i: Integer; begin inherited; for i := 0 to Owner.ComponentCount-1 do if Owner.Components[i] is TLaskuri then (Owner.Components[i] as TLaskuri).SetValue(0); end; procedure Register; begin ... RegisterComponents('Samples', [TLisaaButton]); RegisterComponents('Samples', [TNollaa]); end; Nyt voidaan autolaskuriohjelma tehdä kirjoittamatta lainkaan koodia. Myös uusien laskuri-lisää -parien lisääminen käy ilman riviäkään koodia.