Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Klasse zur Darstellung einer Ampel. (https://www.delphipraxis.net/84649-klasse-zur-darstellung-einer-ampel.html)

Evian 19. Jan 2007 14:31


Klasse zur Darstellung einer Ampel.
 
Liste der Anhänge anzeigen (Anzahl: 1)
hallo Zusammen,

ich habe die Hausaufgabe bekommen, eine Anwendung zum Darstellen und Steuern einer Ampel zu programmieren. Ansich gar kein Problem (Meine derzeitige Lösung befindet sich im Attachment), aber nun habe ich erfahren, dass Steuerung und Darstellung mit jeweils einer Klasse realisiert werden sollen.

Da ich noch nicht wirklich eigene Klassen (bis auf die Formularsklasse ^^) mit Delphi geschreiben habe, wollte ich fragen, ob mir wer nen Tip geben kann, wie ich das am besten Angehe. Ich habe mir gedacht, dass ich das Panal, sowie die Images der Ampel in eine eigenen Klasse ablege und diese dann dem Mainformular hinzfüge. Aber wie genau mache ich das und wie greife ich dann darauf zu?!

Ein klein wenig Beispielcode wäre mir sehr angenehm.

liebe Grüße,

Phill

Der_Unwissende 19. Jan 2007 14:57

Re: Klasse zur Darstellung einer Ampel.
 
Hi,
hab mir jetzt ehrlich gesagt deine Implentierung noch nicht angeschaut, aber trotzdem sollte folgendes dir helfen:
Eigene Klassen zu erzeugen ist sehr einfach (die Schwierigkeit liegt im sinnvollen Design, aber das ist ein anderes Thema). Du kannst die anlegen wie jeden Datentyp, eine Formular-Klasse kann dir hier als (von Delphi aut. erzeugtes) Beispiel dienen
Delphi-Quellcode:
type
  TDeineKlasse = class(<VORFAHR_KLASSE>)
    private
      // private Variablen und Methoden
    protected
      // geschützte Variablen und Methoden
    public
      // öffentliche Variablen und Methoden
    published
      // Veröffentlichte Eigenschaften
  end;
Das was Du hier siehst ist der Aufbau einer leeren (eigenen) Klasse, mit allen möglichen Schutzklassen. Klassen sollten immer so aufgebaut werden, dass nach außen nur das sichtbar ist, was wirklich sichtbar sein muss. Die Sichtbarkeit Private ist dabei wirklich privat. Alles was hier steht kann nur vom gleichen Objekt (Instanz der Klasse) gelesen werden. Von außen ist gar kein direkter Zugriff auf solche Variablen oder Methoden möglich. Auch Nachfahren der Klasse haben keinen Zugriff auf Variablen/Methoden die hier deklariert werden.
Protected ist weniger restriktiv, alles was hier steht ist für Instanzen der gleichen Klasse sowie alle Nachfahren sichtbar. Hast Du also zwei Exemplare von TDeineKlasse, können diese auf die protected Variablen des jeweils anderen Exemplar zugreifen. Eine Instanz von TForm1 kann das aber z.B. nicht.
Alles was öffentlich ist, ist auch wirklich für jeden Sichtbar. Alles was public ist kann von jedem gelesen/geschrieben (Variablen/Eigenschaten) oder aufgerufen (Methoden) werden.
Die Veröffentlichung verhält sich genauso wie der öffentliche Bereich, alle Eigenschaften die Du hier aufführst werden aber auch im Objekt Inspektor angezeigt und können somit zur Design-Zeit verändert werden (nur wichtig wenn Du die Komponente installierst).

Bei den fertigen Formularen findest Du noch einen Bereich zwischen dem start der Klasse und private, indem alle Komponenten und Ereignisse, die Du zur Designzeit setzt auftauchen. Dieser Bereich sollte nie von Dir verändert/benutzt werden. Alles was hier steht entspricht von der Sichtbarkeit published. Dieser Bereich wird aber von Delphi verwaltet und sollte deswegen nicht von Dir verwendet werden.

Eine neue Instanz einer klasse erzeugst Du mit dem Aufruf des Konstruktors (Create). Ist die Klasse ein Nachfahre von TControl, so kann sie auch angezeigt werden. Dazu kannst Du einfach ihre Eigenschaft Parent setzen oder die Funktion insertControl der Komponente aufrufen, auf dem die Instanz angezeigt werden soll.
Das ganze als Beispiel:
Delphi-Quellcode:
type
  // Neue Klasse die von TPanel erbt
  // hier keine neuen Eigenschaften hinzugefügt
  TMeineKlasse = class(TPanel)
  end;

...

var instanz: TMeineKlasse;
begin
  instanz := TMeineKlasse.Create(self);
  instanz.Width := 100;
  instanz.Heigth := 50;
  instanz.Left := 8;
  instanz.Right = 8;
  self.insertControl(instanz);
end;
Die Methode hier könnte jetzt zu deinem Formular gehören (z.B. beim Druck eines Button oder so). Wichtig ist, dass self hier auch eine sichtbare Komponente (also z.B. ein Formular oder ein Panel) referenziert. Du könntest es z.B. auch durch Form1 ersetzen (wobei deine Formulare hoffentlich bessere Namen haben).
Ja, was Du da siehst ist, wie Du zur Laufzeit eine Instanz erzeugst, ihre Eigenschaften einfach setzt (kannst natürlich auch andere setzen!) und sie dann anzeigst.

Gruß Der Unwissende

Evian 19. Jan 2007 20:16

Re: Klasse zur Darstellung einer Ampel.
 
Vielen Danke.. ich schaue es mir nachher mal an und gebe dann Auskunft darüber, ob alles geklappt hat :)

Evian 21. Jan 2007 22:06

Re: Klasse zur Darstellung einer Ampel.
 
Liste der Anhänge anzeigen (Anzahl: 1)
So es hat Prima geklappt ... nur bin ich jetzt ein wenig stuzig. Ich habe ein paar Variablen im private-Bereich meiner neuen Klasse deklariert, kann aber trotzdem ohne Probleme vom Hauptformular direckt auf sie zugreifen. Von Java und C++ kenne ich es so, dass ich auf solche Variablen nur per get und set Methoden zugreifen kann.

Warum ist das hier so?!

(neue Code hängt hinten drann)

Luckie 21. Jan 2007 22:10

Re: Klasse zur Darstellung einer Ampel.
 
Ein Klassentutorial gibt es auch bei mir: http://delphitutorials.michael-puff.de

Jelly 21. Jan 2007 22:19

Re: Klasse zur Darstellung einer Ampel.
 
Zitat:

Zitat von Evian
Ich habe ein paar Variablen im private-Bereich meiner neuen Klasse deklariert, kann aber trotzdem ohne Probleme vom Hauptformular direckt auf sie zugreifen.

Der Unwissende hat di hier nur die halbe Wahrheit geschildert. Definierst du unterschiedliche Klassen in der gleichen Unit, so können die untereinander sehr wohl auf deren private Eigenschaften und Methoden zugreifen. Willst Du auch das verhindern, so solltest Du den privaten Bereich mit
Delphi-Quellcode:
strict private
deklarieren.

Das gibts aber erst seit Delphi 2006 (oder 2005 :gruebel: )

Evian 21. Jan 2007 22:29

Re: Klasse zur Darstellung einer Ampel.
 
Alles klar...

vielen Dank für die ganze Wahrheit :).


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:44 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