Lazarus 2.0.12 (2020.02.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Probléma futásidőben létrehozandó objektumokkal 2021 jan. 20 13:05 #2422

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 38
  • Köszönetek: 3
Majdnem, a "^" operátor a pascal mutató operátora, c-ben a mutató a "*" operátor, a pascalban a "@" a cim operátor, és ha igaz akkor c-ben is..., és a használat módja is olyan mint a c-ben.
Windows 10
CodeTyphon 7.2

Probléma futásidőben létrehozandó objektumokkal 2021 jan. 20 12:46 #2421

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 48
  • Köszönetek: 1
Köszönöm az alapos választ, Gábor!
Tehát ha így elsőre jól értelmezem, akkor a @ használatával kiküszöböljük azt az esetleges hibát, hogy nincs, vagy nem megfelelő a visszaadott érték? És ez lenne a Pascalban az az operátor, ami pl. a C-ben a ^?

Probléma futásidőben létrehozandó objektumokkal 2021 jan. 19 19:40 #2418

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 459
  • Köszönetek: 76
Egy eljárás nevének használata az eljárás lefuttatásának kérését (és ha van mit és van hol, akkor a visszatérési érték használatát) jelenti.
A @ operátor (mutató = pointer) használata az adott elem memóriabeli címét (belépési pont) jelenti.

@ nélkül:
Ha az értékadásban használt eljárás egy function akkor a változó az eljárás által visszaadott értéket veszi át, de ha a visszaadott adat típusa nem megfelelő akkor adattípus hiba keletkezik.
Ha az értékadásban használt eljárás egy procedure akkor a használat érvénytelen, hiszen nincs visszatérési adat és nincs érték amit a változó átvegyen.

@ használatával:
Függetlenül attól, hogy az értékadásban használt eljárás function vagy procedure, a változó az adott eljárás memóriabeli helyének címét veszi át.
Természetesen ilyenkor is keletkezhet adattípus hiba, ha az eljárás deklarációja eltér a változó típusának deklarációjától (paraméterek és visszatérési adattípus).

Mivel nem lenne szép és csak zavart okozna a kód értelmezésében az eltérő értékadási szintaxis használata a function és a procedure eljárások esetén, ezért ilyen értékadásokban az egyértelműség miatt már az ősidők óta használatos a @ operátor.

A @ operátor (mutató = pointer) egébként változók esetén is alkalmazható, azok memóriabeli címének megszerzésére / használatára.
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- FPC 3.3.1 -- Lazarus 2.1.0 -- GNU/Linux 5.4.0 x86_64

Probléma futásidőben létrehozandó objektumokkal 2021 jan. 14 09:26 #2409

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 48
  • Köszönetek: 1
De mi a különbség az eljárás neve és címe között? Előbbi miért nem volt jó a programnak?

Probléma futásidőben létrehozandó objektumokkal 2021 jan. 12 18:23 #2406

  • progmokus
  • progmokus profilkép
  • Haladó forumozó
  • Haladó forumozó
  • "Amit egyszer leírok..., azt lehet később átírom"
  • Hozzászólások: 38
  • Köszönetek: 3
Hi!

Úgy van ahogy Gábor írta, és a "@" jellel adod át az eljárás címét ("$mode objfpc"), azaz idozito.ontimer legyenegyenlő az eljárásod címével.
Windows 10
CodeTyphon 7.2

Probléma futásidőben létrehozandó objektumokkal 2021 jan. 12 14:11 #2405

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 48
  • Köszönetek: 1
Végül így sikerült a programocskát működőképessé összeraknom Gábor kódja alapján, csak azt nem tudom, hogy mit jelent, miért kell a @ jel?
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, LCLintf, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure progstart(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
  idozito: TTimer;
  cimke: TLabel;
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.progstart(Sender: TObject);
begin
  FreeandNil(idozito);
  cimke:=TLabel.Create(nil);
  cimke.parent:=Form1;
  cimke.left:=20;
  cimke.top:=20;
  cimke.Caption:='Siker!';
  cimke.Visible:=true;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  idozito:=TTimer.Create(nil);
  idozito.interval:=1000;
  idozito.ontimer:=@progstart;
end;
 
end.

Probléma futásidőben létrehozandó objektumokkal 2021 jan. 12 13:17 #2404

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 48
  • Köszönetek: 1
Hű, ez egy kicsit bonyolult nekem... :lol: Pl. mit jelent a @ a Lazarusban ("idozito.OnTimer:=@Form1.idozitoOntimer;")? Milyen utasítás ez?
Egy hibát azért sikerült azóta kiküszöbölnöm, mégpedig a KillTimer(0,idozito) helyett a FreeAndNil(idozito) parancs használatával.
De az idozito.OnTimer:=progstart(); még mindig nem tetszik neki valamiért...
A program lényege az volna, hogy az ablak (a Form1) létrejöttekor induljon el az időzítő, és lejártakor hozza létre a címkét. Mindez úgy történjen, hogy az időzítő és a címke is futásidőben jöjjön létre, ne pedig az Eszközsorból odahúzós módszerrel.

Probléma futásidőben létrehozandó objektumokkal 2021 jan. 12 11:27 #2403

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 459
  • Köszönetek: 76
Parancsolj!
Fontos megjegyezni, hogy a TTimer.OnTimer ^^ eseménykezelője egy TNotifyEvent ^^ és a deklaráció szerint ennek egy TObject leszármazott részének kell lennie.
Már csak az a kérdés mi a terv az időzítővel...
unit Unit1;
{$mode objfpc}{$H+}
 
interface
 
uses  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, LCLintf, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  public
    // ezek lehetnek a TForm1 részei
    {idozito: TTimer;}
    {cimke: TLabel;}
    {procedure createLabel;}
    {procedure createTimer;}
 
    procedure idozitoOnTimer(Sender: TObject);
  end;
 
var
  Form1: TForm1;
  idozito: TTimer; // ez lehet a TForm1 része, de akkor innen törölni kell
  cimke: TLabel; // ez lehet a TForm1 része, de akkor innen törölni kell
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure createLabel; // vagy {procedure TForm1.createLabel;}
begin
  cimke:=TLabel.Create(nil);
  cimke.left:=20;
  cimke.top:=20;
  cimke.Caption:='Siker! :)';
  cimke.Parent:=Form1; // vagy {cimke.Parent:=Self;}
end;
 
procedure createTimer; // vagy {procedure TForm1.createTimer;}
begin
  idozito:=TTimer.Create(nil);
  //idozito.enabled:=false; // false értékre megáll az időzítő (alapérték a true), erre csak akkor van szükség ha nem akarod, hogy azonnal induljon, később true értéket adva neki elindítható az időzítő
  idozito.interval:=500;
  idozito.OnTimer:=@Form1.idozitoOntimer; // vagy {idozito.OnTimer:=@idozitoOntimer;}
end;
 
procedure TForm1.idozitoOnTimer(Sender:TObject);
begin
  if length(cimke.Caption) < 10
    then cimke.Caption := 'Siker! :) '
    else cimke.Caption := 'Siker! :D';
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  createLabel;
  createTimer;
end;
 
end.
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- FPC 3.3.1 -- Lazarus 2.1.0 -- GNU/Linux 5.4.0 x86_64

Probléma futásidőben létrehozandó objektumokkal 2021 jan. 12 09:32 #2402

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 48
  • Köszönetek: 1
Sziasztok!
Nektek bizonyára könnyű lesz ezt megválaszolni, de én napok óta töröm a fejem ezen, és az internet bújása sem hozott megoldást, ezért felteszem itt a kérdésem: ebben a kis programkezdeményemben hogyan lehet futásidőben létrehozni az objektumokat, azaz egy időzítőt (TTimer) és egy címkét (TLabel)?
Valamiért nem tetszik neki a KillTimer(0,idozito); és az idozito.ontimer:=progstart(idozito); sor sem.
Itt a teljes program:
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, LCLintf, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
  idozito: TTimer;
  cimke: TLabel;
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure progstart(Sender: TTimer);
begin
  KillTimer(0,idozito); //HIBA!!!
  cimke:=TLabel.Create(nil);
  cimke.left:=20;
  cimke.top:=20;
  cimke.Caption:='Siker!';
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  idozito:=TTimer.Create(nil);
  idozito.interval:=500;
  idozito.enabled:=true;
  idozito.ontimer:=progstart(idozito); //ITT IS HIBA!!!
end;
 
end.

  • Oldal:
  • 1