Sign in Join
Wiki copytemporary

Form Tutorial/fi

Deutsch · English · Suomi · 中文(中国) · 日本語

Lyhyt esittely lomakkeiden käytöstä Lazaruksessa.

Mikä on lomake?

Lomake (luokka TForm) edustaa ikkunaa tai valintaikkunaa, joka on sovelluksen käyttöliittymä. Säiliö, johon kaikki muut komponentit (esim. Painikkeet, label:t, muokkauskentät, kuvat jne.) lisätään.

Ensimmäinen GUI-sovellus

Lazaruksen onnistuneen asentamisen ja uuden sovelluksen käynnistämisen jälkeen luodaan tyhjä lomake. Se voidaan luoda uuden GUI-sovelluksen päävalikosta -> Projekti -> Uusi projekti -> Sovellus ja paina OK painiketta.

Näin luotiin uusi, täysin toimiva lomake projekti:

Form1 Designmodus.png

Uusi projekti voidaan käynnistää painamalla F9-näppäintä tai klikkaamalla hiirellä päävalikon kuvaketta Start.png (tai valitaan päävalikosta: Suorita -> Suorita). Projekti kootaan ja suoritetaan.

Mitään todella jännittävää ei tapahdu. Lomake (Form1) muuttuu hieman ulkonäöltään ja rasteriruudukon pisteet (joita käytetään yksittäisten komponenttien paikannusapuna) katoavat (niin kauan kuin ruudukon pisteet ovat näkyvissä, tiedät myös, että se on edelleen suunnittelutilassa):

Form1 Designmodus.png -> Form1 Runmodus.png

Seuraavaksi voidaan asettaa TButtonin lomakkeelle. Tätä käytetään myöhemmin mahdollistamaan toisen lomakkeen avaaminen:

Valitaan TButton komponenttipaletin Standard-välilehdeltä.

TButtonStandardpalette.png

ja klikataan lomaketta: Nyt siinä on painike, joka on sijoitettu Form1: een, jonka nimi ja kuvateksti on "Button1".

Jotta tämä painike voisi tehdä jotain, niin on ilmoitettava, että aiotaan tehdä jotain, kun sitä klikataan. Tätä voidaan pitää yksinkertaisena tapahtumana. Tätä varten tarvitaan tapahtuman käsittelijä, jota kutsutaan klikkauksen jälkeen. Hiiren klikkauksen tapahtumakäsittelijä on melko helposti saavutettavissa kaksoisklikkaamalla Button1-painiketta (tai komponenttimuokkaimessa), valitaan Button1 -> Tapahtumat-välilehti -> OnClick ja klikataan sitten [...] -painiketta. Tämä luo aliohjelman procedure TForm1.Button1Click koodieditoriin, jota kutsutaan aina (ajonaikaisesti, ei suunnittelun aikana), kun Button1:stä klikataan:

NeuesProjekt2.png

Jotta sovellus voi tehdä jotain Button1:n klikkaamisen jälkeen, lisätään koodia Begin ja End lauseiden väliin aliohjelman rungoon procedure TForm1.Button1Click näin:

pascal
procedure TForm1.Button1Click(Sender: TObject);
    begin
      Caption:='My first Form';  //Lomakkeen Form1 otsikko muuttuu 
      //or
      Button1.Caption:='Hello';  //Painikkeen teksti muuttuu
    end;

Suorita lomake nyt painamalla F9 ja huomaa, että kun painiketta klikataan niin lomakkeen otsikko ja painikkeen otsikko muuttuvat.

Nyt voidaan kokeilla hieman ja oppia käyttämään standardikomponentteja. Alussa suosittellaan kokeilemaan seuraavia komponentteja:

TButton tbutton.png
TLabel tlabel.png
TEdit tedit.png
TMemo tmemo.png
TToggleBox ttogglebox.png
TCheckBox tcheckbox.png
TRadioButton tradiobutton.png
TListBox tlistbox.png
TComboBox tcombobox.png
TScrollBar tscrollbar.png

Lisää muita hyödyllisiä tietoja on Lazarus Tutorial opetussivulla.

Kahden lomakkeen käyttö

Tässä nähdään, kuinka voidaan käyttää useita lomakkeita projektissa. Tässä esimerkissä luodaan vain kaksi lomaketta, Form1 (päälomake) ja Form2, mutta prosessi on identtinen lisälomakkeiden osalta.

Päälomakkeella on painike, joka klikkaamalla avataan uusi lomake. Uusi lomake saa myös painikkeen, jota klikkamalla sulkee tämän uuden lomakkeen ja palaa takaisin päälomakkeeseen.

Jos ollaan tehty ensimmäinen opetusohjelma: Ensimmäinen käyttöliittymäsovellus, niin on poistettava koodi aliohjelmassa procedure TForm1.Button1Click lauseiden begin ja end väliltä. Muutoin on luotava uusi projekti (sovellus), tuotava painike lomakkeelle ja luotava OnClick-tapahtumakäsittelijä tälle painikkeelle.
Klikkaa uutta painiketta, jos halutaan kirjoittaa painikkeen Caption ominaisuuteen (näkyvä teksti painikkeella). Tämä voidaan tehdä valitsemalla painike (klikkaa sitä kerran) ja komponenttimuokkaimessa valisemalla Ominaisuudet-välilehti -> ja kirjoittamalla Caption ominaisuuteen teksti "Avaa Lomake2" tai "Open Form2".

Objektinspektor.png

Klikkaa päävalikossa Tiedosto -> Uusi lomake, jos halutaan lisätä toinen lomake (Form2) projektiin. Sijoitetaan painike (Button1) Form2: een ja luodaan siihen OnClick-tapahtumankäsittelijä. Muuta tämän painikkeen Caption ominaisuuden teksti "Sulje" (tai "Close").

Nyt projektissa on kaksi lomaketta, joista jokainen voidaan valita ja näyttää päävalikossa Projekti -> Lomakkeet (tai näppäinyhdistelmällä ⇧ Shift + F12). Vaihtoehtoisesti voidaan valita käännösyksikön välilehti lähdekoodieditorissa ja käyttää sitten F12-näppäintä vaihtamaan koodieditori ja lomakkeen suunnittelun välillä vastaavan käännösyksikön lomakkeella.

Siirrytään lähdekoodieditorissa Form1:tä vastaavaan käännösyksikköön (Unit1) ja lisätään "Unit2" sen uses lauseeseen :

pascal
uses
      Classes, SysUtils, ... , Unit2;  // On tärkeää, että yksittäiset käännösyksiköt erotetaan pilkulla
                                       // ja lauseke päättyy puolipisteeseen.

Nyt voidaan kutsua Unit2:sta (ja siten Form2:sta) Unit1:ltä.

Seuraavaksi muokataan OnClick-tapahtumaa, joka kuuluu Form1:n painikkeelle:

pascal
unit Unit1;
    ...
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Form2.ShowModal;  //Näytetään Form2 ja fokus asetetaan Form2:lle.
    end;
pascal
unit Unit2;
    ...
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      Close;  //Suljetaan Form2.
    end;

Nyt voidaan käynnistää projekti (Start.png tai F9) ja avata Form2 klikkaamalla Form1-painiketta.

Show ja ShowModal-erot

Molemmat menetelmät Show ja ShowModal tekevät lomakkeen näkyväksi. Nähdäksesi eron Show - ja ShowModal :n välillä:

pascal
procedure TForm1.btnShowClick(Sender: TObject);
    begin
      Form2.Show;
      ShowMessage('Form2 is opened!');
    end;
    
    procedure TForm1.btnShowModalClick(Sender: TObject);
    begin
      Form2.ShowModal;
      ShowMessage('Form2 is opened and closed again!');
    end;

Käynnistä ohjelma ja katso eroa!

Show

Tämä aliohjelma tekee lomakkeen näkyväksi ja jatkaa kutsuvan ohjauksen koodin (Form1) suorittamista. Esimerkissä viesti (ShowMessage) näkyy lähes samanaikaisesti Form2 :n kanssa. Voidaan myös jatkaa kutsuvan lomakkeen Form1 käyttöä. Esimerkiksi on mahdollista siirtää sitä tai klikata Show -painiketta uudelleen (mutta klikkaamalla ShowModal aiheuttaa virheen).

<myForm>.Show;: n käyttämisen sijaan on mahdollista käyttää <myForm>.Visible:=True;. Metodi Show tekee seuraavaa:

pascal
procedure TCustomForm.Show;
    begin
      Visible := True;
      BringToFront;
    end;

Ainoa ero < myForm>.Show; ja < myForm>.Visible: = True; on, että lomake, joka näytetään Show , on kaikkien muiden tällä hetkellä näkyvien lomakkeiden päällä.

ShowModal

ShowModal pysäyttää koodin käsittelyn kutsun tehneessä kontrollissa (Form1), kunnes vasta avattu lomake (Form2) on suljettu. Esimerkissä ShowModal in välittömästi seuraava ShowMessage -rivi suoritetaan vasta kun Form2 on suljettu. Kutsulomake on jäädytetty: Ei voi siirtää Form1 :tä eikä klikata mitään sen painikkeista.

ShowModal on funktio, joka palauttaa kokonaisluvun, katso TModalResult. Palautettu arvo sallii haarautumisen sen mukaan, miten lomake suljettiin.

Kaksi lomaketta, jotka voivat kutsua toisiaan

Yleensä on hyvä ohjelmasuunnittelu välttää päälomakkeen kutsuminen toisesta lomakkeesta. On parempi palata päälomakkeeseen sulkemalla toinen lomake (kuten edellisessä esimerkissä) ja antamalla fokuksen palata päälomakkeelle. On kuitenkin mahdollista kutsua alilomakkeelta päälomaketta, kuten tämä esimerkki näyttää.

Jotta Form1 voi kutsua Form2:sta, niin Unit1:n uses-lausekkeessa on oltava unit2. Ja päinvastoin, kun Form2:sesta kutsutaan Form1:stä niin Unit2:n on käytettävä unit1 sen uses-lausekkeessa. Tämä johtaa mahdolliseen Circular Unit Reference-kääntäjän virheeseen, kun kukin yksikkö viittaa toiseen. Tämä esimerkki osoittaa myös, miten Circular Unit Reference virhe voidaan välttää.

Jos halutaan tehdä tämä esimerkki, muokkaa edellisen esimerkin lomakkeita (Kahden lomakkeen käyttö) tai luo uusi projekti, jossa on kaksi lomaketta, joista jokaisella on yksi painike. Aseta Form1.Button1:n caption arvoon "Open Form2" ja määritä Form2.Button1: n caption "Open Form1".

Jos muokataan edellistä esimerkkiä niin poistetaan "Unit2" Unit1:n uses-lausekkeesta.

Lisätään uses-lauseke kunkin käännösyksikön Implementation-osaan. Lisätään unit2 Unit1:n-lausekkeeseen ja lisätään Unit1 Unit2:n-lausekkeeseen seuraavasti:

pascal
unit Unit1;
    ...
    implementation
    
    uses
      Unit2;  
    ...
pascal
unit Unit2;
    ...
    implementation
    
    uses
      Unit1;  
    ...

Sitten muutetaan OnClick-tapahtumien takana olevaa koodia painikkeiden tapahtuman käsittelijässä:

pascal
unit Unit1;
    ...
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Form2.Show;  
    end;
pascal
unit Unit2;
    ...
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      Form1.Show; 
    end;

Muuttujien siirtäminen muihin lomakkeisiin

Edellä esitetyn esimerkin "Kahden lomakkeen käyttö" mukaisesti on mahdollista esitellä globaali muuttuja Unit2: n rajapinnassa. Tämä mahdollistaisi pääsyn sekä unit1:n että unit2:n samaan muuttujaan (tämä johtuu siitä, että asettamalla Unit2 unit1:n uses-lausekkeeseen, kaikki unit2 rajapinnassa ilmoitetut muuttujat ovat myös saatavilla käännösyksikössä unit1). Tämä käytäntö on rajoitettava minimiin, koska siitä on vaikea muistaa, mikä yksittäisen muuttujan "näkölaajuus", se mahdollisesti lisää virheitä. On parempi käyttää paikallisia muuttujia, määritellä Property luokassa tai vaihtoehtoisesti muuttujana luokassa.

Seuraavassa projektissa avataan toinen lomake klikkaamalla painiketta. Tällöin päälomakkeen käännösyksikössä lasketaan, kuinka usein toinen muoto on näytetty. Tässä toisessa lomakkeessa voit kysyä, klikkaamalla painiketta, kuinka usein se on avattu:

pascal
unit Unit2;
    ...
      TForm2 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
        const Count: Integer = 0;   //Tässä
      end;
pascal
unit Unit1;
    ...
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      inc(Form2.Count);  //Lisää laskuria yhdellä jokaiselle Form2-kutsulla
      Form2.ShowModal;   
    end;
pascal
unit Unit2;
    ...
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      ShowMessage('Form2 would be displayed '+IntToStr(Count)+' times');
    end;

Tällä tavoin voidaan käyttää Unit1:ssä kaikkia Unit2:n julkisia muuttujia / ominaisuuksia / funktioita / aliohjelmia (yleisiä metodeja).

Muut lomakkeeseen liittyvät aiheet

Käytä toista lomaketta päälomakkeena

Jos päätät jonkin ajan kuluttua, että haluat näyttää eri lomakkeita tai uuden lomakkeen näkymään käynnistyksen aikana, voit valita päävalikosta Projekti -> Projektiasetukset -> Lomakkeet:

Projekteinstellungen Formulare.png

Vaihtoehtoisesti voit valita Päävalikko -> Projekti -> Näytä projektin lähdekoodi, eli Project1.lpr (pääohjelman Pascal-koodi) ja luo ensimmäinen lomake, joka näytetään ensimmäisenä:

pascal
program Project1;
    ...
      Application.CreateForm(TForm2, Form2);  //Form2 luotiin ekana ja  näytetään kun sovellus käynnistyy
      Application.CreateForm(TForm1, Form1);

Tallenna lomakkeen ominaisuudet ohjelman lopussa

Luo lomake dynaamisesti

Luo Lazaruksessa suunniteltu lomake dynaamisesti

Aina ei tarvitse luoda kaikkia lomakkeita käynnistyksen aikana, joita voidaan kutsua sovelluksen aikana. Jotkut kehittäjät eivät yleensäkään pidä mitään niistä ja poistaa koodin, joka luodaan automaattisesti, kun lisätään projektiin uusi lomake Projekt.lpr: stä. Jos halutaan kirjoittaa kirjasto, jossa on muutama graafinen käyttöliittymä, ei voida muodostaa muotojen dynaamista luomista.

Esimerkki:

pascal
procedure TForm1.Button1Click(Sender: TObject);
    begin
      Form2:=TForm2.Create(Nil);  //Form2 luodaan
      Form2.ShowModal;            //Form2 näytetään
      FreeAndNil(Form2);          //tuhotaan Form2 
    end;

Uuden lomakkeen luominen dynaamisesti

Seuraava esimerkki osoittaa, miten uudet lomakkeet voidaan luoda koodilla ilman Form Designer -ohjelmaa.

Tässä esimerkissä painikkeen painaminen avaa toisen lomakkeen, joka itse sisältää painikkeen. Tämän toisen painikkeen klikkaaminen ilmoittaa, että lomake sulkeutuu; sitten lomake on suljettu.

pascal
procedure TForm1.Button1Click(Sender: TObject);
    var
      MyForm: TForm;
      MyButton: TButton;
    begin
      MyForm:=TForm.Create(nil);             
      MyForm.SetBounds(100, 100, 220, 150);  
      MyForm.Caption:='My dynamic created form';
    
      MyButton:=TButton.create(MyForm);  
      MyButton.Caption:='Close my form';
      MyButton.SetBounds(10, 10, 200, 30);
      MyButton.Parent:=MyForm;
    
      MyButton.OnClick:=@MyButtonClick;     
    
      MyForm.ShowModal;                     
    
      FreeAndNil(MyForm);     
    end;

https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png Huomaa: Jos komponentti on luotu omistajan (owner) kanssa (TButton.Create (Owner: TComponent)), se kuuluu omistajalle, joka vastaa sitten komponentin vapauttamisesta. Näin MyButton vapautetaan automaattisesti vapauttamalla MyForm.

pascal
TForm1 = class(TForm)
    ...
    private
      { private declarations }
      procedure MyButtonClick(Sender: TObject);
pascal
procedure TForm1.MyButtonClick(Sender: TObject);
    begin
      Showmessage('Attention, closing my dynamically created form!');
      if Sender is TButton then
        TForm(TButton(Sender).Parent).Close;
    end;

Katso myös


From the Free Pascal wiki, page "Form Tutorial/fi", as the Internet Archive kept it on 2025-01-17, last changed on 2020-02-16. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 4, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.