Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Komponentenentwicklung LED über TShape ? (https://www.delphipraxis.net/176730-komponentenentwicklung-led-ueber-tshape.html)

Chris211183 23. Sep 2013 09:05

Komponentenentwicklung LED über TShape ?
 
Hallo,

ich bin neu hier und grüße euch ersteinmal alle!

Ich bin ebenfalls neu mit Delphi involviert, habe bis jetzt nur C++ Erfahrung.
Ich möchte eine LED-Komponente entwickeln, wie stelle ich sowas am Besten an ?

Vielen Dank,

Chris

P.S. die Led soll nicht nur rund sein, sondern auch als Pfeil dargestellt werden können.:roll:

Bummi 23. Sep 2013 09:42

AW: Komponentenentwicklung LED über TShape ?
 
Statt von TShape anzuleiten solltest Du von TGraphicControl ableiten. Ob Du aus einer Imagelist zeichnen oder selbst auf dem Canvas zeichnen willst bleibt Dir überlassen.

Mavarik 23. Sep 2013 09:51

AW: Komponentenentwicklung LED über TShape ?
 
Willkommen in der DP...

Ich würde sagen... Kommt darauf an, ob Du Deine LED-Reihe beliebig skalieren können willst!

Mavarik

Chris211183 23. Sep 2013 10:09

AW: Komponentenentwicklung LED über TShape ?
 
Danke für die schnellen Antworten;

bin ein bissl überfordert grad, also es soll am Ende eine Komponente werden, welche als LED fungiert,
es soll runde und Dreieckige LED´s geben, welche aktiv grün und inactiv rot leuchen:-)

pHL 23. Sep 2013 10:16

AW: Komponentenentwicklung LED über TShape ?
 
Hallo,

Hier gibt es eine kurze Anleitung wie man generell eine Komponente erstellt: http://docwiki.embarcadero.com/RADSt...ente_erstellen

PS: Bei den Jedis gibt es eine LED (TJvLED) -> vielleicht willst du dir ja den Source von denen anschauen () http://wiki.delphi-jedi.org/wiki/JVC...:TJvLED.Status

LG

Mavarik 23. Sep 2013 10:20

AW: Komponentenentwicklung LED über TShape ?
 
Zitat:

Zitat von Chris211183 (Beitrag 1229574)
Danke für die schnellen Antworten;

bin ein bissl überfordert grad, also es soll am Ende eine Komponente werden, welche als LED fungiert,
es soll runde und Dreieckige LED´s geben, welche aktiv grün und inactiv rot leuchen:-)

OK ich bin von einer LED-Reihe (Textzeile/Laufschrift) ausgegangen...

Was Du beschreibst ist ja nur ein "farbiger Punkt"... Dann kannste auch ein TShape nehmen... ;-)

Mavarik

Chris211183 23. Sep 2013 10:24

AW: Komponentenentwicklung LED über TShape ?
 
:shock::oops:

Chris211183 23. Sep 2013 10:26

AW: Komponentenentwicklung LED über TShape ?
 
wie kann ich dem jetzt aber spezielle Werte zuweisen, zum Bsp., dass er die Farbe wechselt, wenn er angesteuert wir...

wie macht man soetwas ?

DeddyH 23. Sep 2013 10:31

AW: Komponentenentwicklung LED über TShape ?
 
Für solche Dinge empfiehlt sich eine Property samt Setter.
Delphi-Quellcode:
type
  TLed = class(TVorfahr)
  private
    FDings: TDatentyp;
    procedure SetDings(const Value: TDatentyp);
  ...
  published
    property Dings: TDatentyp read FDings write SetDings;
    ...
  end;

procedure TLed.SetDings(const Value: TDatentyp);
begin
  if Value <> FDings then
    begin
      FDings := Value;
      invalidate;
    end;
end;
Sobald der Property Dings ein Wert zugewiesen wird, wird der Setter durchlaufen. Dieser schaut nach, ob auch tatsächlich eine Änderung eingetreten ist, setzt dann ggf. den neuen Wert und löst ein Neuzeichnen aus. Das muss man nicht unbedingt so machen, aber als Beispiel sollte das allemal taugen.

Mavarik 23. Sep 2013 10:32

AW: Komponentenentwicklung LED über TShape ?
 
Ich denke mit Ansteuern meinte er Mausover? Oder?

Chris211183 23. Sep 2013 10:40

AW: Komponentenentwicklung LED über TShape ?
 
ahhhhh, jetzt kommt Licht ins Dunkle, vielen Dank Euch allen, ich mach mal ein bissl rum und melde mich wieder !


:stupid::stupid::stupid:

Danke

Chris211183 24. Sep 2013 10:43

AW: Komponentenentwicklung LED über TShape ?
 
Hallo @all,

da bin ich wieder, soweit klappt das wohl jetzt halbwegs, noch ein paar Fragen haben sich jetzt aufgetan:

Die Komponente soll die Eigenschaften aus = grau, Activ = Grün und Inactiv = Rot haben

wie kann man das hier implementieren, habe bis jetzt folgenden Code:


unit Unit1;
interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TLED = class(TForm)
HoyLed: TShape;

private
FActive: Boolean;
procedure SetActive(const Value: Boolean);

public

published
property Active: Boolean read FActive write SetActive;
end;

var
LED: TLED;
Shape : TShape;
Brush: TShape;
Color: TColor;
ShowHint: Boolean;

implementation

{$R *.dfm}
procedure TLED.SetActive(const Value: Boolean);
begin
if Active <> FActive then
begin
FActive := Active;
invalidate;
end;

begin
Shape := TShape.Create(LED);

with Shape do
begin
Left := 30;
Top := 30;
Width := 30;
Color := clGreen;
end;
end;
end;
end.

Bin über jede Hilfe dankbar !

DeddyH 24. Sep 2013 13:26

AW: Komponentenentwicklung LED über TShape ?
 
Wieso leitest Du denn von TForm ab? Und weshalb ein Boolean für 3 mögliche Zustände? Ich würde das etwa so angehen (ungetestet, da im Editor getippt):
Delphi-Quellcode:
type
  (* Mögliche Stati *)
  TLEDState = (lsOff, lsActive, lsInactive);
 
  TLED = class(TGraphicControl)
  private
    FState: TLEDState;
    procedure SetState(const Value: TLEDState);
  protected
    procedure Paint; override;
  published
    property State: TLEDState read FState write SetState;
  end;
 
procedure TLED.Paint;
var
  LEDColor: TColor;
begin
  inherited;
  case FState of  
    lsActive:
      LEDColor := clGreen;
    lsInactive:
      LEDColor := clRed;
    else
      LEDColor := clGray;  
  end;
  Canvas.Brush.Color := LEDColor;
  Canvas.Ellipse(0, 0, Width, Height);
end;

procedure TLED.SetState(const Value: TLEDState);
begin
  if FState <> Value then
    begin
      FState := Value;
      invalidate;
    end;
end;
P.S.: Benutze doch bitte künftig die Delphi-Tags (die "Helm"-Schaltfläche im Beitragseditor), dann ist der Code viel besser zu lesen.

Chris211183 25. Sep 2013 11:16

AW: Komponentenentwicklung LED über TShape ?
 
:lol::roll:, Danke Dir !

Alles Klar, mach ich !

sx2008 25. Sep 2013 12:37

AW: Komponentenentwicklung LED über TShape ?
 
Ich würde es so machen wie bei der TJvLed (sourcecode):
Eine Farbe für den aktiven Zustand, eine Farbe für den nichtaktiven Zustand und eine Hintergrundfarbe.

Bei der Simulation einer Zweifarben-LED setzt man dann eben property ColorOn jeweils auf Rot oder Grün.

Chris211183 27. Sep 2013 09:50

AW: Komponentenentwicklung LED über TShape ?
 
Ich wollte mal meine Komponente Testen, jedoch wird nix dsrgestellt :?

Delphi-Quellcode:
unit LedUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
    TLED = class(TGraphicControl)
    //HoyLed: TShape;


  private
  { Private declarations }
  FActive: Boolean;
  procedure SetActive(const Value: Boolean);

  protected
  { Protected declarations }

  public
  { Public declarations }

  published
  { Published declarations }
     property Active: Boolean read FActive write SetActive;

end;


var                                  
  LED: TLED;
  Shape : TShape;
  Brush: TShape;
  Color: TColor;
  ShowHint: Boolean;




implementation

{$R *.dfm}


procedure TLED.SetActive(const Value: Boolean);
begin
if Active <> FActive then
   begin
   FActive := Active;
   invalidate;
end;



begin
    Shape := TShape.Create(LED);


 with Shape do
 begin
 Left := 30;
 Top := 30;
 Width := 30;

end;
  end;
    end;


type
        TTriangleShape = class(TShape)

        private
        { Private declarations }

        protected
        { Protected declarations }
          procedure Paint; override;

        public
        { Public declarations }
        published
        { Published declarations }
end;


type
        TPointArray = array [0..2] of TPoint;
        PPointArray = ^TPointArray;

        procedure TTriangleShape.Paint;


begin
with Canvas do
        begin
        Polygon([Point(0, (Self.Height-2)), Point((Self.Width div 2), 0),
        Point(Self.Width, (Self.Height-2)), Point(0, (Self.Height-2))]);
        end;
           end;
jemand ne Ahnung warum nichts beim Test während der Laufzeit auf meinem Formular zu sehen ist ?? Ich langsam nicht mehr :pale:

DeddyH 27. Sep 2013 10:41

AW: Komponentenentwicklung LED über TShape ?
 
Du hast da begins und ends sowie Typdeklarationen wild im Code verteilt. Was gehört denn wozu? Und woher soll der Compiler das wissen? Und wozu ein GraphicControl und zusätzlich noch ein TShape?

stahli 27. Sep 2013 12:28

AW: Komponentenentwicklung LED über TShape ?
 
Du solltest Dich erst einmal mit der Komponentenentwicklung grundsätzlich befassen.

Ein schönes Beispiel (und auch mein erstes ;-) ) ist die "Entwicklung" eines TRedPanels. Das soll in der Komponentenpalette stehen und wenn man es in´s Formular zieht soll es rot sein.

Wenn Du das geschafft hast sollte es auch möglich werden, andere Komponenten zu entwickeln, die etwas komplexer sind.
Mit dem TRedPanel bleibt es aber erst mal schön übersichtlich und man lernt die Abläufe kennen.

Welche Delphi-Version hast Du denn? Die könntest Du auch mal in Deinem Profil angeben.

Sir Rufo 27. Sep 2013 13:04

AW: Komponentenentwicklung LED über TShape ?
 
Bei einer "visuellen" Komponente, muss ja auch etwas visualisiert werden.

Dieses erreicht man, indem etwas gezeichnet wird. Folglich muss die Paint-Methode entsprechend angepasst (überschrieben) werden, denn genau diese ist für das Zeichnen zuständig.

Das ist so eigentlich das große Geheimnis bei dieser Art von Komponente die du haben willst.

Wie und was du da zeichnest und warum (Berücksitigung von Parametern) genau so ist egal, Hauptsache es wird gezeichnet.

Bei einer Änderung der Parameter wird der Komponente einfach mit
Delphi-Quellcode:
Invalidate
mitgeteilt, dass eine Änderung passiert ist und ein Neuzeichnen erforderlich ist.

Ein Code-Beispiel folgt sogleich ...

DeddyH 27. Sep 2013 13:09

AW: Komponentenentwicklung LED über TShape ?
 
*Psst* ein Code-Beispiel steht bereits da oben ;)

Sir Rufo 27. Sep 2013 13:12

AW: Komponentenentwicklung LED über TShape ?
 
Zitat:

Zitat von DeddyH (Beitrag 1230127)
*Psst* ein Code-Beispiel steht bereits da oben ;)

[Flüster ON]stimmt ja[Flüster OFF]

Chris211183 27. Sep 2013 13:14

AW: Komponentenentwicklung LED über TShape ?
 
Vielen Dank erstmal für eure Hilfe,

ich glaub ich fang nochmal von ganz vorn an, da wollt ich zu viel auf einmal:!:.

Sir Rufo 27. Sep 2013 13:20

AW: Komponentenentwicklung LED über TShape ?
 
Ich kommentiere mal das Beispiel von DeddyH

Delphi-Quellcode:
type
  (* Mögliche Stati *)
  TLEDState = (lsOff, lsActive, lsInactive);
 
  TLED = class(TGraphicControl)
  private
    FState: TLEDState;
    procedure SetState(const Value: TLEDState);
  protected
    // Überschreiben der Zeichen-Methode
    procedure Paint; override;
  published
    // Eigenschaft für den Status
    property State: TLEDState read FState write SetState;
  end;
 
procedure TLED.Paint;
var
  LEDColor: TColor;
begin
  inherited;

  // Abhängig vom Status die Zeichenfarbe festlegen
  case FState of
    lsActive:
      LEDColor := clGreen;
    lsInactive:
      LEDColor := clRed;
    else
      LEDColor := clGray;
  end;

  // Zeichnen

  // Hintergrundfarbe festlegen
  Canvas.Brush.Color := LEDColor;
  // Eine Ellipse zeichnen
  Canvas.Ellipse( 0, 0, ClientWidth, ClientHeight );
end;

procedure TLED.SetState(const Value: TLEDState);
begin
  // Ist der neue Wert ungleich dem aktuellen
  if FState <> Value then
    // dann
    begin
      // diesen neuen Wert speichern
      FState := Value;
      // und diese Komponente zum Neuzeichnen vormerken
      Invalidate;
    end;
end;

DeddyH 27. Sep 2013 13:22

AW: Komponentenentwicklung LED über TShape ?
 
:thumb:

Chris211183 27. Sep 2013 13:40

AW: Komponentenentwicklung LED über TShape ?
 
:coder: :cheer:

Chris211183 27. Sep 2013 14:59

AW: Komponentenentwicklung LED über TShape ?
 
Oh mannnnnn, das wird ein Delphi Wochenende, bin froh, wenn zur Laufzeit überhaupt mal was in der Testform erscheint, bis jetzt ist mir da immernoch nichts gelungen.
Der Fehler liegt da speziell zwischen den Ohren :wall:

stahli 27. Sep 2013 15:07

AW: Komponentenentwicklung LED über TShape ?
 
Nimm Dir Zeit - das wird schon ;-)

Ich schlage nochmal das TRedPanel vor. Da musst Du nix malen und hast erst mal klare Ergebnisse.

DeddyH 27. Sep 2013 15:10

AW: Komponentenentwicklung LED über TShape ?
 
Width und Height sind > 0? Ich habe meinen eigenen Code mal ausprobiert, nach einer kleinen Erweiterung (Überschreiben des Konstruktors) tut das wie gedacht:
Delphi-Quellcode:
unit uLED;

interface

uses
  SysUtils, Classes, Controls, Graphics;

type
  (* Mögliche Stati *)
  TLEDState = (lsOff, lsActive, lsInactive);

  TLED = class(TGraphicControl)
  private
    { Private-Deklarationen }
    FState: TLEDState;
    procedure SetState(const Value: TLEDState);
  protected
    { Protected-Deklarationen }
    procedure Paint; override;
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
  published
    { Published-Deklarationen }
    property State: TLEDState read FState write SetState;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TLED]);
end;

{ TLED }

constructor TLED.Create(AOwner: TComponent);
begin
  inherited;
  Width := 16;
  Height := 16;
end;

procedure TLED.Paint;
var
  LEDColor: TColor;
begin
  inherited;
  case FState of
    lsActive:
      LEDColor := clGreen;
    lsInactive:
      LEDColor := clRed;
    else
      LEDColor := clGray;
  end;
  Canvas.Brush.Color := LEDColor;
  Canvas.Ellipse( 0, 0, ClientWidth, ClientHeight );
end;

procedure TLED.SetState(const Value: TLEDState);
begin
  if FState <> Value then
    begin
      FState := Value;
      invalidate;
    end;
end;

end.
[edit] Einen Schönheitspreis gewinnt das natürlich nicht, aber man kann ja auch hübscher zeichen. Hier ging es ja nur um das Prinzip. [/edit]

Chris211183 27. Sep 2013 15:55

AW: Komponentenentwicklung LED über TShape ?
 
Super, danke, werd das glei mal ausprobieren :thumb: Danke euch ! Echt super hier mit eurer Hilfe !!!

Chris211183 28. Sep 2013 12:06

AW: Komponentenentwicklung LED über TShape ?
 
So hab das mal ausprobiert, egal was ich mache, auf meiner Testform wird nichts angezeigt :oops:

Delphi-Quellcode:
unit LedTestUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit1;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
     MyLed : TLED;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
   MyLed := TLed.Create(Self);
   MyLed.Parent := Self;
   MyLed := Show;
end;

end.
Das ist der Code um die Komponente zur Laufzeit zu testen, steckt da ein Fehler drin ? bei nem anderen Project hat es so gefunzt

DeddyH 28. Sep 2013 12:47

AW: Komponentenentwicklung LED über TShape ?
 
Was soll denn
Zitat:

Delphi-Quellcode:
MyLed := Show;

bedeuten?

Chris211183 28. Sep 2013 13:21

AW: Komponentenentwicklung LED über TShape ?
 
dass es auf der Form auch gezeigt wird, nicht ? auch ohne show geht da nix, warum ?

DeddyH 28. Sep 2013 13:55

AW: Komponentenentwicklung LED über TShape ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe keine Ahnung. Anbei eine kleine Demo, vielleicht siehst Du ja irgendwelche Unterschiede.

Chris211183 28. Sep 2013 14:07

AW: Komponentenentwicklung LED über TShape ?
 
Danke !!!!! :oops:

Chris211183 30. Sep 2013 12:10

AW: Komponentenentwicklung LED über TShape ?
 
Ein Wunder !!!!

Ich habe es endlich hinbekommen, ich weiß jetzt auch nach dem Wochenende, wo mein Fehler war !!!

Suuuuper, es tut das, was es soll :stupid::stupid::stupid:

jetzt kann es weiter gehen...

Also meine LED sieht schonmal ganz schick aus, wie setzte ich jetzt am besten um, dass diese Led dann später in meinem Objektinspektor als Runde Led einfach genutzt werden kann und dass ich noch andere Formen dort bestimmen kann ?

DeddyH 30. Sep 2013 12:12

AW: Komponentenentwicklung LED über TShape ?
 
Was war denn jetzt der Fehler? Und wie Deine LED letztendlich aussieht, kannst Du ja im Paint selbst bestimmen. Das Prinzip Property mit Setter, der ggf. ein Neuzeichnen auslöst, dürfte ja jetzt hoffentlich klar sein.

Chris211183 30. Sep 2013 12:20

AW: Komponentenentwicklung LED über TShape ?
 
Jap, das ist jetzt endlich klar !!!

Der Fehler lag einfach nur zwischen den Ohren :stupid:, ich habe bei der Ausgabe auf der Form, einfach nur vergessen, das Objektfeld einzufügen, aber lernen durch leiden, das passiert mir wohl nie wieder !

:thumb::thumb::thumb:

Photoner 12. Jun 2015 16:39

AW: Komponentenentwicklung LED über TShape ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe das mal für Die FMX gemacht. Alle Kommentare sind willkommen.

himitsu 13. Jun 2015 15:14

AW: Komponentenentwicklung LED über TShape ?
 
Zitat:

Zitat von Photoner (Beitrag 1304978)
Alle Kommentare sind willkommen.

  • 'Standard' = SDefault aus Vcl.Consts
  • Und die TBrush solltest du besser selber wieder freigeben, denn ARC funktioniert nicht überall.
  • Free prüft selber auf Assigned, aber egal, da es immer Assigned sein wird, denn wenn es beim Erstellen von TPathData geknallt hätte, kommt das Programm dort eh nie vorbei (was auch richtig so ist).
  • Corners, CornerType und LEDStatus würde ein default bestimmt gefallen
  • Aber vorallem solltest du dich auf Einwas einigen, also entweder mit Prefix oder Ohne, also ohne Namespace oder mit (TStatusLEDShape und TStatusLEDStatus > {$SCOPEDEUNMS} )

Photoner 15. Jun 2015 15:27

AW: Komponentenentwicklung LED über TShape ?
 
Zitat:

Zitat von himitsu (Beitrag 1305021)
  • 'Standard' = SDefault aus Vcl.Consts

Gibt es auch ein FMX.Consts o.ä ?

Zitat:

Zitat von himitsu (Beitrag 1305021)
  • Aber vorallem solltest du dich auf Einwas einigen, also entweder mit Prefix oder Ohne, also ohne Namespace oder mit (TStatusLEDShape und TStatusLEDStatus > {$SCOPEDEUNMS} )

Ich hoffe ich habe das kapiert.

Delphi-Quellcode:
  {$SCOPEDENUMS ON}
  TLEDShape  = (ctRoundLED,ctRectLED,ctTriangleLED);
  TLEDStatus = (UndefinedStatus,OnStatus,OffStatus);
  {$SCOPEDENUMS OFF}
Jetzt muss man konsequent den Namespace immer voranstellen.

Delphi-Quellcode:
 if StatusLED1.LEDStatus = TLEDStatus.UndefinedStatus then StatusLED1.LEDStatus := TLEDStatus.OnStatus;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:30 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz