Ein Slider, mal testen

Zur Vorstellung von Komponenten und Units für Lazarus
wennerer
Beiträge: 507
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: Ein Slider, mal testen

Beitrag von wennerer »

Hallo Michael,
vielen Dank. Hab es grade probiert, funktioniert wunderbar.
Jetzt muss ich nur noch ausknobeln wie ich die Größe der Slider Komponente verändere so dass das Label schön rein passt und die Proportionen des Sliders noch passen. Aber das sollte ich mit etwas Zeit hin bekommen.

Viele Grüße
Bernd

wennerer
Beiträge: 507
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: Ein Slider, mal testen

Beitrag von wennerer »

Hallo Forum,
ich scheitere mal wieder am handwerklichen Basiswissen und hoffe das mir jemand zeigt wie es richtig geht.
Ich möchte ein Label in meiner Komponente nutzen.

Fliegermichl schrieb:
type
TMyComponent = class ( TWinControl )
private
fLabel : TLabel;
published
property CaptionLabel : TLabel read fLabel write fLabel;
end;
Nach ersten Erfolgen hab ich mich da zu früh gefreut. Trotz Suche im Internet und im alten Delphi Buch bekomme ich's nicht hin.

Folgenden Code habe ich eingefügt:

Code: Alles auswählen

TSliderComponent = class (TCustomControl) 
  private 
   ....
   FTextLabel       : TLabel;
  protected
   ....
  public  
   ....
  published
   ....
   property TextLabel : TLabel read FTextLabel write FTextLabel;
end;

constructor TSliderComponent.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ....
  FTextLabel             := TLabel.Create(self);
  FTextLabel.Parent      := self;
  FtextLabel.Visible     := false;
  FtextLabel.Transparent := false;
  FTextLabel.Color       := cllime;
  FtextLabel.Caption     := 'TEST';
end;                    

destructor TSliderComponent.Destroy;
begin
 .... 
 FTextLabel.Free;
 inherited Destroy;
end;

procedure TSliderComponent.Paint;
begin
 ....
FTextLabel.Paint;
end;  
Ergebnis:
Das Label erschein im OI. Ich kann Änderungen vornehmen und die werden auch im Design-Zustand in der Slider Komponente angezeigt.

Zur Laufzeit werden die Änderungen vom OI aber nicht übernommen.
Slider mit Label.png
Slider mit Label.png (49.15 KiB) 4871 mal betrachtet
Ich habe mittlerweile schon die abenteurlichsten Versuch ohne Erfolg unternommen.

Viele Grüße Bernd

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Ein Slider, mal testen

Beitrag von siro »

Hallo Bernd,
ich hab das grad mal versucht zu ergründen, aber da fehlt mir anscheinend auch noch das Wissen,
aber eines konnte ich feststellen:

Er schreibt die Eigenschaften, welche Du änderst im Objectinspector, nicht in den Stream, also in die .lfm Datei.
Zumindest nicht die vom TextLabel.
Somit durchläuft das Programm beim Starten nur den Construtor, wo Du deine Grundinitialisierung machst.
Danach sollte er "eigentlich" die gesetzten/geänderten Werte aus der .lfm Datei laden, aber da steht nix drin
für deinen Label habe ich festgestellt. Hier müssen wir mal die anderen Experten zu Rate ziehen.

Für jedes Formular existiert ja eine .lfm Datei,
wenn ich nun deinen Slider drauf setze und Werte ändere, sieht das leider nur so aus:

Code: Alles auswählen

object Form1: TForm1
  Left = 392
  Height = 240
  Top = 130
  Width = 320
  Caption = 'Form1'
  ClientHeight = 240
  ClientWidth = 320
  LCLVersion = '2.0.8.0'
  object SliderComponent1: TSliderComponent
    Left = 21
    Height = 30
    Top = 55
    Width = 200
    Mark.Mark2Position = 0
  end
end
Ausserdem: das FTextLabel.Paint; brauchst Du nicht, durch das Setzen von Parent sollte das meiner Meinung nach und was ich auch grad ausprobiert habe,
auch funktionieren. TLabel ist ja nur ein GraphicControl und zeichnet sich selbst auf der Fläche (Canvas) vom Parent.

Ich habe mal folgendes versucht:
property TextLabel : TLabel read FTextLabel write FTextLabel stored TRUE;

Das scheint auch nichts zu ändern.
Wir brauchen unsere Experten... :wink:

Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

wennerer
Beiträge: 507
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: Ein Slider, mal testen

Beitrag von wennerer »

Herzlichen Dank Siro,
das du mal geschaut hast.
Du schreibst:
Ausserdem: das FTextLabel.Paint; brauchst Du nicht, durch das Setzen von Parent sollte das meiner Meinung nach und was ich auch grad ausprobiert habe,
auch funktionieren. TLabel ist ja nur ein GraphicControl und zeichnet sich selbst auf der Fläche (Canvas) vom Parent.
Ja das dachte ich auch. Aber wenn ich es so mache ist nichts zu sehen?

Code: Alles auswählen

public
    ....
    procedure Paint; override;
    ....
    
    
procedure TSliderComponent.Paint;
begin 
 ....
 //FTextLabel.Paint;
 end;   
Hab auch schon mal mit inherited Paint rum probiert. Brachte leider auch nichts. Machst du da was anders?

Viele Grüße
Bernd

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Ein Slider, mal testen

Beitrag von siro »

ja, ich habe im Constructor visible auf True gesetzt,
sonst konnte ich den Text garnicht sehen beim Starten... :wink:
in der Komponente:
FtextLabel.Visible := TRUE;

Das TRUE landet nämlich auch nicht in der .lfm Datei, wenn man es im Objectinspector einstellt.
nur so konnte ich überhaupt mal probieren was passiert.

Es gilt also nur zu lösen warum die TLabel Komponente die Eigenschaften nicht in der .lfm Datei speichert.
Zuletzt geändert von siro am So 10. Mai 2020, 18:49, insgesamt 2-mal geändert.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

wennerer
Beiträge: 507
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: Ein Slider, mal testen

Beitrag von wennerer »

Ja jetzt gehts auch bei mir :lol:
Viele Grüße

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

Re: Ein Slider, mal testen

Beitrag von wp_xyz »

siro hat geschrieben:
So 10. Mai 2020, 18:40
Es gilt also nur zu lösen warum die TLabel Komponente die Eigenschaften nicht in der .lfm Datei speichert.
Bin nicht ganz sicher, aber ich könnte mir vorstellen, dass du in der Komponente erst bestimmte Flags setzten musst, dass sie eine Kind-Komponente überhaupt streamt.

Aber: Warum muss der Slider überhaupt ein Label enthalten? Um eine Beschriftung auszugeben? Die kannst du in der Paint-Methode doch direkt selbst auf den Canvas schreiben, dafür brauchst du kein label.

wennerer
Beiträge: 507
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: Ein Slider, mal testen

Beitrag von wennerer »

Ja, da hast du natürlich recht. Werde den Weg wohl auch gehen. Aber wie es halt so ist wenn man sich mal was in den Kopf gesetzt hat sieht man zuletzt nicht mal mehr das Visible auf false steht. :D
Vielen Dank!
Bernd

PS. Wenn ich das einfüge

Code: Alles auswählen

 FTextLabel.Name:= 'TextLabel';
erscheint in der lfm das:

Code: Alles auswählen

object Form1: TForm1
  Left = 309
  Height = 240
  Top = 250
  Width = 320
  Caption = 'Form1'
  ClientHeight = 240
  ClientWidth = 320
  object SliderComponent1: TSliderComponent
    Left = 83
    Height = 30
    Top = 89
    Width = 200
    TextLabel = SliderComponent1.TextLabel
  end
end
Zuletzt geändert von wennerer am Di 12. Mai 2020, 16:31, insgesamt 1-mal geändert.

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

Re: Ein Slider, mal testen

Beitrag von fliegermichl »

Du musst das Label im Constructor natürlich auch erzeugen (genauso wie deinen Multiknob).

Code: Alles auswählen

fTextLabel := TLabel.Create(self);
fTextLabel.Parent := self;

// Damit die Eigenschaften des Labels zusammen mit deinem Slider in der lfm Datei gespeichert werden, musst du Lazarus mitteilen, 
// daß es sich um eine SubComponente handelt. Ansonsten bietet dir der Objektinspektor alle im Formular befindlichen Labels als TextLabel an.

fTextLabel.SetSubComponent(true);

wennerer
Beiträge: 507
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: Ein Slider, mal testen

Beitrag von wennerer »

Hallo Michael,
unglaublich was ein Befehl im Code ausmachen kann!
Jetzt geht es genauso wie es gehen soll.
Kannst dir zwar nichts dafür kaufen aber in meinem Code hab ich dich verewigt: :D

Code: Alles auswählen


//von fliegermichl 11.05.2020: FTextLabel.SetSubComponent(true);
//Damit die Eigenschaften des Labels zusammen mit deinem Slider in der lfm Datei
//gespeichert werden, musst du Lazarus mitteilen, daß es sich um eine SubComponente
//handelt. Ansonsten bietet dir der Objektinspektor alle im Formular befindlichen
//Labels als TextLabel an.

  FTextLabel             := TLabel.Create(self);
  FTextLabel.Parent      := self;
  FTextLabel.SetSubComponent(true);
  FTextLabel.Name        := 'TextLabel';
  FTextLabel.Visible     := true;
  FTextLabel.Transparent := false;
  //FTextLabel.Color       := cllime;
  //FTextLabel.Caption     := 'TEST';

end;    
Vielen Dank!
Bernd

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

Re: Ein Slider, mal testen

Beitrag von fliegermichl »

Vielen Dank :D

wennerer
Beiträge: 507
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: Ein Slider, mal testen

Beitrag von wennerer »

Okay,
wenn nicht ein fieser Bug (oder eine Todsünde)drin ist, wäre das nun meine letzte Version.

Die Beschreibung hier im Codefenster (sonst sind die Tabs weg):

Code: Alles auswählen

Beschreibung TSliderComponent

Besitzt der Slider den Fokus (erkennbar durch einen Rahmen) kann der Knopf mittels Pfeiltasten bewegt werden. 
Fährt man mit der Maus über den Knopf wechselt er die Farbe wenn er gefangen werden kann. Klickt man mit 
der Maus links bzw. rechts des Knopfes verschiebt sich der Knopf um ein Inkrement.

Eigenschaften:

BackgroundColor                     die Farbe des Hintergrundes
BorderColor                         die Farbe des Komponentenrahmens
BorderWidth                         Dicke des Stiftes der den Rahmen zeichnet
FocusColor1                         die Farbe des Basis-Fokusrechteckes (solid), nicht im OI
FocusColor2                         die Farbe des Oberen-Fokusrechteckes  (dot), nicht im OI
Height                              Höhe der Komponente, ist kein TextLabel aktiv ist es die Höhe des Sliders
KnobColor                           die Farbe des Knopfes
KnobLook                            Verändert die Erscheinung des Knopfes (klNormal, klRipped)
KnobLookColor                       die Farbe des Stiftes der den Knopf zeichnet - Nur aktiv wenn KnobLook = klRipped,nicht im OI 
KnobStyle                           die Form des Knopfes (ksCircle,ksRectangle,ksRoundrect,ksArrowUp,ksArrowRight,ksArrowDown,ksArrowLeft) 
Orientation                         legt fest ob der Slider waagrecht oder senkrecht gezeichnet wird (scHorizontal,scVertical)
Position                            setzt und liest die Position/Wert des Knopfes
RangeMax                            Maximal Wert des Sliders
RangeMin                            Minimal Wert des Sliders
Reversed                            dreht den Wertebereich um. Default links bzw. oben Minimum, Reversed links bzw oben Maximum
Width                               Breite der Komponente, ist kein TextLabel aktiv ist es die Breite des Sliders

Indicator.IndicatorColor            die Hintergrundfarbe der Wertanzeige
Indicator.IndicatorFontColor        die Schriftfarbe der Wertanzeige
Indicator.IndicatorVisible          zeigt bzw. versteckt die mitlaufende Wertanzeige

Mark.MarkColor                      die Farbe der beiden Markierungen
Mark.MarkPosition                   setzt die Position der 1. Markierung
Mark.MarkVisible                    zeigt bzw. versteckt die 1. Markierung
Mark.Mark2Position                  setzt die Position der 2. Markierung
Mark.Mark2Visible                   zeigt bzw. versteckt die 2. Markierung
MultiKnob.ColorKnob2                die Farbe des 2. Knopfes
MultiKnob.PosKnob2                  setzt und liest die Position/Wert des 2.Knopfes
MultiKnob.ShowKnob2                 zeigt bzw. versteckt den 2. Knopf
MultiKnob.ColorKnob3                die Farbe des 3. Knopfes
MultiKnob.PosKnob3                  setzt und liest die Position/Wert des 3.Knopfes
MultiKnob.ShowKnob3                 zeigt bzw. versteckt den 3. Knopf

Scale.BigMarkColor                  die Farbe der Zwischenmarkierungen
Scale.BigMarkInterval               legt den Abstand der Zwischenmarkierungen der Skala fest
Scale.BigMarkSize                   beeinflußt die Größe der Zwischenmarkierungen, nicht im OI (double)
Scale.ShowScale                     zeigt bzw. versteckt eine Skala
Scale.Interval                      legt den Abstand zwischen den Markierungen der Skala fest
Scale.LineColor                     die Farbe der Skalenlinie
Scale.MarkColor                     die Farbe der Skalenmarkierungen
Scale.OtherSide                     verschiebt die Skala auf die andere Seite
Scale.ScaleStyle                    das Aussehen der Markierung (ssCircle,ssDash)
Scale.ShowBigMark                   zeigt bzw. versteckt die größeren Zwischenmarkierungen

TextLabel.Caption                   Text im TextLabel
TextLabel.FillIn.AutoCount          zeigt den Wert des Sliders im Textfeld an
TextLabel.FillIn.Percent            zeigt den Wert des Sliders in Prozent im Textfeld an
TextLabel.FillIn.Prefix             Text vor AutoCount Wert
TextLabel.FillIn.Suffix             Text nach AutoCount Wert
TextLabel.Position                  legt die Positin des TextLabels fest (poBottom,poLeft,poTop,poRight)
TextLabel.Visible                   zeigt bzw. versteckt das TextLabel
    und alle geerbten Eigenschaften von TLabel!

Track.ExtraColor                    die Farbe der extra Farbspur
Track.ExtraRangeMax                 das Ende der extra Farbspur (muss höher als min und im Wertebereich sein!)
Track.ExtraRangeMin                 der Begin der extra Farbspur (muss niedriger als max und im Wertebereich sein!)
Track.SelColor                      die Farbe der beweglichen Farbspur
Track.ShowExtraColor                zeigt bzw. versteckt die extra Farbspur
Track.ShowSelRange                  zeigt bzw. versteckt die bewegliche Farbspur (SelColor)
Track.TrackColor                    die Farbe der Spur (Track)

Ereignisse:

OnChange                            wird beim Schieben des Sliders ausgelöst. Count ist der Wert des Sliders und entspricht Position.
    und alle geerbten Ereignisse von TLabel! 
Auch hier wieder ein kleines Testprogramm dabei:
TestTheSlider.png
TestTheSlider.png (52.9 KiB) 4633 mal betrachtet
Vielen Dank an alle hier im Forum die mir geholfen haben. Es war sehr lehrreich für mich! :D
Bernd
Dateianhänge
Release5.zip
(84.14 KiB) 173-mal heruntergeladen

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Ein Slider, mal testen

Beitrag von siro »

Sehr schön Bernd,
hab mir grad nochmal deine Komponente runtergeladen.
Du hast hier im Forum noch einen extra Text reingestellt für eine kurze Beschreibung der Eigenschaften.

Dazu gebe ich Dir mal noch einen Tip:

Du kannst in deinem Code "über" der Property Eigenschaft einen Kommentar schreiben und dann wird dieser
im Objektinspektor unten angezeigt wenn die entsprechende Eigenschaft angeklickt wird.
Das kann auch ein mehrzeiliger Kommentar sein:

Ich finde das recht praktisch.

Hier mal ein Beispiel:

Code: Alles auswählen

type
  TTrack = class(TPersistent)
   private
    FOwner                : TCustomControl;
    FTrackColor           : TColor;       //Schlitzfarbe
    FTrackColorSel        : TColor;       //Schlitzfarbe selektiert
    FTrackColorSelVisible : boolean;      //Selektiertefarbe ein
    FTrackColorExt        : TColor;       //Schlitzfarbe extra
    FTrackColorExtVisible : boolean;      //Extrafarbe ein
    FExtMin               : integer;      //Min Wert
    FExtMax               : integer;      //Max Wert
    procedure SetTrackColor(const aColor:TColor);
    procedure SetTrackColorSelVisible(const Value:boolean);
    procedure SetTrackColorSel(const aColor:TColor);
    procedure SetTrackColorExtVisible(const Value:boolean);
    procedure SetTrackColorExt(const aColor:TColor);
    procedure SetExtMin(const aValue:integer);
    procedure SetExtMax(const aValue:integer);
   public
    constructor create(aOwner:TCustomControl);
   published
   property TrackColor         : TColor  read FTrackColor             write SetTrackColor default clWhite;
   property SelColor           : TColor  read FTrackColorSel          write SetTrackColorSel default clGray;
   property ShowSelRange       : boolean read FTrackColorSelVisible   write SetTrackColorSelVisible default true;
// die Farbe der extra Farbspur
   property ExtraColor         : TColor  read FTrackColorExt          write SetTrackColorExt default clred;
   property ShowExtraColor     : boolean read FTrackColorExtVisible   write SetTrackColorExtVisible default false;
   property ExtraRangeMin      : integer read FExtMin                 write SetExtMin default 0;
// das Ende der extra Farbspur (muss höher als min und im Wertebereich sein!)
// kannst auch eine zweite Zeile Beschreibung nutzen
   property ExtraRangeMax      : integer read FExtMax                 write SetExtMax default 0;

end;                    
Sieht dann später so aus:
Slider_Info.jpg
Slider_Info.jpg (33.16 KiB) 4612 mal betrachtet

Einen schönen Sonntag wünsche ich noch.
Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

wennerer
Beiträge: 507
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: Ein Slider, mal testen

Beitrag von wennerer »

Hallo Siro,
vielen Dank für deinen Tipp! Ich hab solche Hinweise schon gesehen, wusste aber nicht wie ich die selber da hin bringe. Das werde ich in Zukunft mit einbauen. :D
Viele Grüße
Bernd

Antworten