Lazarus 3.6 (2024.09.30.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Hogyan válthatok fókuszt form-ok között? 2026 ápr. 10 14:19 #2726

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 84
  • Köszönetek: 16
Oksa!
Én kíváncsian várom a játékot és a kódot. Minden kódból lehet tanulni, okulni!
A C#-os játék is tök jó lett! Érdekes!
Nem próbálkoztam még játékirással, de lehet megpróbálom majd...
Windows 10, VirtualBox(Ubuntu Mate 25.10)
Lazarus 4.6
CodeTyphon 8.8

Hogyan válthatok fókuszt form-ok között? 2026 ápr. 10 11:15 #2725

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 88
  • Köszönetek: 1
Valóban jellemző rám, hogy hatalmasra tudom hizlalni a programjaimat. Ez azért van, mert (még) nem tudom, hogy hogyan kell kiszervezni a részeit több unit-ba, esetleg form-ra. Mondjuk arról már olvastam, hogy saját unit-okat hogyan kell készíteni, de a form-ok elkülönítése ahhoz képest számomra tényleg ismeretlen vizekre való evezés. A saját unit-ok készítése nem tűnik nagyon bonyolultnak, csak éppen eddig még sosem láttam szükségét egyik programomban sem, hogy így taglaljam.
Mindenesetre ha elkészül ez a játékom (hetek kérdése, ha nem jön közbe semmi), akkor közzéteszem azt is a honlapomon és okvetlenül írok erről ide is, és meg tudjátok nézni a forráskódját.

Hogyan válthatok fókuszt form-ok között? 2026 ápr. 09 12:31 #2724

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 84
  • Köszönetek: 16
Pedig egyszerűsödne a kód, ha kiemelnéd egy másik formra a panelos részt és csak megjelenitenéd vagy eltüntetnéd, mert a fókusz így visszakerül a hívás előtti komponensre mint általában a dialógus ablakok hivásakor...
Vagy a FreeAndNil előtt ellenőrizni kell hogy az ojjjektum nem NIL.
Valamikor régebben néztem valamelyik játékod kódját (talán a Puffancsos volt), jó hogy tudod követni mi micsoda...
Néha én is elveszek a saját kódomban (nem a legszebb kód), főleg ha pár hónap mulva bele kell nyulni, ezért mostanában kommentelem a saját kódomat.
Windows 10, VirtualBox(Ubuntu Mate 25.10)
Lazarus 4.6
CodeTyphon 8.8

Hogyan válthatok fókuszt form-ok között? 2026 ápr. 09 11:17 #2723

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 88
  • Köszönetek: 1
Jó lehet, amit írtál, de már nem nagyon akarok belekutyulni a kódomba, mert már nagy nehezen elfogadhatóvá sikerült tenni.
Még ez a FreeAndNil(urh1panel) törlés foglalkoztat belőle, ami SIGSEGV hibát okoz a 30-as címen. Elvileg ez azért van, mert valahol még hivatkozom erre a panelre, csak nem tudom, hogy ez hol történhet? Lehet, hogy még a panelon van a fókusz a törlése után is és az a baj?

Hogyan válthatok fókuszt form-ok között? 2026 ápr. 08 18:25 #2722

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 84
  • Köszönetek: 16
Szerintem hozz létre egy saját dialógus ablakot a megfelelő panellel meg gombokkal meg amit még akarsz + "Ok" TBitBtn gombbal. Ok gomb Kind tulajdonság "bkOk", ModalResult tulajdonság "mrOK", ez eltünteti majd az ablakot.
pl:
object SajatDialog: TSajatDialog
  Left = 350
  Height = 128
  Top = 250
  Width = 179
  BorderStyle = bsDialog
  Caption = 'SajatDialog'
  ClientHeight = 128
  ClientWidth = 179
  FormStyle = fsStayOnTop
  Position = poScreenCenter
  LCLVersion = '4.6.0.0'
  object BitBtn1: TBitBtn
    Left = 45
    Height = 30
    Top = 80
    Width = 75
    Default = True
    DefaultCaption = True
    Kind = bkOK
    ModalResult = 1
    TabOrder = 0
    OnClick = BitBtn1Click
  end
  object Edit1: TEdit
    Left = 40
    Height = 23
    Top = 32
    Width = 80
    TabOrder = 1
    Text = 'Edit1'
  end
end          
unit Unit2;
 
{$mode ObjFPC}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Buttons, StdCtrls;
 
type
 
  { TSajatDialog }
 
  TSajatDialog = class(TForm)
    BitBtn1: TBitBtn;
    Edit1: TEdit;
    procedure BitBtn1Click(Sender: TObject);
  private
 
  public
 
  end;
 
var
  SajatDialog: TSajatDialog;
 
implementation
uses unit1;
{$R *.lfm}
 
{ TSajatDialog }
 
procedure TSajatDialog.BitBtn1Click(Sender: TObject);
begin
  Hide;
end;
end.             


A főform példa:
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, unit2;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  if SajatDialog.ShowModal = mrOK then
    Form1.Caption:=SajatDialog.Edit1.Text;
end;
 
end.        


Én igy csinálnám, ha jól értem a problémát...
Windows 10, VirtualBox(Ubuntu Mate 25.10)
Lazarus 4.6
CodeTyphon 8.8

Hogyan válthatok fókuszt form-ok között? 2026 ápr. 08 13:42 #2721

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 88
  • Köszönetek: 1
Nagy nehezen egy elfogadható megoldást találtam, így kiegészítve ezt a függvényt:
procedure TForm1.j1bgbeallit(Sender: TObject);
var kiiras: array [0..1] of string;
begin
     szovegmezo:=TEdit.Create(self);
     szovegmezo.Parent:=self;
     kiiras[0]:='Nyomj le egy gombot!';
     kiiras[1]:='Press a key!';
     szovegmezo.Text:=kiiras[nyelv];
     szovegmezo.Left:=urh1panel.Left+urh1panel.Width+10;
     szovegmezo.Top:=urh1panel.Top;
     szovegmezo.Width:=urh1panel.width;
     szovegmezo.OnKeyDown:=@szovmezgombbeker;
     szovegmezo.SetFocus;
end;
A szovmezgombbeker függvényben pedig kezelem a gombnyomást, plusz a legvégén van egy boolean változó (szovmeztorles:=true;), amivel a pályafrissítés ciklusban törlöm a szövegmezőt (FreeAndNil(szovegmezo);).
Egy a bajom: ha a TForm1.FormKeyDown-ban törlöm FreeAndNil(urh1panel) utasítással az egész panelt, akkor valami SIGSEGV hibát okozok, ezért csak inaktívvá tenni tudom ezt:
urh1panel.visible:=false;
urh1panel.enabled:=false;

És nem tudom, hogy hogyan törölhetném inkább, mert az lenne nekem a jobbik megoldás. Ahogy az 1. hozzászólásban látható, az urh1panel szülője a form1, a TBitBtn-ok szülője meg az urh1panel. Azoknak van OnClick eseményük, ami létrehozza a szövegmezőt. Ez ugye törlődik a boolean változóval a pályafrissítésben. Tehát azt nem tudom, hogy ebben a láncolatban mi hibádzik, ami miatt a hibát kapom a FreeAndNil(urh1panel)-re?

Hogyan válthatok fókuszt form-ok között? 2026 ápr. 08 07:51 #2720

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 88
  • Köszönetek: 1
Sajnos ugyanazt a "Cannot focus a disabled or invisible window" hibaüzenetet kapom, mint a többinél  :
form1.enabled:=true;
form1.visible:=true;
form1.FocusControl(form1);

 

Hogyan válthatok fókuszt form-ok között? 2026 ápr. 07 15:17 #2719

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 84
  • Köszönetek: 16
Hali!
...
form1.FocusControl(ValamiKontroll);
....
​​​​​​​lehetőséggel mi a helyzet?
Windows 10, VirtualBox(Ubuntu Mate 25.10)
Lazarus 4.6
CodeTyphon 8.8

Hogyan válthatok fókuszt form-ok között? 2026 ápr. 03 13:18 #2718

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 88
  • Köszönetek: 1
Sziasztok!
Nagyon elakadtam egy újabb Lazarus-os játékom fejlesztése közben, mégpedig azzal, hogy futásidőben létrehozok a fő form-on (form1) egy TPanel összetevőt és azon néhány TBitBtn gombot. Ezek a gombok arra szolgálnának, hogy rájuk kattintva a felhasználó átdefiniálhatja a játékot irányító gombokat, tehát ha lenyom egy gombot, akkor az lesz a jobbra mozgatáshoz rendelve, egy másik a lövéshez, stb.
A gond az, hogy amint rákattintok egy ilyen TBitBtn-ra, akkor az lesz aktív és nem tudom, hogy utána hogyan adjam vissza a fókuszt a form1-nek vagy bármely más összetevőnek.
Tehát ilyen a kódrészlet:
urh1panel:=TPanel.Create(form1);
     urh1panel.Parent:=form1;
     urh1panel.color:=clGreen;
     urh1panel.Left:=10;
     urh1panel.Top:=(form1.height div 2)-10;
     urh1panel.Width:=form1.width div 4;
     urh1panel.Height:=form1.height div 2;
     //
     urh1gombbalra:=TBitBtn.Create(urh1panel);
     urh1gombbalra.Parent:=urh1panel;
     urh1gombbalra.Left:=4;
     urh1gombbalra.Top:=4;
     urh1gombbalra.width:=urh1panel.width div 2;
     urh1gombbalra.Glyph.LoadFromFile('kepek\ikonbalra.bmp');
     (...)
     urh1gombbalra.DoubleBuffered:=true;
     urh1gombbalra.OnClick:=@form1.j1bgbeallit;
 
procedure TForm1.j1bgbeallit(Sender: TObject);
begin
     form1.enabled:=true;
     form1.visible:=true;
     form1.SetFocus;
end;
De ezek után nem történik semmi a gombnyomásra. Próbáltam ezzel is:
ActiveControl:=form1;
de erre meg azt írta hibaüzenetként, hogy letiltott vagy láthatatlan form-ra nem lehet a fókuszt továbbadni. Szóval most teljesen leálltam, pedig még a ChatGPT segítségét is bevetettem. Valaki tudna segíteni, segítő magyarázatot adni ezekkel kapcsolatban?

  • Oldal:
  • 1