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
Seite 1 von 2  1 2      
LokutusvB

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

Eigene Komponente-Objektinspektor

  Alt 20. Jun 2016, 14: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.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: Eigene Komponente-Objektinspektor

  Alt 20. Jun 2016, 14: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, 15: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 16:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 20. Jun 2016, 18: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
$2B or not $2B
  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, 08: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 11:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Eigene Komponente-Objektinspektor

  Alt 21. Jun 2016, 12: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.
$2B or not $2B
  Mit Zitat antworten Zitat
LokutusvB

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

AW: Eigene Komponente-Objektinspektor

  Alt 22. Jun 2016, 15:26
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?
MFG
LokutusvB
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Eigene Komponente-Objektinspektor

  Alt 22. Jun 2016, 15:31
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.
$2B or not $2B
  Mit Zitat antworten Zitat
LokutusvB

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

AW: Eigene Komponente-Objektinspektor

  Alt 23. Jun 2016, 07:42
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?
Angehängte Dateien
Dateityp: zip btnCheck.zip (351 Bytes, 2x aufgerufen)
MFG
LokutusvB

Geändert von LokutusvB (23. Jun 2016 um 08:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Eigene Komponente-Objektinspektor

  Alt 23. Jun 2016, 08:43
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"
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:14 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