AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Neue Komponente entwickeln

Ein Thema von josef-b · begonnen am 23. Aug 2017 · letzter Beitrag vom 25. Aug 2017
Antwort Antwort
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Neue Komponente entwickeln

  Alt 24. Aug 2017, 15:44
Eine wichtige Frage: Kommst Du immer mit rechteckigen, nicht transparenten Controls aus?

Dann würde ich einfach von Panels ableiten und deren Paint überschreiben.
Dann kannst Du Deine Controls beliebig zeichnen und ja nach Status des Datenbestandes z.B. LED-Farben steuern.

Du könntest einem sichtbaren TvSilo als Property ein Datenobjekt TdSilo zuweisen, dessen Daten sich das Control dann bedienen kann.
Ist kein TdSilo zugewiesen, zeichnet sich das Control einfach nur grau.

Man könnte das Ganze auch noch weiter treiben.
Du könntest ein TdBaustelle haben, die z.B. eine Liste von TdSilos und anderen Objekten beinhaltet.
Eine TvBaustelle (großes Panel im Formular) könnte die TdBaustelle benutzen und einfach alle dort vorhandenen Silos und anderen Objekte zeichnen bzw. für jedes Datenobjekt ein passendes visuelles Objekt erzeugen.
Dazu müssen die Positionen der Objekte allerdings mit in den Datenobjekten gespeichert sein.
Hinzufügungen und Löschungen aus der TdBaustelle.SiloListe müssen ein Neuzeichnen der TvBaustelle veranlassen.


... nur als Überlegung eines möglichen Ansatzes


PS: Welches Delphi hast Du? Schreib das mal mit ins Profil.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
josef-b

Registriert seit: 6. Jun 2004
Ort: bei Jena in Thüringen
95 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Neue Komponente entwickeln

  Alt 24. Aug 2017, 15:57
Danke für Eure schnellen Antworten...

ich habe nun mal etwas probiert. Aber ich glaube, ich verstehe es noch nicht mit inherited, constructor und so..

Habe eine Komponente erstellt, compiliert und installiert...beim Compilieren kommt auch kein Fehler.

Nun habe ich gedacht, wenn ich die Komponente auf eine Form ziehe, ändert er mir wenigstens die caption von dem Panel, aber nix

Hier der Code

Delphi-Quellcode:

unit Silo_aus_Panel;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, graphics;

type
  TSilo_aus_Panel = class(TPanel)
  private
    { Private-Deklarationen }
    //Zugriff nur innerhalb der Komponente


  protected
    { Protected-Deklarationen }
   //Deklarationen sichtbar in innerhalb der unit und abgeleiteten Klassen

  public
    { Public-Deklarationen }
    //Steht nur zur Laufzeit zur Verfügung
    //Laufzeit Schnittstelle

  published
    { Published-Deklarationen }
    //kommt in Objektinspektor
    //steht auch im Design-Modus zur Vergügung
    //keine Schreibgeschützten Eigenschaft reinstellen

    constructor create;


  end;

procedure Register;

implementation

constructor Tsilo_aus_Panel.create;
var
Silo: tshape;
VollMelder: tshape;
LeerMelder: tshape;
begin


**** das folgende wird nicht ausgeführt *****

??????


inherited create(self);

caption := 'Neue Caption!';

Silo := tshape.create(self);
with silo do
   begin
   //Parent := form1; ????
   width := 90;
   height := 200;
   brush.color := clmoneygreen;
   shape := strectangle;
   visible := true;
   end;

end;


procedure Register;
begin
  RegisterComponents('SPS', [TSilo_aus_Panel]);
end;
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: Neue Komponente entwickeln

  Alt 24. Aug 2017, 16:26
Delphi-Quellcode:
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#4

AW: Neue Komponente entwickeln

  Alt 24. Aug 2017, 19:33
Zitat:
inherited create(self);
Owner!

Für sich selber kann man nicht der Owner/Besitzer sein.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (24. Aug 2017 um 19:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#5

AW: Neue Komponente entwickeln

  Alt 24. Aug 2017, 19:48
Wieso nicht? Dann gibt man sich selbst frei, wenn man gerade freigegeben wird
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.689 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Neue Komponente entwickeln

  Alt 24. Aug 2017, 20:13
Vergiss das mit dem Ableiten vom Panel am besten schnell wieder. Ich habe exakt genau dieselbe Klamotte für unser Büro vor ein paar Jahren gemacht - also zu 100% genau das was du machen willst - und es kommt zu 100% der Punkt, wo ein unabdingbar rechteckciges undurchsichtiges Etwas einem so RICHTIG in die Suppe spuckt.
Alles was im Wesentlichen einfach nur eine Anzeige sein soll (aber durchaus auch Klick-Ereignisse bietet) wird von TGraphicControl abgeleitet und nichts anderem. Das zeichnet brav auf den Canvas des Parents (üblicherweise ein Formular oder Frame oder Panel) und bringt alles an Basisfunktionalität mit.

Auch von TShapes innerhalb dieser Komponenten würde ich Abstand nehmen. Das sauberste ist es einfach alles von Hand zu malen, und SO viel aufwendiger ist das gar nicht. Mal ein grobes Gerüst:

Delphi-Quellcode:
  TVisuBase = class(TGraphicControl)
  private
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Visible;
    property Anchors;
    property Align;
    property Cursor;
    property ShowHint;
    property OnClick;
    property OnContextPopup;
    property OnDblClick;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnMouseWheel;
    property OnMouseWheelDown;
    property OnMouseWheelUp;
    property OnResize;
  end; // Die letzten hier nur um sie im Property-Editor sichtbar zu machen. In TGraphicControl sind diese Member alle nur public, nicht published.

implementation

constructor TVisuBase.Create(AOwner: TComponent);
begin
  inherited;
  // Ab hier Initialisierungen, aber bitte NICHT TShapes und so, und schon gar nicht als lokale Variablen!!
end;

destructor TVisuBase.Destroy;
begin
  // Hier deine Freigaben
  inherited;
end;

procedure TVisuBase.Paint;
begin
  inherited; // <--- Wichtig!!!
  // Hier nun deine Zeichenroutine. Beispiel: Ein Rotes Rechteck mit 5px Abstand zum Rand der Komponente.
  Canvas.Brush.Color := clRed;
  Canvas.Brush.Style := bsSolid;
  Canvas.FillRect(Rect(5, 5, Width-5, Height-5));
end;
Es ist wichtig die überschriebene Methode "Paint" hier zu nehmen, da diese immer aufgerufen wird, wenn Windows der Meinung ist es müsste neugezeichnet werden (Message wmPaint). Man selbst löst dies z.B. durch VisuBase.Repaint; oder VisuBase.Refresh; oder VisuBase.Invalidate; aus, wie mit allen anderen visuellen Komponenten auch. Und mache dich auf jeden Fall damit vertraut alles via "Canvas." zu malen - oder zumindest nichts aus weiteren Komponenten zusammenzusetzen - weil das kann nach hinten raus richtig eklig werden. (Speziell wenn man nachher mit der Zeichenreihenfolge rum machen muss und sich schöne zirkuläre Überlappungen ergeben oder auch Komponenten auf Basis von TWinControl können lustige Sachen machen, etc. pp.)

Ich selbst hatte mir noch eine Zwischenklasse gebaut die von TGraphicControl abgeleitet ist, von der dann alle meine Visu-Klassen ableiten. Das hing aber damit zusammen, das hinter dem ganzen noch ein etwas komplexeres Datenbanksystem steht, mit dem ohnehin alle Komponenten hantieren müssen, so dass es Sinn machte diese Gemeinsamkeit in einen Zwischenschritt zu kapseln. Das aber nur als Anregung, falls es bei dir auch etwas größeres werden soll, nicht nur eine einmalige kleine Maschinensteuerung. (Wir entwickeln damit z.B. ganze Leitsysteme für recht große Anlagen weltweit agierender Konzerne.)

Gedanklich bin ich aber schon längst dabei etwas auf HTML5 zusammenzuspinnen für die Zukunft, aber die Zeit müsste man für sowas erstmal haben
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
josef-b

Registriert seit: 6. Jun 2004
Ort: bei Jena in Thüringen
95 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Neue Komponente entwickeln

  Alt 24. Aug 2017, 20:45
Hallo Medium:

Danke für Deine ausführliche Antwort.

Ich habe schon gemerkt, dass mein Weg vielleicht nicht der ideale ist...und werde es mal auf Deine Art versuchen..

und zwar jetzt

Zu dem html5.

Bei mir ist es genau anders. Wir haben hier einige Wago-SPS-Steuerungen. Dazu eine Software von 3S - Codesys. Das
ganze läuft mit Java, was ja von immer mehr browsern nicht mehr unterstützt wird.

Die Steuerungen laufen aber erst 4 Jahre...

Ich habe mich vorher Delphi-maessig mit Datenbanken beschäftigt. Individual-Software für unseren Betriebt mit
Firebird und IBX..Nun habe ich mir in den Kopf gesetzt die SPSen auch mit Delphi anzusteuern. Wir sind damit auch
flexibler, sparen Bauteile bei der SPS ein, z.B. zusätzliche COM-Schnittstellen, die wir direkt übern den PC
anschliessen können, oder über IP-Schnittstellen..

Ausserdem haben wir die Möglichkeit Daten aus der Datenbank mit einfliessen zu lassen...z.B. Waagen-Daten direkt in
die ERP Software zu übernehmen.

Und da will ich dann im hohen Alter eben auch noch lernen, wie man nicht nur Werkzeug-Kästen nutzt, sondern selbst
Komponenten bauen
  Mit Zitat antworten Zitat
josef-b

Registriert seit: 6. Jun 2004
Ort: bei Jena in Thüringen
95 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Neue Komponente entwickeln

  Alt 24. Aug 2017, 22:14
Also das mit der Ableitung von TGraphicControl und händisch zeichnen hat wirklich gut geklappt.

Jetzt habe ich eine kleine visuelle Komponente, oben und unten habe ich eine LED eingebaut,

Voll und Leermelder.

Wie kann ich jetzt zur Laufzeit die Rote Lampe ein und ausschalten und auch die gelbe?

Ich finde bei der neuen Komponente kein Canvas, wo ich das mit floodfill machen kann?


Delphi-Quellcode:


unit SiloZelle;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, graphics;

type
  TSiloZelle = class(TGraphicControl)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
    procedure Paint; override;
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published-Deklarationen }
    property Visible;
    property Anchors;
    property Align;
    property Cursor;
    property ShowHint;
    property OnClick;
    property OnContextPopup;
    property OnDblClick;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnMouseWheel;
    property OnMouseWheelDown;
    property OnMouseWheelUp;
    property OnResize;
  end; // Die letzten hier nur um sie im Property-Editor sichtbar zu machen. In TGraphicControl sind diese Member alle nur public, nicht published.


procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('SPS', [TSiloZelle]);
end;

constructor TSiloZelle.Create(AOwner: TComponent);
begin
  inherited;
  // Ab hier Initialisierungen, aber bitte NICHT TShapes und so, und schon gar nicht als lokale Variablen!!
end;

destructor TSiloZelle.Destroy;
begin
  // Hier deine Freigaben
  inherited;
end;

procedure TSiloZelle.Paint;
begin
  inherited; // <--- Wichtig!!!
  // Hier nun deine Zeichenroutine. Beispiel: Ein Rotes Rechteck mit 5px Abstand zum Rand der Komponente.

  width := 70;
  height := 210;

  with canvas do
    begin

    //Silo-Körper
    pen.Color := clblack;
    Brush.Color := clmoneygreen;
    Brush.Style := bsSolid;
    rectangle(0,0,70,140);

    //Silo-Trichter
    moveto (0,140);
    lineto (35,200);
    lineto (70,140);
    lineto (0,140);
    floodfill(35,160,clblack,fsborder);

    //Vollmelder
     brush.Color := clred;
    ellipse(25,10,50,35);

    //Leermelder
    brush.Color := clyellow;
    ellipse(25,145,50,170)

    end;




end;
Angehängte Grafiken
Dateityp: jpg Silo.JPG (23,1 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 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