[gelöst] Lazarus Componente erstellen

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
juelin
Beiträge: 260
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] Lazarus Componente erstellen

Beitrag von juelin »

Hallo,
ich möchte eine eigene Lazarus-Komponete erstellen.
Die Komponete TScore habe ich erstellt und läuft in meinem Programm (siehe Anhang).
Nun wollte ich auch ein Icon in Lazarus-Komponenten für meine Komponente haben.
Dazu bin ich vorgegangen wie in "https://wiki.freepascal.org/How_To_Writ ... _Component" beschrieben.
1. erstelle ich ein neues Package und speichere in meinem Ordner package.
2. Ich erstelle eine neue Komponente mit Type TLabel, Class TScore, Palette Standard und Unit Score.pas mit Icon
3. Ich compeliere das Package
4. ich installiere das Package.
Wenn ich das so mache funktioniert auch alles.
Blos habe ich dann ein Package ohne meine Anforderungen.
Wenn ich also zwischen Schritt 2 und Schritt 3 meine Änderungen aus Score.pas (Anhang) einfüge
dann Compeliert das Packge ohne Fehler und auch die Installation klappt.
Aber wenn Lazarus dann neu startet bricht es nahc einer Weile wieder ab (kommt nicht richtig hoch).
Habe keine Ahnung warum.
Hat da jemand ein Tipp für mich???
Danke und Gruß
Jürgen
Dateianhänge
Komponente.zip
(4.98 MiB) 35-mal heruntergeladen
Zuletzt geändert von juelin am Di 25. Feb 2025, 21:27, insgesamt 1-mal geändert.

wennerer
Beiträge: 609
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Lazarus Componente erstellen

Beitrag von wennerer »

Hallo juelin,
ich kann in deinem Anhang keine Komponente finden.
Mach mal folgendes:
Package
Neues Package
gib einen neuen Namen ein oder lass NewPackage.lpk drin
speichere es in einem leeren Ordner ab
Es sollte nun ein Fenster wie dieses zu sehen sein:
NewPackage.png
NewPackage.png (37.35 KiB) 2694 mal betrachtet
Hier auf Hinzufügen
Neue Komponente
Es öffnrt sich dieser Dialog:
NeueKomponente.png
NeueKomponente.png (44.57 KiB) 2694 mal betrachtet
Zuerst angeben von was du ableiten möchtest
Dann der Name deiner Komponente
Der Reiter in dem die Komponente erscheinen soll (Neuer Name = Neue Lasche)
Das Verzeichnis so lassen wie es ist
Bei den Icons reinklicken und auswählen

Dann Neue Komponente erzeugen
Der Dialog schließt sich.

Jetzt in dem vorherigen Fenster auf Verwenden und installieren.
Lazarus wird neu kompilliert.
Nach dem Neustart befindet sich deine eben erzeugte Komponente in dem Reiter den du angegeben hast.

Viele Grüße
Bernd

Benutzeravatar
juelin
Beiträge: 260
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: Lazarus Componente erstellen

Beitrag von juelin »

Hallo wernnerer,
sieh im Anhang das File score.pas.
Gruß
Jürgen

wennerer
Beiträge: 609
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Lazarus Componente erstellen

Beitrag von wennerer »

Hallo,
dir fehlt da aber die "procedure Register". Wenn du es so machst wie von mir beschrieben dann hast du die automatisch drin.

Viele Grüße
Bernd

Mathias
Beiträge: 6926
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Lazarus Componente erstellen

Beitrag von Mathias »

Hallo juelin,
ich kann in deinem Anhang keine Komponente finden.
Ich vermute, er meint "TScore".
ich möchte eine eigene Lazarus-Komponete erstellen.
Die Komponete TScore habe ich erstellt und läuft in meinem Programm (siehe Anhang).
Dies hatte ich früher auch gemacht, aber unterdessen mache ich dies nicht mehr, ich lade eigenes Zeugs dynamidch rein, so wie es gegenwärtig bei dir ist.
Wen man eigens Komponenten in die IDE integriert, kommt es spätestens zu Fehlern, sobald man Lazarus neu installiert, oder wen man die Sourcen weiter gibt. Man muss dann imer schön darauf achten, das man alles schön brav installiert, bis die Source wieder läuft. Beim dynamischen Laden reicht es, wen man Zugriff zu der Unit mit der Komponente hat.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wennerer
Beiträge: 609
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Lazarus Componente erstellen

Beitrag von wennerer »

Und wie bekommst du dann ein Icon in einen Reiter von Lazarus?

Benutzeravatar
juelin
Beiträge: 260
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: Lazarus Componente erstellen

Beitrag von juelin »

also procedure Register wird in dem PAS-File, das beim erstellen neue Komponete erzeugt wird angelegt.
In meinem programm (Anhang) brauche ich ja Register nicht.
Beim alnegen neue Komponente kann man auch das Picture für das Icon laden.
Gruß
Jürgen

Benutzeravatar
juelin
Beiträge: 260
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: Lazarus Componente erstellen

Beitrag von juelin »

nochmal zur Verdeutlichung.
Wenn ich mit folgenden Code in Score.pas installiere funktioniert es.

Code: Alles auswählen

unit Score.pas;

{$mode ObjFPC}{$H+}

interface

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

type
  TScore = class(TLabel)
  private

  protected

  public

  published

  end;

procedure Register;

implementation

procedure Register;
begin
  {$I score.pas_icon.lrs}
  RegisterComponents('Standard',[TScore]);
end;

end.
Wenn ich aber mit folgenden Code in Score.pas installiere funktioniert Lazarus nicht mehr.

Code: Alles auswählen

unit Score.pas;

{$mode ObjFPC}{$H+}

interface

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

type
  TScore = class(TLabel)
  private
    EOnChange: TNotifyEvent;                                                  // Das Event OnChange
    Vname: string;                                                            // Variable Vorname
    Stand: integer;                                                           // Variable Anzahl Punkte im Score
    Standalt: integer;                                                        // Variable letzter Stand von Variable Stand
    procedure SetOnChange(AValue: TNotifyEvent);                              // Laden Event in FOnChange
  protected
  public
    constructor Create(AOwner: TComponent; Besitzer: TForm; Vorname: string); reintroduce;  // ertellen Komponente TScore
    destructor Destroy; override;                                             // zerstören Komponente TScore
    procedure erhoehen(Wert: integer);                                        // erhöht den Wert von Stand um Wert
    Property OnChange:TNotifyEvent read EOnChange write SetOnChange;          // Das Ereignis OnChange
    function getName: string;                                                 // gibt den Vornamen zurück
    function getStand: integer;                                               // gibt den Stand zurück
  published
  end;

procedure Register;

implementation

constructor TScore.Create(AOwner: TComponent; Besitzer: TForm; Vorname: string);
begin
  inherited Create(AOwner);
  Parent:=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;
  Standalt:=0;
end;

destructor TScore.Destroy;
begin
  inherited Destroy;
end;

procedure TScore.SetOnChange(AValue: TNotifyEvent);
begin
  if EOnChange=AValue then Exit;
  EOnChange:=AValue;
end;

procedure TScore.erhoehen(Wert: integer);
begin
  Stand:=Stand+Wert;
  if Stand <> Standalt then
  begin
    If Assigned(EOnChange) Then EOnChange(Self);                                // Event auslösen
    Standalt:=Stand;
  end;
end;

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

function TScore.getStand: integer;
begin
  Result:=Stand;
end;

procedure Register;
begin
  {$I score.pas_icon.lrs}
  RegisterComponents('Standard',[TScore]);
end;

end.
Gruß
Jürgen
neue_Komponente.jpg
neue_Komponente.jpg (36.11 KiB) 2618 mal betrachtet

wennerer
Beiträge: 609
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Lazarus Componente erstellen

Beitrag von wennerer »

Hallo,
also ich hab es eben mal bei mir getestet und die Komponente neu erstellt. Bei mir erstellt es eine neue Lasche mit aExample, dort drin ist TScore. Wenn du es testen willst
Package
Package datei (lpk) öffnen
Im Anhang zur lpk navigieren und installieren.
score.png
score.png (45.82 KiB) 2600 mal betrachtet
Viele Grüße
Bernd
Dateianhänge
Temporär.zip
(18.21 KiB) 51-mal heruntergeladen
Zuletzt geändert von wennerer am Mi 26. Feb 2025, 08:40, insgesamt 1-mal geändert.

Benutzeravatar
juelin
Beiträge: 260
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: Lazarus Componente erstellen

Beitrag von juelin »

Hallo Bernd,
danke.
Jetzt hat es geklappt.
Weiss zwar noch nicht warum bei mir nicht.
Habe gefunden in meinem lpk-file zu viel am Anfang 2 mal '<PathDelim Value="\"/>'.
Hast du ne Ahnung warum?
Viele Grüße
Jürgen
Zuletzt geändert von juelin am Di 25. Feb 2025, 22:10, insgesamt 1-mal geändert.

wennerer
Beiträge: 609
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: [gelöst] Lazarus Componente erstellen

Beitrag von wennerer »

Hallo Jürgen,
freut mich wenn es geklappt hat. Aber das Erstellen ist manchmal etwas knifflig. Passiert mir auch manchmal das ich es nochmal lösche und von Vorne anfange :D
Warum in der lpk was fehlt weiß ich leider nicht. Vielleicht kann einer der Profis was dazu sagen.

Viele Grüße
Bernd

Antworten