Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

TButton Default propertyje elállítódik, és programból sem áll vissza 2021 szept. 10 06:56 #2533

  • Mck
  • Mck profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 26
  • Köszönetek: 0

A te példádban, mivel csak két gomb van az ablakon, az egyik mindenképpen fókuszált állapotú, illetve valamelyiket mindenképpen kattintanod kell a bezáráshoz, amivel ugyebár a fókusz is rá kerül. A következő megnyitáskor pedig már rajta van.


Ó ... most megértettem. És persze hogy rendben van ... Köszi a türelmet :)

TButton Default propertyje elállítódik, és programból sem áll vissza 2021 szept. 10 06:39 #2532

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 503
  • Köszönetek: 86
A "default" beállítás működik, ahogy írtam.
Az "enter" lenyomására az ablaknak mindig a "default" eleméhez tartozó művelet lesz végrehajtva, kivéve ha éppen egy gomb van fókuszban, mert ilyenkor értelem szerűen annak az eseménykezelője fut le mintha rákattintottál volna.

Amiről te beszélsz az nem a "default" állapot hanem a fókusz, ami a kattintást vagy az ablakon belüli navigációt követi.

Mivel az ablak a bezáráskor csak eltűnik, de nem lesz megsemmisítve (majd újranyitáskor ismét létrehozva), ezért a fókusz is marad ahol utoljára volt.
A te példádban, mivel csak két gomb van az ablakon, az egyik mindenképpen fókuszált állapotú, illetve valamelyiket mindenképpen kattintanod kell a bezáráshoz, amivel ugyebár a fókusz is rá kerül. A következő megnyitáskor pedig már rajta van.

A "default" beállítás teszteléshez szükség van egy harmadik vezlérlőre (pl. TEdit) elhelyezésére a form-on és az ablak megjelenítésekor a fókusz-t rá kell helyezni.
Ez után tudod ellenőrizni, hogy a harmadik vezérlő fokuszált állapotakor az "enter" lenyomására valóban a "default" gomb aktiválódik.
Egyes GUI témáknál előfordulhat, hogy nincs megjelenésbeli különbség a normál és a "default" gombok között, ezért a megjelenésbeli eltérést érdemes kierőszakolni.

Lásd a mellékelt példát (töltsd le és csomagold ki egy üres könyvtárba az összes fájlt), amiben a te példádhoz hozzáadtam ez enyémben lévő tesztelést és a "default" állapotú gomb vizuális megkülönböztetését.

 

Melléklet:

Fájlnév: Btn_Default_mod.zip
Fájlméret:126 KB

A küldött programod viszont sajnos "láthatatlan" az IDE-m számára. Megnyitásakor nem jelennek meg a forrás unitok a szerkesztőben (bár betölthetők, természetesen), és a Run-ra sem történik látszólag semmi.

Furcsa... Melyik Lazarus változatot használod?
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64
Mellékletek:
Megköszönték: Mck

TButton Default propertyje elállítódik, és programból sem áll vissza 2021 szept. 09 15:16 #2530

  • Mck
  • Mck profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 26
  • Köszönetek: 0
Félreérthető voltam, úgy tűnik.

Form1 két gombja a példámban szándékosan csinálta ugyanazt. Azt akartam demonstrálni ezzel, hogy a Form2 meghívásakor nem a hívás helye (Form1 első v. második gombja), hanem ezektől függetlenül mindig a Form2-n utoljára megnyomott gomb lesz a Form2 legközelebbi hívásakor a Default. 

A tiédhez hasonlóan most megkülönböztettem Form1 két gombjának eljárását, és mellékelem így a komplett projektet. A helyzet változatlan; a Form2 hívásakor minden mástól függetlenül mindig az ott utoljára nyomott gomb lesz a Default.

A küldött programod viszont sajnos "láthatatlan" az IDE-m számára. Megnyitásakor nem jelennek meg a forrás unitok a szerkesztőben (bár betölthetők, természetesen), és a Run-ra sem történik látszólag semmi. :(
 
Mellékletek:

TButton Default propertyje elállítódik, és programból sem áll vissza 2021 szept. 09 14:32 #2529

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 503
  • Köszönetek: 86
A Form1-en mindkettő gomb kattintásához rendelt eljárásban (a cím beállításán kívül) ugyanazt csinálod:

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Caption := 'ELSŐ feladat';
Form2.Kettes.Default := false; // elvileg már ez sem kéne ide, de így látszik, hogy még így is hatástalan
Form2.Egyes.Default := true;

Form2.ShowModal;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.Caption := 'MÁSODIK feladat';
Form2.Kettes.Default := false; // elvileg már ez sem kéne ide, de így látszik, hogy még így is hatástalan
Form2.Egyes.Default := true;

Form2.ShowModal;
end;
 

Nálam működik az alapértelmezett vezérlő beállítása (habár a GUI téma miatt nem látszik eltérés a gombok között).
A teszteléshez írt miniprojektemet a mellékelt ZIP-ben találod.

Melléklet:

Fájlnév: default.co...demo.zip
Fájlméret:105 KB
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64
Mellékletek:

TButton Default propertyje elállítódik, és programból sem áll vissza 2021 szept. 09 09:05 #2528

  • Mck
  • Mck profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 26
  • Köszönetek: 0
Elnézést, de kétszeri kísérletre sem vette a "source" formátumot; mellékelem a két fájlt.
 
Mellékletek:

TButton Default propertyje elállítódik, és programból sem áll vissza 2021 szept. 09 09:00 #2527

  • Mck
  • Mck profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 26
  • Köszönetek: 0
Mellékelek egy rövid kódot (2 fájl). A probléma lényege a következő: ha a modálisan megnyitott Form2 formból kilépek (akár valamely rátett gomb megnyomásával, akár a jobb felső 'x'-ecskével), akkor a legközelebbi belépésnél - szándékom ellenére - automatikusan az utoljára megnyomott gomb lesz a default (azaz "TButton.Default = true"). Ez nem tetszik ugyan, de nem lenne baj akkor, ha programból vissza tudnám állítani - csakhogy nem tudom. A jelenség teljesen független attól, hogy a gombok Cancel és ModalResult értékei mik.

Ha a ShowModal-t hívó eseménykezelőbe (lásd a kódban) beleteszem pl. a Form2 Caption-jának módosítását, az (láthatóan) lefut; debugolás révén (meg ezek után amúgy is ...) egyértelmű, hogy a TButton.Default-ok beállító sorai is lefutnak - de utóbbiak eredmény nélkül. (Elvileg csak egy gomb lehet Default, de biztonság kedvéért még azt is megpróbáltam, hogy a másikét false-ra állítom; nem segített.) Nem volt hatása az OnShow eseménykezelőben elhelyezve sem.

Mi lehet az ok, és mi lehet a megoldás? Roppant zavaró, hogy a felhasználó ugyanazon a képernyőn hol az egyik, hol a másik (harmadik, huszadik) gombot látja alapértelmezettnek.


unit Main;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

{ TForm1 }

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private

public

end;

var
Form1: TForm1;

implementation

Uses
UForm2;

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Caption := 'ELSŐ feladat';
Form2.Kettes.Default := false; // elvileg már ez sem kéne ide, de így látszik, hogy még így is hatástalan
Form2.Egyes.Default := true;

Form2.ShowModal;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.Caption := 'MÁSODIK feladat';
Form2.Kettes.Default := false; // elvileg már ez sem kéne ide, de így látszik, hogy még így is hatástalan
Form2.Egyes.Default := true;

Form2.ShowModal;
end;


end.



unit UForm2;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

{ TForm2 }

TForm2 = class(TForm)
Egyes: TButton;
Kettes: TButton;
(*
procedure FormShow(Sender: TObject);
*)
procedure EgyesClick(Sender: TObject);
procedure KettesClick(Sender: TObject);
private

public

end;

var
Form2: TForm2;

implementation

{$R *.lfm}

{ TForm2 }

(*
procedure TForm2.FormShow(Sender: TObject);
begin
Kettes.Default := false; // elvileg már ez sem kéne ide, de így látszik, hogy még így is hatástalan
Egyes.Default := true;
end;
*)

procedure TForm2.EgyesClick(Sender: TObject);
begin
Close;
end;

procedure TForm2.KettesClick(Sender: TObject);
begin
Close;
end;

end.

  • Oldal:
  • 1