AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Komponente-Objektinspektor

Ein Thema von LokutusvB · begonnen am 20. Jun 2016 · letzter Beitrag vom 23. Jun 2016
Antwort Antwort
LokutusvB

Registriert seit: 18. Jul 2006
277 Beiträge
 
Delphi XE6 Enterprise
 
#1

Eigene Komponente-Objektinspektor

  Alt 20. Jun 2016, 13:34
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?
MFG
LokutusvB
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#2

AW: Eigene Komponente-Objektinspektor

  Alt 20. Jun 2016, 13:49
Hat die Property auch einen Setter, oder greifst Du direkt auf das Feld zu?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
LokutusvB

Registriert seit: 18. Jul 2006
277 Beiträge
 
Delphi XE6 Enterprise
 
#3

[gelöst] AW: Eigene Komponente-Objektinspektor

  Alt 20. Jun 2016, 14:02
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;
MFG
LokutusvB

Geändert von LokutusvB (20. Jun 2016 um 15:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 20. Jun 2016, 17:58
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: if csDesigning in ComponentState then
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
LokutusvB

Registriert seit: 18. Jul 2006
277 Beiträge
 
Delphi XE6 Enterprise
 
#5

AW: Eigene Komponente-Objektinspektor

  Alt 21. Jun 2016, 07:22
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;
MFG
LokutusvB

Geändert von LokutusvB (21. Jun 2016 um 10:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#6

AW: Eigene Komponente-Objektinspektor

  Alt 21. Jun 2016, 11:03
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:17 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