Gelöst: Problem mit Komponente aus Industrial Stuff

Rund um die LCL und andere Komponenten
Antworten
Linkat
Lazarusforum e. V.
Beiträge: 530
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 21.3; Lazarus 3.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 32
Wohnort: nr Stuttgart

Gelöst: Problem mit Komponente aus Industrial Stuff

Beitrag von Linkat »

Ich erzeuge die LED-Komponente aus Industrial Stuff, sie ist zwar vorhanden, aber nicht sichtbar.

In dem Beispielprogramm erzeuge ich zwei Komponenten aus Indutrial Stuff und einen Button. Während LEDNumber und Button da sind, wo sie sein sollen, ist die LED (TAdvLed) nicht sichtbar.

Code: Alles auswählen

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, Buttons,
  StdCtrls, AdvLed, LedNumber;
 


Code: Alles auswählen

var led     :TAdvLed;
    b       :TButton;
    ledn    :TLEDNumber;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
   ledn:=TLEDNumber.Create(Self);
   ledn.Parent:=Form1;
   ledn.Top:=50;
   led:=TAdvLed.Create(Self);
   led.Parent:=Form1;
   led.Top:=100;
   led.Tag:=123;
   b:=TButton.Create(Self);
   b.Parent:=Form1;
   b.Top:=150;
   b.Caption:=IntToStr(led.Tag);
end;
 


Die nicht sichtbare LED sollte zwischen dem LED-Label und dem Button sein.

Aber ich kann den Tag=123 im Button zeigen. Das heißt, die Komponente ist zwar da, aber nicht sichtbar.

Hat jemand eine Idee?

Das Projekt habe ich anghängt.
Dateianhänge
Test.zip
(326.45 KiB) 99-mal heruntergeladen
FehlendeLED.png
FehlendeLED.png (6.14 KiB) 1701 mal betrachtet
Zuletzt geändert von Linkat am Mo 2. Sep 2019, 19:03, insgesamt 1-mal geändert.
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Problem mit Komponente aus Industrial Stuff

Beitrag von Socke »

Mir fällt nur auf, dass du immer nur Top setzt, die anderen Dimensionen (Left, Width, Height) aber außer Acht lässt.
Ändert sich etwas, wenn du diese Eigenschaften ebenfalls setzts?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Linkat
Lazarusforum e. V.
Beiträge: 530
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 21.3; Lazarus 3.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 32
Wohnort: nr Stuttgart

Re: Problem mit Komponente aus Industrial Stuff

Beitrag von Linkat »

Dies ist nur ein abgespecktes Test-Programm. In meinem Hauptprogramm habe ich natürlich schon viel rumprobiert (left, top, align etc.).
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Problem mit Komponente aus Industrial Stuff

Beitrag von Socke »

Ich habe gerade keine installierten Industrial Komponenten da um das zu testen; daher hatte ich erst einmal geraten. :roll:
Weiter fällt mir nur noch die Visible-Eigenschaft ein. Welchen Wert hat die?

Du kannst auch einen TTIPropertyGrid (Reiter RTTI) auf das Formular legen, dessen Eigenschaft TIObject zur Laufzeit mit deiner LED befüllen und dann zur Laufzeit alle Eigenschaften anzeigen und bearbeiten.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem mit Komponente aus Industrial Stuff

Beitrag von wp_xyz »

Ich kann den Fehler bestätigen. Aber wenn die LED zur Designzeit aufs Formular geklickt wird, funktioniert alles.

Mit fällt auf, dass die Methode BitmapNeeded, die die Standard-Bilder aus der Resource liest, in Constructor nur im design-Mode aufgerufen wird. Dann gibt es noch die Loaded-Methode, die die "if necessary" liest. Problem ist, dass Loaded bei zur Laufzeit erzeugten Komponenten gar nicht aufgerufen wird...

Ich denke, es reicht, das "if csDesigning in ComponentState" im Constructor auszukommentieren. Und die Loaded-Methode würde ich neu schreiben, denn hier im Designmode gar nicht die geerbte Methode aufzurufen erscheint mir falsch. Also:

Code: Alles auswählen

// create control
constructor TAdvLed.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := ControlStyle - [csSetCaption];
  AutoSize:=True;
  FGlyphs[lsOn] := TLedBitmap.Create;
  FGlyphs[lsOff] := TLedBitmap.Create;
  FGlyphs[lsDisabled] := TLedBitmap.Create;
  FGlyphs[lsOn].OnChange:= @GlyphChanged;
  FGlyphs[lsOff].OnChange:= @GlyphChanged;
  FGlyphs[lsDisabled].OnChange:= @GlyphChanged;
  FBlinkTimer := TTimer.Create(nil);
  FBlinkTimer.OnTimer := @DoTimer;
  FBlinkTimer.Enabled := false;
  //if (csDesigning in ComponentState) then
  BitmapNeeded;
end;
 
// loaded
procedure TAdvLed.Loaded;
begin
  inherited;
  if FKind <> lkCustom then
    BitmapNeeded;
end;

Die Art, wie die benutzerdefinierten Bitmaps verwendet werden, ist gewöhnungsbedürftig. Man muss zuerst Kind auf lkCustom setzen und dann die entsprechenden Bitmaps in GlyphDisabled, GlyphOff und GlyphOn einladen. Danach darf man Kind nicht mehr verändern, sonst gehen die Custom-Bitmaps verloren.

Bitte testen. Wenn es damit keine Probleme gibt, lade ich die Änderung ins offizielle Repo hoch.

Linkat
Lazarusforum e. V.
Beiträge: 530
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 21.3; Lazarus 3.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 32
Wohnort: nr Stuttgart

Re: Problem mit Komponente aus Industrial Stuff

Beitrag von Linkat »

Hallo wp_xyz,
vielen Dank für die schnelle Hilfe.
Es funktioniert.

Kaum zu glauben, dass du den Quelltext durchblickst.
Du musst eine Menge Wissen und Erfahrung haben. Alle Achtung!!

Viel Erfolg bei der Beseitigung weiterer Fehler.

Gruß, Linkat
Dateianhänge
ohneFehler.png
ohneFehler.png (10.09 KiB) 1686 mal betrachtet
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

Antworten