![]() |
Eigene Komponente-Objektinspektor
Hallo,
ich habe mir eine eigene Komponente, abgeleitet von TCustomControl erstellt. Dabei handelt es sich im wesentlichen um einen Button, ein paar Panel und ein Bild. Das ganze soll eine Checkbox simulieren. Drücke ich den Button, wird checked entweder True oder False und das Bild sichtbar oder unsichtbar. Das läuft auch soweit alles. Die Komponente wird auch richtig im Objektinspektor dargestellt, bis auf die Ereignisreaktion, wenn ich Checked ändere. Der Wert wird zwar beim Programmstart richtig übernommen, aber in der Form selbst im Editor erfolgt keine Reaktion. Was muß ich machen, das im Formulareditor auch auf eine Änderung der Checked-Property des Objektinspektors reagiert wird und das Bild entsprechend sichtbar oder nicht sichbar ist? |
AW: Eigene Komponente-Objektinspektor
Hat die Property auch einen Setter, oder greifst Du direkt auf das Feld zu?
|
[gelöst] AW: Eigene Komponente-Objektinspektor
Die Eigenschaft hat beides:
Delphi-Quellcode:
Zusatz:
function tBtnCheck.GetChecked;
begin Result := (PFState = cbChecked); end; procedure tBtnCheck.SetChecked(val: Boolean); begin if val then PFState := cbChecked else PFState := cbUnchecked; CheckImg.Visible := val; Paint; end; Wenn man mal weg vom Quelltext darüber nachdenkt, erscheint dieser Zustand als völlig logisch, da im Objektinspektor bzw. Formulareditor die Eigenschaft Visible keine Auswirkung hat. Ich habe es nun so abgeändert und nun funktioniert es zu meiner Zufriedenheit:
Delphi-Quellcode:
:)
procedure tBtnCheck.SetChecked(val: Boolean);
begin if val then begin PFState := cbChecked; CheckImg.Picture.Bitmap.LoadFromResourceName(HInstance,'BMPCHECK'); end else begin PFState := cbUnchecked; CheckImg.Picture.Bitmap := nil; end; CheckImg.Visible := val; CheckImg.Invalidate; end; |
AW: [gelöst] AW: Eigene Komponente-Objektinspektor
Zitat:
Es hängt davon ab, wie CheckImg erstellt wurde und ob es im FormDesigner als Design-Komponente behandelt wird oder nicht. Welcher Owner und SetSubComponent? Tipp:
Delphi-Quellcode:
if csDesigning in ComponentState then
|
AW: Eigene Komponente-Objektinspektor
Ich muß gestehen himitsu, damit habe ich mich noch nicht beschäftigt. Der Owner im constructor ist TComponent. Mit SetSubComponent habe ich noch nie wissentlich gearbeitet. Da muß ich erst mal nachlesen, was genau das bewirkt. Gleiches gilt für deinen Tipp.
PS: Ich habe es nun so gelöst. So sollte es in Ordnung sein. Wärend der Programmausführung wird nur Visible verändert, im Designer wird das Bild geladen oder gelöscht.
Delphi-Quellcode:
if val then begin
PFState := cbChecked; if csDesigning in ComponentState then CheckImg.Picture.Bitmap.LoadFromResourceName(HInstance,'BMPCHECK'); end else begin PFState := cbUnchecked; if csDesigning in ComponentState then CheckImg.Picture.Bitmap := nil; end; CheckImg.Visible := val; CheckImg.Invalidate; |
AW: Eigene Komponente-Objektinspektor
Grundsätzlich gibt es zwei Vorgehen:
1. Man erstellt zwei getrennte Komponenten, die gleich heißen oder einen gleichnamigen Alias besitzen. Eine Runtime-Komponente und noch eine Designtimekomponente mit gleichem Namen/Alias. Das ist vorallem dan ganz praktisch, wenn die Komponente sich im Formdesigner komplett anders verhält, wie zur Laufzeit, bzw. wo man den Laufzeitcode komplett aus der IDE raus halten will und dort nur einen Dummy für die Property haben möchte. 2. Man kann z.B. mit csDesigning DesignTime-Code, bzw. Runtime-Code jeweils (de)aktivieren. 2.5. Man ignoriert einfach alles und läßt sie Komponente überall gleich reagieren, bzw. man leitet ab, verwendet das Verhalten der bestehenden Komponente und beim eigenen Code ist es egal wo er läuft. Mit SetSubComponent kann man vorallem das Verhalten steuern, wenn in einem öffentlichen Property eine "interne" Komponente sichtbar ist und man dort will, dass dessen (Unter)Property gespeichert werden. Zusätzlich kann man selber "virtuelle" Property speichern. (siehe z.B. Left und Top bei den nichtvisuellen Komponenten ala TTimer, welche eigentlich keine solchen Property besitzen) Wer der Owner ist, also die Form/Fram oder jemand Anders/Niemand, dass endscheidet auch, über das (automatische) Speichern der Komponente/Property. |
AW: Eigene Komponente-Objektinspektor
Danke für die Informationen.
Ich habe nun die fertige Komponente in Delphi installiert. Nun habe ich das folgende Problem und keine Lösung dafür. Sobald ich die Komponente in einem Projekt benutze, wird nun auch das Symbol der Komponente aus der DRC-Datei als Programmsymbol genutzt. Selbst wenn ich die Komponente wieder aus dem projekt entferne und das Sysmbol der Anwendung neu zuweise, bleibt das Programmsymbol das Symbol der Komponente. Hier hat nur das Laden einer älteren Sicherung geholfen. Wo könnte hierfür die Ursache liegen? |
AW: Eigene Komponente-Objektinspektor
Die Unit ist noch in Uses drin, also werden auch die Ressourcen dieser Unit mit eingebungen.
Unit weg => Icon weg Wir sieht die DCR aus? Vermutlich denkt Windows, dein Icon wäre das ProgrammIcon, weil dessen Name/ID ungünstig ist, bzw. weil Windows zuerst in den Ressourcen auf dein Icon stößt. |
AW: Eigene Komponente-Objektinspektor
Liste der Anhänge anzeigen (Anzahl: 1)
Hm, das ist aber bisher bei anderen selbst erstellten Komponenten nicht so gewesen.
Im Anhang lade ich die DCR hoch. PS: An der DCR liegt es nicht, auch ohne DCR erscheint das Icon, das wird wohl aus der RES-Datei gezogen. :( PS1: Manchmal hilft schon, rabüer zu "sprechen". Ich hatte in der RES-Datei aus Testgründen neben dem Bitmap noch ein Icon reingestellt. Dieses Icon hat es die ganze Zeit gezogen. Aber eigentlich sollte das doch auch nicht passieren, oder? |
AW: Eigene Komponente-Objektinspektor
Wie heißt die Klasse denn aktuell?
Wichtig ist eigentlich nur, dass der Klassenname mit einem großen T beginnt (sonst wurde es sporadisch nicht gefunden) und das Bild in der Ressource genau so heißt. So sieht zum Beispiel bei mir ein entsprechende Ressourcenskript aus:
Code:
TButtonEx BITMAP "ButtonEx.bmp"
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:29 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