Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Custom MenuItem 2016 febr. 21 19:40 #1862

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Igen, köszönöm!

Custom MenuItem 2016 febr. 20 20:19 #1861

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 503
  • Köszönetek: 86
Csak a valamilyen szintű védelemmel (hozzáférés korlátozása vagy az érték szigorú felügyelete) rendelkező tulajdondonságok esetén kell "getter" és/vagy "setter", melyek az adatot ténylegesen tartalmazó mezőt kezelik, amikor a property-re hivatkozunk.
A SetLevel és a GetLevel használata a kód e változatában teljesen indokolatlan, mivel egyszerű értékadás történik egy korlátozás nélkül elérhető tulajdonság esetén... persze ha majd valami ok miatt extra sorokkal kibővíted őket, az más.
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

Custom MenuItem 2016 febr. 20 20:11 #1860

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Kicsit felfrissítettem az ismereteket. A működő kód:
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus;
 
type
 
  { TMyMenuItem }
 
  TMyMenuItem = class(TMenuItem)
    procedure SetLevel( alevel: integer );
    function GetLevel: integer;
 
  private
    { private declarations }
  public
    { public declarations }
    // level: integer read GetLevel write SetLevel;
    level: integer;
  end;
 
 
 
 
  { TForm1 }
 
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    MenuItem1: TMyMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
 
var
  Form1: TForm1;
 
 
implementation
 
 
{$R *.lfm}
 
 
 
 
{ TMyMenuItem }
 
// set level
procedure TMyMenuItem.SetLevel( alevel: integer );
begin
  level:=alevel;
end;
 
 
// get level
function TMyMenuItem.GetLevel: integer;
begin
  GetLevel:=level;
end;
 
 
 
 
 
 
 
 
 
{ TForm1 }
// onshow
procedure TForm1.FormShow(Sender: TObject);
begin
  //MenuItem1.SetLevel( 1 );
  MenuItem1.level:=1;
  ShowMessage( 'Level: ' + IntToStr( MenuItem1.Level ) );
  //MenuItem1.SetLevel( 12 );
  MenuItem1.level:=12;
  ShowMessage( 'Level: ' + IntToStr( MenuItem1.GetLevel ) );
end;
 
 
 
 
 
 
// oncreate
procedure TForm1.FormCreate(Sender: TObject);
begin
  // menu
  MenuItem1:=TMyMenuItem.Create( self );
  MenuItem1.Caption:='Főmenü';
  MainMenu1.Items.Add( MenuItem1 );
end;
 
 
end. 

Köszönöm!
Property-t setter/getter állítja a Delphi-ben. Lazarus-ban nem?

Custom MenuItem 2016 febr. 20 19:20 #1859

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 503
  • Köszönetek: 86
Sima property-t nem állítunk "setter" és nem olvasunk "getter" használatával. Most mobilról vagyok és ezért sajnos nem tudom részletezni. Keresd meg a TMenuItem vagy akármi más deklarációját és nézd meg ott hogy csinálják... (tudtam, hogy ez hogy következni)
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

Custom MenuItem 2016 febr. 20 18:59 #1858

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Már "csak" annyi a baj, hogy futáskor SIGSEGV van ebben a sorban:
level:=alevel;
Miért is?
A kód:
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus;
 
type
  { TMyMenuItem }
 
  TMyMenuItem = class(TMenuItem)
    procedure SetLevel( alevel: integer );
    function GetLevel: integer;
 
  private
    { private declarations }
  public
    { public declarations }
  published
  property
    level: integer read GetLevel write SetLevel;
  end;
 
 
  { TForm1 }
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    //MenuItem1: TMyMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  MenuItem1: TMyMenuItem;
 
 
 
implementation
 
 
{$R *.lfm}
 
{ TMyMenuItem }
// set level
procedure TMyMenuItem.SetLevel( alevel: integer );
begin
  level:=alevel;
end;
 
 
// get level
function TMyMenuItem.GetLevel: integer;
begin
  GetLevel:=level;
end;
 
 
 
 
 
{ TForm1 }
// onshow
procedure TForm1.FormShow(Sender: TObject);
begin
  //MenuItem1.SetLevel( 1 );
  MenuItem1.level:=1;
  ShowMessage( 'Level: ' + IntToStr( MenuItem1.GetLevel ) );
  //MenuItem1.SetLevel( 12 );
  MenuItem1.level:=12;
  ShowMessage( 'Level: ' + IntToStr( MenuItem1.GetLevel ) );
end;
 
// oncreate
procedure TForm1.FormCreate(Sender: TObject);
begin
  // menu
  MenuItem1:=TMyMenuItem.Create( self );
  MenuItem1.Caption:='Főmenü';
  MainMenu1.Items.Add( MenuItem1 );
end;
 
end. 

Custom MenuItem 2016 febr. 20 18:11 #1857

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
A MainMenu1-hez most nem adtam hozzá menuitem-et a Designer-ben.
Dinamikusan kellene hozzáadni (ahogy te is írtad), de ebben is futási hiba van. A Teljes főform kódja (Form1 , unit1.pas):
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus;
 
type
 
  { TMyMenuItem }
  TMyMenuItem = class(TMenuItem)
    procedure SetLevel( level: integer );
    function GetLevel(): integer;
  private
    { private declarations }
  public
    { public declarations }
  // published
  property
    level: integer read GetLevel write SetLevel;
  end;
 
 
 
 
  { TForm1 }
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    MenuItem1: TMyMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
 
var
  Form1: TForm1;
 
 
 
 
implementation
 
 
{$R *.lfm}
 
{ TMyMenuItem }
// set level
procedure TMyMenuItem.SetLevel( level: integer );
begin
  self.level:=level;
end;
 
// get level
function TMyMenuItem.GetLevel(): integer;
begin
  Result:=self.level;
end;
 
 
 
{ TForm1 }
// onshow
procedure TForm1.FormShow(Sender: TObject);
begin
  MenuItem1.SetLevel( 1 );
  ShowMessage( 'Level: ' + IntToStr( MenuItem1.GetLevel ) );
  MenuItem1.SetLevel( 12 );
  ShowMessage( 'Level: ' + IntToStr( MenuItem1.GetLevel ) );
end;
 
// oncreate
procedure TForm1.FormCreate(Sender: TObject);
begin
  MenuItem1:=TMyMenuItem.Create( MainMenu1 );
end;
 
end. 
Induláskor azonnal "Class TMenuItem not found.".


Valami még nem jó.

Custom MenuItem 2016 febr. 20 17:32 #1856

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
A szülő osztályra írja: "TMenuItem class not found" , nem az én TMyMenuItem osztályomra.
A "MenuItem1: TMyMenuItem;" dekralálásával létrejött az objektum. Vagy valamit nem veszek figyelembe?
Próbáltam a Form1 OnCreate eseményében kapcsolni a MainMenu1-hez, de ugyanaz a hiba:
procedure TForm1.FormCreate(Sender: TObject);
begin
  MenuItem1.SetParentComponent(MainMenu1);
end; 

Custom MenuItem 2016 febr. 20 15:18 #1855

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 503
  • Köszönetek: 86
A kódodban nem látom, hol hozod létre a saját menüelemedet. Ez esetben ugyanis neked kell futásidőben létrehoznod és a megfelelő szülőhöz (pl. főmenü) kapcsolnod...
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

Custom MenuItem 2016 febr. 20 13:27 #1854

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Üdv!
Egy CustomMenuItem osztályt szeretnék létrehozni. Csak egy property-vel szeretném kiegészíteni a TMenuItem-et (pl. level: integer).
A Form1 "MenuItem1: TMenuItem;" részét átírtam "MenuItem1: TMyMenuItem;" de valami nem egészen jó:
  { TMyMenuItem }
  TMyMenuItem = class(TMenuItem)
    procedure SetLevel( level: integer );
    function GetLevel(): integer;
  private
    { private declarations }
  public
    { public declarations }
  // published
  property
    level: integer read GetLevel write SetLevel;
  end;
 
 
  { TForm1 }
 
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    MenuItem1: TMyMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TMyMenuItem }
 
// set level
procedure TMyMenuItem.SetLevel( level: integer );
begin
  self.level:=level;
end;
 
 
// get level
function TMyMenuItem.GetLevel(): integer;
begin
  Result:=self.level;
end;
 
 
 
{ TForm1 }
// onshow
procedure TForm1.FormShow(Sender: TObject);
begin
  MenuItem1.SetLevel( 1 );
  ShowMessage( 'Level: ' + IntToStr( MenuItem1.GetLevel ) );
  MenuItem1.SetLevel( 12 );
  ShowMessage( 'Level: ' + IntToStr( MenuItem1.GetLevel ) );
end;
 

Futáskor "TMenuItem class not found" hibát ad. Mit rontok el?

  • Oldal:
  • 1