![]() |
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: |
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.
|
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 |
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:-) |
AW: Komponentenentwicklung LED über TShape ?
Hallo,
Hier gibt es eine kurze Anleitung wie man generell eine Komponente erstellt: ![]() PS: Bei den Jedis gibt es eine LED (TJvLED) -> vielleicht willst du dir ja den Source von denen anschauen () ![]() LG |
AW: Komponentenentwicklung LED über TShape ?
Zitat:
Was Du beschreibst ist ja nur ein "farbiger Punkt"... Dann kannste auch ein TShape nehmen... ;-) Mavarik |
AW: Komponentenentwicklung LED über TShape ?
:shock::oops:
|
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 ? |
AW: Komponentenentwicklung LED über TShape ?
Für solche Dinge empfiehlt sich eine Property samt Setter.
Delphi-Quellcode:
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.
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; |
AW: Komponentenentwicklung LED über TShape ?
Ich denke mit Ansteuern meinte er Mausover? Oder?
|
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 |
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 ! |
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:
P.S.: Benutze doch bitte künftig die Delphi-Tags (die "Helm"-Schaltfläche im Beitragseditor), dann ist der Code viel besser zu lesen.
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; |
AW: Komponentenentwicklung LED über TShape ?
:lol::roll:, Danke Dir !
Alles Klar, mach ich ! |
AW: Komponentenentwicklung LED über TShape ?
Ich würde es so machen wie bei der TJvLed (
![]() 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. |
AW: Komponentenentwicklung LED über TShape ?
Ich wollte mal meine Komponente Testen, jedoch wird nix dsrgestellt :?
Delphi-Quellcode:
jemand ne Ahnung warum nichts beim Test während der Laufzeit auf meinem Formular zu sehen ist ?? Ich langsam nicht mehr :pale:
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; |
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?
|
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. |
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:
mitgeteilt, dass eine Änderung passiert ist und ein Neuzeichnen erforderlich ist.
Invalidate
Ein Code-Beispiel folgt sogleich ... |
AW: Komponentenentwicklung LED über TShape ?
*Psst* ein Code-Beispiel steht bereits da oben ;)
|
AW: Komponentenentwicklung LED über TShape ?
Zitat:
|
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:!:. |
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; |
AW: Komponentenentwicklung LED über TShape ?
:thumb:
|
AW: Komponentenentwicklung LED über TShape ?
:coder: :cheer:
|
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: |
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. |
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:
[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]
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. |
AW: Komponentenentwicklung LED über TShape ?
Super, danke, werd das glei mal ausprobieren :thumb: Danke euch ! Echt super hier mit eurer Hilfe !!!
|
AW: Komponentenentwicklung LED über TShape ?
So hab das mal ausprobiert, egal was ich mache, auf meiner Testform wird nichts angezeigt :oops:
Delphi-Quellcode:
Das ist der Code um die Komponente zur Laufzeit zu testen, steckt da ein Fehler drin ? bei nem anderen Project hat es so gefunzt
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. |
AW: Komponentenentwicklung LED über TShape ?
Was soll denn
Zitat:
|
AW: Komponentenentwicklung LED über TShape ?
dass es auf der Form auch gezeigt wird, nicht ? auch ohne show geht da nix, warum ?
|
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.
|
AW: Komponentenentwicklung LED über TShape ?
Danke !!!!! :oops:
|
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 ? |
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.
|
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: |
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.
|
AW: Komponentenentwicklung LED über TShape ?
Zitat:
|
AW: Komponentenentwicklung LED über TShape ?
Zitat:
Zitat:
Delphi-Quellcode:
Jetzt muss man konsequent den Namespace immer voranstellen.
{$SCOPEDENUMS ON}
TLEDShape = (ctRoundLED,ctRectLED,ctTriangleLED); TLEDStatus = (UndefinedStatus,OnStatus,OffStatus); {$SCOPEDENUMS OFF}
Delphi-Quellcode:
if StatusLED1.LEDStatus = TLEDStatus.UndefinedStatus then StatusLED1.LEDStatus := TLEDStatus.OnStatus;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz