![]() |
Eigenes Objekt welches TLabel, TImage nutzt
Hallo zusammen
Ich stehe vor folgendem Problem: Um ein schönes, ansprechendes Menu zu erstellen, möchte ich mit TImage und TLabel ein paar "Buttons" machen. Dies habe ich bisher manuell gelöst. Einzelne Images und Labels auf die Form gezogen und entsprechend Code dazu geschrieben. Nun würde ich dies jedoch gerne in ein eigenes Objekt verpacken. Dazu habe ich mir gedacht, dass mich meinem Objekt mitteile, wie viele Buttons ich habe, bzw. mittels objekt.AddButton einen neuen hinzufügen kann. Zum Thema Objekterstellung habe ich mich hier eingelesen: ![]() ![]() Dies sollte kein grösseres Problem darstellen. Was mir jetzt jedoch noch nicht ganz klar ist, ob ich denn innerhalb meines Objektes auch Objekte vom Typ TLabel, TImage und z.B. TStringlist instanzieren darf? Darf ich z.B. auch sowas machen:
Delphi-Quellcode:
FIcon, FText und FHooverImage würde ich dann im TmyObject.Create mittels FIcon := TImage.Create instanzieren.
unit myObject;
interface type TmyObject = class constructor Create; private FHooverImage: TImage; //<--- Timage FIcon: TImage; FText: TLabel; //<--- Label FHeight procedure SetHeight(Height:integer); public property Height: integer read FHeight write SetHeight; end; Falls nicht, wie macht man dies in meinem Fall? Danke schonmal |
AW: Eigenes Objekt welches TLabel, TImage nutzt
Grundsätzlich kann man so machen allerdings würde man eine geeignete Basisklasse wählen. In diesem Fall würde sich ein TPanel o.ä. anbieten.
Im Konstruktor musst Du Deine Subkomponenten erzeugen Wenn Du Dein Objekt als Owner nimmst, kannst Du auf einen Destruktor für die Freigabe der Komponenten verzichten. |
AW: Eigenes Objekt welches TLabel, TImage nutzt
Zitat:
Bei FIcon := TImage.Create(); übergebe ich da am besten "self"? |
AW: Eigenes Objekt welches TLabel, TImage nutzt
Und damit man es überhaupt auf die Form drauf bekommt, muß es mindestens von TComponent oder TWinControl erben, bzw. einer anderen Container-Komponente (wie z.B. dem TPanel, wo man andere Komponenten drin aufnehmen kann)
TLabel und TImage malen nur selber auf das Canvas des Parent, was man auch selber machen kann, also z.B. von TPaintBox erben und im Paint den Text und ein TBitMap (oder eine andere Grafikkomponente) auf dessen Canvas drauf malen. Zitat:
|
AW: Eigenes Objekt welches TLabel, TImage nutzt
Vielen Dank!
Hat wunderbar geklappt! Sobald ich fertig bin, werde ich den Code bzw. die Klasse veröffentlichen. Nur noch etwas beschäftigt mich. Ich würde gerne ausserhalb des Objekts eine Prozedur definieren, welche ich innerhalb meines Objekts aufrufen kann. Sinn und Zweck soll sein, dass wenn jemand auf ein Image klickt und somit den Button betätigt, soll dies der Anwender aussehalb meines Objektes erfahren, indem seine zuvor definierte Prozedur aufgerufen wird. Nun weiss ich jedoch nicht, wie ich eine solche Variable definieren soll, damit ich schlussendlich meine Prozedur übergeben kann.
Delphi-Quellcode:
Innerhalb meines Objektes möchte ich dann einfach folgendes tun:
myObject.OnClickProzedur := MeineEigeneProzedur;
Delphi-Quellcode:
if assigned(OnClickProzedur) then OnClickProzedur(self);
Hoffe jemand kann mir helfen. |
AW: Eigenes Objekt welches TLabel, TImage nutzt
siehe
![]() |
AW: Eigenes Objekt welches TLabel, TImage nutzt
Zitat:
Delphi-Quellcode:
Dies gibt mir eine Fehlermeldung:
type TmyObject = class(TPanel)
private ... FOnButtonClick:TNotifyEvent; public property OnButtonClick: TNotifyEvent read FOnButtoClick write FOnButtoClick; ... end; ... procedure MeineFunktion; begin ShowMessage(inttostr(Form1.test.ButtonActive)); end; ... var test:TmyObject ... test.onButtonClick := MeineFunktion; "Inkompatible Typen: Methodenzeiger und reguläre Prozedur" |
AW: Eigenes Objekt welches TLabel, TImage nutzt
Stimmt ja auch. TNotifyEvent ist ein Zeiger auf ein ein 'Procedure of Object', deine 'MeineFunktion' nur eine Prozedur.
Erstelle Dir eine Klasse mit einer Methode 'MeineFunktion'. Ich würde aber eher ein TFrame verwenden: Ist einfacher, finde ich. Das muss man nicht erst als Komponente registrieren. Man hat aber trotzdem den Vorteil, sich das im Designer zurecht schubsen zu können. |
AW: Eigenes Objekt welches TLabel, TImage nutzt
Zitat:
Wenn ich im Public Bereich der Klasse
Delphi-Quellcode:
schreibe, dann meldet er "Ungenügende Forward-oder External-Deklaration"
procedure MeineFunktion;
Wie kann ich dem Compiler mitteilen, dass diese Prozedur erst später definiert wird und zwar von ausserhalb der Klasse? Zum Thema TFrame. Ich benötige ein TLabel als Grundlage, da es mir als Container für meine Objekte dient und ich zudem damit die Hintergrundfarbe anpassen kann. TFrame kenne ich noch nicht und weiss nicht ob es damit genau so einfach gewesen wäre. |
AW: Eigenes Objekt welches TLabel, TImage nutzt
MeineFunktion kann bzw. soll ja auch außerhalb der Klasse sein, aber dafür eine Methode einer anderen Klasse. Deine ist eine sog. "reguläre Prozedur", das ist etwas anderes.
|
AW: Eigenes Objekt welches TLabel, TImage nutzt
Vielen Dank für deine Antwort.
Leider ist diese Thematik noch ein bisschen Neuland für mich. Bei einem OnClick von einem Objekt wie z.B einem TLabel kann ich ja auch eine externe Prozedur zuweisen. Wie wird dass dan da gelöst? |
AW: Eigenes Objekt welches TLabel, TImage nutzt
Zitat:
Es muß immer eine "Methode" (Prozedur in irgendeiner Klasse) sein, welche einen Parameter vom Typ TObjekt hat. |
AW: Eigenes Objekt welches TLabel, TImage nutzt
Danke
Jetzt habe ich es verstanden! Einfach die Funktion noch innerhalb der Klasse z.B. im "private" Bereich bekannt machen. Dann gehts :) |
AW: Eigenes Objekt welches TLabel, TImage nutzt
Und dann heisst das auch Methode :stupid:
|
AW: Eigenes Objekt welches TLabel, TImage nutzt
Liste der Anhänge anzeigen (Anzahl: 2)
Hier noch das Ergebnis
Eine Klasse um Menus zu erzeugen. Dynamisch beliebige Buttons hinzufügen mit definiertem Spacing und hoover Bildern. Zudem kann beim AddButton noch angegeben werden ob er von oben her oder von unten hinzugefügt werden soll Es handelt sich um meine erste selbst geschriebene Klasse. |
AW: Eigenes Objekt welches TLabel, TImage nutzt
Zitat:
Schritt 1: Du deklarierst in der Klassen-Unit außerhalb der Klassen-Deklaration einen Ereignis-Typ:
Delphi-Quellcode:
Schritt 2: Damit hast du nun einen neuen Typ namens
UNIT UnitData;
INTERFACE USES SysUtils, StrUtils, Classes, DBAccess, IBC, DB, MemDS; TYPE // Das wird außerhalb der Klasse deklariert TUpdateStatusbarEvent = Procedure of Object; ... TYPE // ab hier beginnt dann die eigentliche Klasse TDatMod = CLASS(TDataModule) ... end.
Delphi-Quellcode:
. Nun deklarierst du eine Variable von diesem Typ im Private-Abschnitt:
TUpdateStatusbarEvent
Delphi-Quellcode:
Schritt 3: Danach erzeugst du ein Property im Public-Bereich:
...
PRIVATE { Private-Deklarationen } Var fUpdateStatusbar : TUpdateStatusbarEvent; ... end.
Delphi-Quellcode:
Schritt 4: In deiner aufrufenden Unit, in der etwas passieren soll, weist du nun dieses Ereignis deines Objekts (deiner Klasse) einer Methode deiner aufrufenden Unit zu, hier der Aktualisierung der Statusbar:
...
PUBLIC { Public-Deklarationen } ... Property OnUpdateStatusbar : TUpdateStatusbarEvent read fUpdateStatusbar write fUpdateStatusbar; ... end.
Delphi-Quellcode:
Schritt 5: Um nun im Datenmodul ein Ereignis auszulösen, verwende ich folgenden Code genau dort, wo das Ereignis ausgelöst werden soll, z.B. in der AfterScroll-Ereignisbehandlung:
Procedure TFormMain.FormCreate(Sender: TObject);
begin .. DatMod.OnUpdateStatusbar := StatusBarAktuell; // DatMod ist hier die Variable für die Instanz des Datenmoduls .. end;
Delphi-Quellcode:
In meiner Hauptform wird nun immer dann, wenn sich in dieser Tabelle der Datensatzzeiger ändert (gescrollt wird), die private Methode
Procedure TDatMod.View_LogAccessAfterScroll(DataSet: TDataSet);
begin If Assigned(fUpdateStatusbar) Then fUpdateStatusbar; end;
Delphi-Quellcode:
aufgerufen.
StatusBarAktuell;
|
AW: Eigenes Objekt welches TLabel, TImage nutzt
In Perlsaus Schritt für Schritt Anleitung fehlt mMn nur ein Schritt/Punkt (ich glaube genau der mit dem der TE sein Problem hatte), was ist "StatusBarAktuell" bzw. wo ist das wie definiert (Schon klar, ist eine Methode von TFormMain). Vielleicht könnte Perlsau das noch ergänzen, dann wäre das Mini-Tutorial zum Methodenzeiger komplett.
|
AW: Eigenes Objekt welches TLabel, TImage nutzt
"StatusBarAktuell" ist, wie ich oben bereits bemerkte, eine private Methode der aufrufenden Unit, hier der Mainform. Was gibt es da noch zu erklären? Das, was in dieser Methode passiert, sind Einträge in die Statusbar der Mainform. Wie man eine private Methode deklariert und implementiert, ist doch hier nicht das Thema, oder? Vermutlich möchte der TE an dieser Stelle gar keine Statusbar aktualisieren, sondern was ganz anderes ausführen? Welche Rolle sollte das spielen? Oder anders gefragt: Was ist dir denn jetzt tatsächlich noch unklar? Wie die Deklaration oder die Implementation einer Methode auszusehen hat? Zudem steht es dir jederzeit frei, meine kleine Anleitung zu ergänzen, wenn du meinst, da fehle noch etwas. Aus meiner Sicht fehlt da gar nichts:
Es handelt sich also um eine allgemeine Erklärung, die anhand eines quasi beliebigen Beispiels (das, das ich verwende, habe ich bereits mehrfach auf Platte, das finde ich leicht, weil's immer im Datenmodul ist, und das muß ich nicht hier reintippen, sondern kann Copy&Paste verwenden) ein Schritt-für-Schritt-Tuturial darstellt. Ansonsten ist die Wahl des Beispiels gewissermaßen unerheblich. Eine allgemeine Erklärung beschreibt eine Vorgehensweise, die bei vielen verschiedenen Situationen angewendet werden kann. So hab ich hier z.B. auch eigene Klassen, die Ereignisse auslösen (Datenmodul ist keine "eigene" Klasse, die hab ich nicht selbst bzw. nicht vollständig selbst geschrieben). Ich bin mir ziemlich sicher, daß jeder, der diese Anleitung Schritt für Schritt befolgt, zum gewünschten Ergebnis gelangt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 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