Lazarus 2.0.10 (2020.07.11.)
Letöltés

file Probléma futásidőben létrehozandó objektumokkal

  • Tomi
  • Tomi profilkép
  • Haladó fórumozó
  • Haladó fórumozó
  • Hozzászólások: 34
  • Köszönetek: 1

Tomi válaszolt a témára: Probléma futásidőben létrehozandó objektumokkal

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?
#2409

  • progmokus
  • progmokus profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 14
  • Köszönetek: 0

progmokus válaszolt a témára: Probléma futásidőben létrehozandó objektumokkal

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.
#2406

  • Tomi
  • Tomi profilkép
  • Haladó fórumozó
  • Haladó fórumozó
  • Hozzászólások: 34
  • Köszönetek: 1

Tomi válaszolt a témára: Probléma futásidőben létrehozandó objektumokkal

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.
#2405

  • Tomi
  • Tomi profilkép
  • Haladó fórumozó
  • Haladó fórumozó
  • Hozzászólások: 34
  • Köszönetek: 1

Tomi válaszolt a témára: Probléma futásidőben létrehozandó objektumokkal

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.
#2404

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 436
  • Karma: 8
  • Köszönetek: 70

Gábor válaszolt a témára: Probléma futásidőben létrehozandó objektumokkal

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.
#2403

  • Tomi
  • Tomi profilkép
  • Haladó fórumozó
  • Haladó fórumozó
  • Hozzászólások: 34
  • Köszönetek: 1

Tomi létrehozta a témát: Probléma futásidőben létrehozandó objektumokkal

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.
#2402