[gelöst] Ereignis in eigener Komponente einfügen

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
juelin
Beiträge: 237
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

[gelöst] Ereignis in eigener Komponente einfügen

Beitrag von juelin »

Hallo Lazarus-Gemeinde,
ich beschäftige mich gerade mit Class, Instanz und Komponenten.
Das klappt auch schon ganz gut.
Ich kann Class TScore anlegen und auch damit als Instanz arbeiten.
In meinem Übungsprogramm habe ich zwei Units.
Unit Component ist main Mainunit mit dem Formular

Code: Alles auswählen

unit Component;

{$mode objfpc}{$H+}

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TScore;
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  Label2.Destroy;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Label2:=TScore.Create(Form1, 'Tom');
end;

end.

[code]

Unit Score ist meine eigene class TScore
unit Score;

{$mode ObjFPC}{$H+}

interface

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

type
TScore = class (TLabel)
private
Vname: string;
public
Stand: integer;
constructor Create(Besitzer: TForm; Vorname: string);
procedure erhoehen;
function getName: string;
end;

implementation

constructor TScore.Create(Besitzer: TForm; Vorname: string);
begin
inherited Create(Besitzer);
Alignment:=taCenter;
Autosize:=False;
Color:=clNavy;
Font.Color:=clYellow;
Font.Name:='Arial Black';
Font.Size:=16;
Font.Style:=[fsBold];
Height:=32;
Left:=10;
Top:=100;
Transparent:=False;
Visible:=True;
Width:=962;
Vname:=Vorname;
Stand:=0;
end;

procedure TScore.erhoehen;
begin
Stand:=Stand+100;
end;

function TScore.getName: string;
begin
Result:=Vname;
end;

end.

[/code]

Nun zu meinem Problem.
1. Wie Ihr sehen könnt habe ich TScore im mainunit in der Form1 als Label2 eingefügt
Aber es wird nicht angezeigt. Warum?????????????

2. Ich würde gerne in meiner class TScore ein Event OnChange einfügen.
Der Event soll aufgerufen werden, wenn sich der Wert in Stand ändert.
Habe aber keine Ahnung wie man das macht.

Könnt Ihr mir helfen?
Am besten mit Beispielcode.

Danke für die Hilfe
und Gruß
Jürgen
Zuletzt geändert von juelin am Do 20. Feb 2025, 14:26, insgesamt 1-mal geändert.

Benutzeravatar
Zvoni
Beiträge: 363
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Ereignis in eigener Komponente einfügen

Beitrag von Zvoni »

Anbei
project1.zip
(2.57 KiB) 35-mal heruntergeladen
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: Ereignis in eigener Komponente einfügen

Beitrag von theo »

Ja, aber sehen tut man es immer noch nicht.
Da fehlt der Parent:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label2:=TScore.Create(Form1, 'Tom');
  Label2.Parent:=Self; //<---
  //Zuweisung des Ereignisses
  Label2.OnChange:=@ScoreChange;
end;     
Btw. ist bei euch das Int. Forum auch down?
http://forum.lazarus.freepascal.org/ind ... tion=forum

Benutzeravatar
Zvoni
Beiträge: 363
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Ereignis in eigener Komponente einfügen

Beitrag von Zvoni »

theo hat geschrieben: Do 20. Feb 2025, 11:02 Ja, aber sehen tut man es immer noch nicht.
Da fehlt der Parent:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label2:=TScore.Create(Form1, 'Tom');
  Label2.Parent:=Self; //<---
  //Zuweisung des Ereignisses
  Label2.OnChange:=@ScoreChange;
end;     
*grmpf*
Den vergess ich dauernd.
Andererseits: Müsste man doch im OnCreate des TScore machen, da Ja Form1 als "Besitzer" mitgeschickt wird
Btw. ist bei euch das Int. Forum auch down?
http://forum.lazarus.freepascal.org/ind ... tion=forum
Nö, funzt
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
juelin
Beiträge: 237
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Ereignis in eigener Komponente einfügen

Beitrag von juelin »

Hallo,
Danke für Eure Beiträge.
Leider kann man bei mir das Label2 nicht in Form1 sehen.

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label2:=TScore.Create(Form1, 'Tom');
  Label2.Parent:=Self;
  Label2.OnClick:=@LabelClick;
  Label1.Caption:='';
  Label2.Caption:='';
end;
Obwohl ich alles (auch Parent) gemacht habe.
Woran könnte das liegen???
Gruß
Jürgen

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1639
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Ereignis in eigener Komponente einfügen

Beitrag von fliegermichl »

juelin hat geschrieben: Do 20. Feb 2025, 12:53 Hallo,
Danke für Eure Beiträge.
Leider kann man bei mir das Label2 nicht in Form1 sehen.

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label2:=TScore.Create(Form1, 'Tom');
  Label2.Parent:=Self;
  Label2.OnClick:=@LabelClick;
  Label1.Caption:='';
  Label2.Caption:='';
end;
Obwohl ich alles (auch Parent) gemacht habe.
Woran könnte das liegen???
Gruß
Jürgen
Na wenn die Caption leer ist, was erwartest du dann zu sehen zu bekommen?

Benutzeravatar
juelin
Beiträge: 237
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Ereignis in eigener Komponente einfügen

Beitrag von juelin »

Hi,
mein letzter Post Label wird nicht angezeigt hat sich erledigt.
Habe den Fehler gefunden (im Form Event hat der Eintraf OnCreate gefehlt).
Warum auch immer, war ja schon drin.
Egal.
Aber noch eine Frage.
Um den Event Labvel2.OnChange zu benutzen muss doch in der Unit Score irgendeas angegeben werden.
TLabel hat ja von Haus aus diesen Event nicht.
bitte noch mit Beispiel antworten.
Danke und Gruß
Jürgen

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: Ereignis in eigener Komponente einfügen

Beitrag von theo »

juelin hat geschrieben: Do 20. Feb 2025, 13:51 Um den Event Labvel2.OnChange zu benutzen muss doch in der Unit Score irgendeas angegeben werden.
Das ist doch alles in dem Beispiel (project1.zip) von Zvoni drin?
Rund um "OnChange" bzw. "FOnChange".
Was fehlt denn?

Benutzeravatar
juelin
Beiträge: 237
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Ereignis in eigener Komponente einfügen

Beitrag von juelin »

ja theo, du hast recht.
Mein Fehler. Sorry.
Es klappt jetzt alles super.
Danke an alle.
Gruß
Jürgen

Antworten