Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Eigene Komponente-Objektinspektor (https://www.delphipraxis.net/189510-eigene-komponente-objektinspektor.html)

LokutusvB 20. Jun 2016 13:34

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?

DeddyH 20. Jun 2016 13:49

AW: Eigene Komponente-Objektinspektor
 
Hat die Property auch einen Setter, oder greifst Du direkt auf das Feld zu?

LokutusvB 20. Jun 2016 14:02

[gelöst] AW: Eigene Komponente-Objektinspektor
 
Die Eigenschaft hat beides:

Delphi-Quellcode:
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;
Zusatz:
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;
:)

himitsu 20. Jun 2016 17:58

AW: [gelöst] AW: Eigene Komponente-Objektinspektor
 
Zitat:

Zitat von LokutusvB (Beitrag 1340645)
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.

Das stimmt so nicht ganz.
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

LokutusvB 21. Jun 2016 07:22

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;

himitsu 21. Jun 2016 11:03

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.

LokutusvB 22. Jun 2016 14:26

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?

himitsu 22. Jun 2016 14:31

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.

LokutusvB 23. Jun 2016 06:42

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?

jaenicke 23. Jun 2016 07:43

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 06:17 Uhr.
Seite 1 von 2  1 2      

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