Säätimien siirtäminen ja koon muuttaminen ajon aikana

Näin voit ottaa hallintalaitteiden vetämisen ja koon muuttamisen (Delphi-muodossa) hiirellä sovelluksen ollessa käynnissä.

Lomakeeditori ajon aikana

Kun olet asettanut ohjaimen (visuaalisen komponentin) lomakkeelle, voit säätää sen sijaintia, kokoa ja muita suunnitteluajan ominaisuuksia. On kuitenkin tilanteita, joissa sinun on sallittava sovelluksesi käyttäjän muuttaa lomakeohjauksia ja muuttaa niiden kokoa ajon aikana.

Kolme, jotta voidaan suorittaa suorituksenaikainen käyttäjän liikkuminen ja ohjaimen koon muuttaminen lomakkeella hiirellä hiiren liittyvät tapahtumat tarvitsevat erityiskäsittelyä: OnMouseDown, OnMouseMove ja OnMouseUp.

Oletetaan, että haluat teoriassa käyttäjän sallivan siirtää (ja muuttaa koon) painikkeiden ohjausta hiirellä ajon aikana. Ensinnäkin käsittelet OnMouseDown-tapahtumaa, jotta käyttäjä voi "napata" painikkeen. Seuraavaksi OnMouseMove-tapahtuman tulisi muuttaa (siirtää, vetää) painiketta. Viimeinkin OnMouseUpin pitäisi viimeistellä siirto.

Lomakeohjainten vetäminen ja koon muuttaminen käytännössä

instagram viewer

Pudota ensin useita ohjaimia lomakkeelle. Ota valintaruutu käyttöön tai poista käytöstä säätimien siirtäminen ja koon muuttaminen ajon aikana.

Seuraavaksi määrittele kolme menettelyä (kohdassa käyttöliittymä lomakeilmoituksen osa), joka käsittelee hiiren tapahtumia yllä kuvatulla tavalla:

tyyppi
TForm1 = luokka(TForm)... menettely ControlMouseDown (Lähettäjä: TObject; Painike: TMouseButton; Vaihto: TShiftState; X, Y: kokonaisluku); menettely ControlMouseMove (Lähettäjä: TObject; Vaihto: TShiftState; X, Y: kokonaisluku); menettely ControlMouseUp (Lähettäjä: TObject; Painike: TMouseButton; Vaihto: TShiftState; X, Y: kokonaisluku); yksityinen
inReposition: boolean; oldPos: TPoint; 

Huomaa: Kaikkia lomaketasotasoja tarvitaan merkitsemään, jos ohjauksen liike tapahtuu (inReposition) ja tallentaa ohjaus vanhaan sijaintiin (oldPos).

Määritä lomakkeen OnLoad-tapahtumassa hiiren tapahtumien käsittelymenetelmät vastaaville tapahtumille (niille säätimille, jotka haluat vetää / muuttaa kokoa):

menettely TForm1.FormCreate (Lähettäjä: TObject); alkaa
Painike1.OnMouseDown: = ControlMouseDown; Painike1.OnMouseMove: = ControlMouseMove; Button1.OnMouseUp: = ControlMouseUp; Edit1.OnMouseDown: = ControlMouseDown; Edit1.OnMouseMove: = ControlMouseMove; Edit1.OnMouseUp: = ControlMouseUp; Paneeli1.OnMouseDown: = ControlMouseDown; Paneeli1.OnMouseMove: = ControlMouseMove; Paneeli1.OnMouseUp: = ControlMouseUp; Painike2.OnMouseDown: = ControlMouseDown; Painike2.OnMouseMove: = ControlMouseMove; Button2.OnMouseUp: = ControlMouseUp; pää; (* FormCreate *)

Huomaa: yllä oleva koodi mahdollistaa Button1: n, Edit1: n, Panel1: n ja Button2: n ajon uudelleen sijoittamisen.

Lopuksi, tässä maaginen koodi:

menettelyTForm1.ControlMouseDown ( Lähettäjä: TObject; Painike: TMouseButton; Vaihto: TShiftState; X, Y: kokonaisluku);alkaajos (ChkPositionRunTime. tarkistettu) JA
(Lähettäjä On TwinControl) sittenalkaa
inReposition: = true; SetCapture (TWinControl (lähettäjä) .Käsittely); GetCursorPos (oldPos); pää; pää; (* ControlMouseDown *)

ControlMouseDown Lyhyesti: kun käyttäjä painaa hiiren nappia hallintalaitteen yli, jos ajoajan uudelleenasetus on käytössä (valintaruutu chkPositionRunTime on tarkistettu) ja hiiren jopa vastaanottanut hallintalaite on johdettu TWinControlista, merkitse, että ohjauksen uudelleenasennus tapahtuu (inReposition: = True) ja varmista, että kaikki hiiren käsittely on kaapattu ohjausta varten - estääksesi napsautustapahtumien oletustapahtumien syntymisen käsitelty.

menettelyTForm1.ControlMouseMove ( Lähettäjä: TObject; Vaihto: TShiftState; X, Y: kokonaisluku);const
minleveys = 20; minHeight = 20; var
newPos: TPoint; frmPoint: TPoint; alkaajos inReposition sittenalkaakanssa TWinControl (lähettäjä) tehdäalkaa
GetCursorPos (newPos); jos ssShift sisään Siirtää sittenalkaa//resize
Näyttö. Kohdistin: = crSizeNWSE; frmPoint: = ScreenToClient (hiiri. CursorPos); jos frmPoint. X> minWidth sitten
Leveys: = frmPoint. X; jos frmPoint. Y> minHeight sitten
Korkeus: = frmPoint. Y; päämuu//movealkaa
Näyttö. Kohdistin: = crSize; Vasen: = Vasen - oldPos. X + newPos. X; Yläosa: = Ylä - oldPos. Y + newPos. Y; oldPos: = newPos; pää; pää; pää; pää; (* ControlMouseMove *)

ControlMouseMove lyhyesti: vaihda näytön kohdistin toiminnan heijastamiseksi: jos Shift-näppäintä painetaan, salli ohjauksen koon muuttaminen tai siirrä ohjain uuteen asentoon (mihin hiiri menee). Huomautus: minWidth ja minHeight vakiot tarjoavat eräänlaisen kokorajoituksen (minimiohjausleveys ja -korkeus).

Kun hiiren painike vapautetaan, vetäminen tai koon muuttaminen on ohi:

menettelyTForm1.ControlMouseUp ( Lähettäjä: TObject; Painike: TMouseButton; Vaihto: TShiftState; X, Y: kokonaisluku);alkaajos inReposition sittenalkaa
Näyttö. Kohdistin: = crDefault; ReleaseCapture; inReposition: = Väärä; pää; pää; (* ControlMouseUp *)

ControlMouseUp lyhyesti: kun käyttäjä on lopettanut siirtämisen (tai säätimen koon muuttamisen), vapauta hiiren sieppaus (napsautusten oletuskäsittelyn mahdollistamiseksi) ja merkitse, että uudelleenasennus on valmis.

Ja se tekee sen! Lataa mallisovellus ja kokeile itse.

Huomaa: Toinen tapa siirtää säätimiä ajon aikana on käyttää Delphiä raahaa ja pudota niihin liittyvät ominaisuudet ja menetelmät (DragMode, OnDragDrop, DragOver, BeginDrag jne.). Vedämällä ja pudottamalla voidaan antaa käyttäjien vetää kohteita yhdestä säätimestä - kuten luetteloruutu tai puunäkymä - toiseen.

Kuinka muistaa valvonnan sijainti ja koko?

Jos annat käyttäjän siirtää ja muuttaa lomakkeen ohjainten kokoa, sinun on varmistettava, että ohjauksen sijoittelu on jotenkin tallennetaan, kun lomake suljetaan, ja että jokaisen ohjaimen sijainti palautetaan, kun lomake luodaan / ladataan. Näin voit tallentaa Vasen, Ylä-, Leveys- ja Korkeusominaisuudet jokaiselle lomakkeen ohjaukselle INI tiedosto.

Entä 8 kokokahvaa?

Kun annat käyttäjän siirtää ja muuttaa koon kokoa Delphi-muodossa, ajon aikana hiirellä, kohtaan jäljitellä täysin suunnitteluajan ympäristöä, sinun tulisi lisätä kahdeksan kokoisia kahvoja ohjausobjektiin kokoa.