Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Eigene Klasse für Steuerungen (https://www.delphipraxis.net/194208-eigene-klasse-fuer-steuerungen.html)

Vienesko 28. Okt 2017 15:26

Eigene Klasse für Steuerungen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin moin,

ich bräuchte mal wieder eure Hilfe.
Ich habe schon diverse Tutorials gelesen (unter anderem das von Luckie und Bertram Hafner) zur Erstellung eigener Klassen und auch hier im Forum gesucht aber irgendwie will der Funke nicht überspringen.

Kurze Erklärung was passieren soll:
Ich programmiere gerade an einer Oberfläche für eine eigene Haussteuerung. Diese Oberfläche ist nach Räumen unterteilt. Jeder Raum hat einen Kopf und einen Körper (ist mit Panels realisiert)und der ist dann nach Geräten unterteilt (siehe Anhang).

Wenn ich das so wie bisher machen würde, hätte ich danach einen ziemlich umfangreichen Code, durch den ich wahrscheinlich selbst nicht mehr durchblicken würde. Also habe ich mich entschieden, eigene eigene Unit (Steuerungen) mit einigen Klassen zu schreiben.

So soll es dann eine Klasse fürs Licht geben, eine für die Heizungen usw. die dann jeweils die Funktionen enthalten, die ich für die jeweiligen Geräte brauche.

So und nun zu meinem Problem:
Wenn ich meine Unit (Steuerungen) in das Hauptprogramm einbinde, finde ich diese auch. Also z.B. LichtEcke.LichtEinschalten; - führt dann aber zu einer Zugriffsverletzung.
LichtEcke := TLicht.Create; habe ich wahlweise bei OnCreate als auch bei ButtonClick schon probiert. Geht beides nicht. Das Problem muss also in der Unit "Steuerungen" liegen. So wie ich das verstanden habe, versuche ich da auf irgendwas zu zugreifen, was (in dem Moment) nicht existiert.

Hier erstmal der Code der Unit:
Delphi-Quellcode:
unit Steuerungen;

interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids,
  Vcl.Samples.Calendar, Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.Menus, Vcl.StdActns,
  System.Actions, Vcl.ActnList, Data.DBXMySQL, Data.DB, Data.SqlExpr,
   Vcl.MPlayer, Vcl.OleCtrls, SHDocVw, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP, XmlIntf, Xml.xmldom, Xml.Win.msxmldom,
  Xml.XMLDoc, Data.FMTBcd, Vcl.DBCtrls, ShellApi, Xml.omnixmldom;


type TLicht = class
private
   FState:boolean;
   FPower:real;
   FEnergyCounter:real;
   FFrequency:real;
   FCurrent:real;
   FVoltage:real;
   FError:String;
   FSeriennummer:String;
   FKanal:String;
   HTTP1:TidHTTP;
public
  constructor create (Seriennummer, Kanal:string);
  procedure LichtEinschalten;
  procedure LichtAusschalten;
  function UpdateAll:string;
  function UpdateState:string;
end;


implementation
constructor TLicht.create(Seriennummer: string; Kanal: string);
begin inherited create;
  FSeriennummer:=Seriennummer;
  FKanal:=Kanal;
end;

procedure TLicht.LichtEinschalten;
begin
HTTP1.Get('http://192.168.178.10/config/xmlapi/statechange.cgi?ise_id=1732&new_value=1');
end;

procedure TLicht.LichtAusschalten;
begin

end;

function TLicht.UpdateAll;
begin

end;

function TLicht.UpdateState;
begin

end;

end.
Wundert euch bitte nicht über die vielen uses. Habe erstmal alles eingebunden, was auch die Hauptunit benutzt.
Wenn es bei der einen procedure klappt kann ich mir den Rest wieder auf eigene Faust herleiten.
Nach Stunden des hin und hers brauche ich mal einen Anstupser in die richtige Richtung.:?:

Vielen Dank im Voraus:thumb:

bepe 28. Okt 2017 15:54

AW: Eigene Klasse für Steuerungen
 
Du greifst in "LichtEinschalten" auf das Objekt "HTTP1" zu. Das Objekt existiert aber nicht. Dir fehlt im Konstruktor noch:
Delphi-Quellcode:
HTTP1 := TIdHTTP.Create;
und im Destruktor (der noch nicht existiert) deiner Klasse solltest du "HTTP1" wieder freigeben.

mensch72 28. Okt 2017 17:14

AW: Eigene Klasse für Steuerungen
 
http://www.busbaer.de/EisB%C3%A4r-Sh...,78,id,79.html
https://www.gira.de/gebaeudetechnik/...omeserver.html

sieh dir mal an, was es prof. da am Markt gibt... rein zum Vergleich wei weit es gehen kann und überlege dir mal pur als Übung ein Daten,Klassen und Designkonzept mit dem du sowas voll abbilden könntest... dann strukturiere es auf Core und Detail Funktionalität um es anfangs soweit wie möglich zu reduzieren... aber es so sauber strukturiert ist&bleibt, das du StepByStep jede Funktionalität zufügen un/oder ändern kannst, bis es eventuell "irgendwann" vergleichbar oder besser wie diese prof. Varianten wird.

Weil du noch am Anfang und in der Konzeptphase bist folgender Hinweis:
- traditionell gibt es zu jeder "Ausgangsfunktion" egal ob Digital("Lampe" ein/aus) oder Analog(LampeHelligkeit=0..100% / ThermostatSollTemp=15..25°) eine feste Zuordung einer Eingangsfunktion wieder egal ob Digital(Schalter/Taster für Lampe EinAus) oder Analog(Drehrad oder Taster +/- für Helligkeit/Temperatur)

- modern gibt es übergreifende "Szenarien", welche man auswählen kann (per Taster, Drehrad, Timer, Ereignisse, von extern).. da ist dann entweder pro Raum oder für eine ganze Raumgruppe hinterlegt was vorbestimmt passieren soll(also welche Steckdosen an/aus, welche Lampen aus oder wie hell an, wie warm, Jalosien/Vorhänge zu oder wie weit auf, Lüftung aus oder wie stark an,...)

Bereite dich als von Anfang an darauf vor, deine Grundsteuerklassen auch für "Szenarien" gruppieren zu können und NUR diese für/in Gruppen dann hinterlegte Funktionen/Werte(intern pro Element) mit einem mal über die Gruppe aktivieren zu können.
Wenn du schon Temperatursteuerung mit vor siehst, nutze dazu noch eine weitere separate Gruppierung als "Klimazone", das können sowohl Einzelräume sein, also auch große einzelne Räume mit mehreren Heizkörpern, oder eben bei Klimatisierung alles was am vom betreffenden Klimamodul zusammen einheitlich geregelt wird... !das solltest du intern sauber konfigurieren und abbilden können!... denn nur über diese diese Klimazonen kannst du etwas(dann egl ob ein Raum oder mehrere Zimmer) direkt steuern bzw. in "Szenarien" dafür die Vorgaben festlegen.

Vorschlag:
auch wenn es zunächst logisch erscheint eine Lampe nur per digital Ein/Aus steuern zu wollen... !bitte mach es so nicht!... gib ALLEN Lampen von Anfang an !4! 0..100% ProzentWerte als "Hrgb", also Helligkeit+Farbe(RotGrünBlau)... ne simple Ein/Aus Lampe hat dann eben im Wertebereich nur zwei definierte Zustände "100,100,100,100"&"0,100,100,100".
Wichtig ist, das du also bitte Farbe und Helligkeit pro Lampe getrennt speicherst, verarbeitest und steuerst! Klar könnte man aufwändig berechnet auch per RGB die Helligkeit steuern, aber das macht real niemand... da werden einmalig wenige Stimmungen(Farben) eingestellt und dann in durchaus auch vielen "Szenarien" nur noch die jeweils passende Helligkeit dazu gesetzt. Anwender können(und wollen) in 99% der Fälle auch nur die Helligkeit frei selbst beeinflussen, die Auswahl der Farben bleibt also fast immer auf die vorbestimmten Konfigurationen beschränkt.


Sorry wenn das aktuell "zu viel" für dich ist, aber zufällig ist das ein Hauptteil des Arbeitsgebietes der Firma für die ich arbeite;)

Vienesko 28. Okt 2017 22:48

AW: Eigene Klasse für Steuerungen
 
Erst einmal vielen Dank an bepe und mensch72.

@bepe: natürlich was das der Fehler. Geändert und funktioniert. Danke dafür.:thumb:
Jetzt nur noch logisch weiter führen.

Falls ich wieder auf Probleme damit stoße: soll ich in diesem Thread wieder schreiben?

@mensch72: danke für deine ausführliche Antwort. Ja aktuell ist das wirklich alles zu viel:stupid:
Dazu musst du wissen, dass das nur für mich privat ist. Hätte ich neubauen können, wäre KNX mein erste wahl gewesen und Gira sogar mein Ideal. Aber mein Haus wird nun Stück für Stück nachgerüstet und das mit HomeMatic. Die haben viele Komponenten, sind programmiertechnisch sehr offen, gibt auch gute Bastel /Erweiterungslösungen und haben eine gute/aktive Community. Das ist aber nur ein Teil.

Meine Software soll im Grunde eine Kommandozentrale sein. Von Informationen (Wetter, News), über Tools (Countdown, Taschenrechner usw), Überwachungskameras bis hin zu Steuerungen der HomeMatic und einer Datenbank, die einen digitalen Kühlschrank darstellt. Alles immer Stück für Stück.

Die Software bekommt neue Funktionen wenn ich mir neues Wissen angeeignet habe und ich lerne dabei.
Klar, soll damit auch irgendwann mehr möglich sein. Aber ich möchte die Software immer meinem aktuellen Wissensstand anpassen und da das nur für mich ist, ist das nicht so schlimm. Ich brauche auch Erfolgserlebnisse, damit es mir weiterhin Spaß macht :-)

So brauchte ich z.B. letztens XML-Parsen und habe mir das angeeignet. Jetzt komme ich nicht um eine Klasse herum und lerne das dabei. So macht das lernen auch Spaß und meine Software wächst mit mir.
Aber trotzdem vielen Dank für die Tipps. Immer her damit :-)

haentschman 29. Okt 2017 04:22

AW: Eigene Klasse für Steuerungen
 
Moin...:P
Als Außenstehender ist mir schnell was aufgefallen...:zwinker:
Zitat:

und ich lerne dabei.
...da helfe ich dir doch glatt. 8-)
Delphi-Quellcode:
type TLicht = class // deutsch
private
   FState:boolean; // englisch
   FPower:real; // englisch
   FEnergyCounter:real; //englisch
   FFrequency:real; // englisch
   FCurrent:real; // englisch
   FVoltage:real; // englisch
   FError:String; // englisch
   FSeriennummer:String; //deutsch
   FKanal:String; // deutsch
   HTTP1:TidHTTP; // englisch mit automatisch vergeben Namen
public
  constructor create (Seriennummer, Kanal:string); // Parameter deutsch
  procedure LichtEinschalten; // deutsch
  procedure LichtAusschalten; // deutsch
  function UpdateAll:string; // englisch
  function UpdateState:string; // englisch
end;
* versuche nicht Denglisch zu verwenden (Umlaute sehen Schei... aus) Du solltest dich für eine Variante entscheiden! Die bessere ist eindeutig Englisch.
* auch für die Komponenten auf der Form sprechende Namen
* Code Formatter benutzen
* Groß- Kleinschreibung der Variablentypen (boolean -> Boolean, create -> Create)
* an der Groß- Kleinschreibung sieht man, daß du keine Codevervollständigung benutzt...benutze sie. :thumb: (CnPack)

PS:
Hinterlege mal deine Delphi Version in deinem Profil. :thumb:

Vienesko 23. Nov 2017 14:42

AW: Eigene Klasse für Steuerungen
 
Hallo haentschmann:)

Du hast natürlich recht. Dieses Deutsch / Englisch MischMasch ist nicht gut. Das sollte ich auf jeden Fall nochmal ändern:lol:
Habe mich auch einen Abend mal hingesetzt und fast alle Komponenten umbenannt.

Witzigerweise habe ich an dem Tag deiner Antwort gerade CnPack installiert :P

Jetzt bin ich übrigens an dem Punkt, wo ich um Multithreading wohl nicht mehr drum herum komme. Mal schauen, wie ich das hinbekomme. Ich bastel mir erstmal eine Demo.

Vielen Dank für die Tipps!

LG


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:52 Uhr.

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