AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi OI-Einstellung einer Komponente wird nur in Desingmodus geändert
Thema durchsuchen
Ansicht
Themen-Optionen

OI-Einstellung einer Komponente wird nur in Desingmodus geändert

Ein Thema von djmsc · begonnen am 15. Aug 2020 · letzter Beitrag vom 23. Aug 2020
Antwort Antwort
djmsc

Registriert seit: 5. Feb 2005
11 Beiträge
 
#1

OI-Einstellung einer Komponente wird nur in Desingmodus geändert

  Alt 15. Aug 2020, 18:23
Hallo Gemeinde,

ich habe eine Komponente geschrieben (Kalender) die zwei Button enthält mit denen man die Monate vor und zurück blättern kann.
Das funktioniert soweit aber die Eigenschaften der Button die ich im OI einstellen kann werden nach dem Start des Programms nicht übernommen.
Im Designmodus ändern sich aber die Einstellungen.
Es werden also nach dem Start nur die Standartvorgaben genommen. Was mache ich falsch?

Hier mal noch der Kopf meiner Komponente
Code:
unit Kalender;

interface

uses
  SysUtils, Classes, Controls, Graphics, Messages, Windows, Dialogs, StdCtrls,
  Calc, MyButton;

type
    TKalender = class(TCustomControl)
  private
    FNextButton: TMyButton;
    FBackButton: TMyButton;
    procedure CanvasLastDays;
    procedure CanvasNextDays;
    procedure CanvasDays;
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
    procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
    procedure NextButtonClick(Sender: TObject);
    procedure BackButtonClick(Sender: TObject);
    { Public-Deklarationen }
  published
    property Enabled;
    property Font;
    property ShowHint;
    property Visible;
    property OnClick;
    property OnMouseDown;
    property OnMouseUp;
    Property NextButton: TMyButton read FNextButton;
    property BackButton: TMyButton read FBackButton;
    { Published-Deklarationen }
  end;


procedure Register;
vielleicht kann mir ja jemand helfen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: OI-Einstellung einer Komponente wird nur in Desingmodus geändert

  Alt 15. Aug 2020, 18:48
Der Witz ist erstmal, dass du unbedingt einen Setter brauchst, auch wenn NextButton und BackButton nicht von außerhalb geändert werden dürfen.
Aber damit das Property vom DFM-Reader/Writer behandelt wird, ist das leider nötig.

Man könnte den Setter hier einfach leer lassen,
und ich würde hier im Setter auch nichts machen, außer bei NewValue<>OldValue eine Exception werfen zu werfen, falls irgedwer im Code doch mal was zuweisen will.

Und dann mußt du bei deinen Unterkomponenten auch Hier im Forum suchenSetSubComponent aufrufen,
denn sonst denkt der DFM-Writer es wäre ein "Link", ähnlich den Links für DataSet oder PopupMenu, wo die Eigenschaften der Komponenten ja wo anders gespeichert sind.
Delphi-Quellcode:
FNextButton := TMyButton.Create(Self);
FNextButton.SetSubComponent(True);

Ist dir schonmal aufgefallen, dass Property manchmal andere Farben haben?
Dieses zeigt z.B. ein derartiges Speicherverhalten an. (bei vererbten Forms stimmt die Anzeige nur nicht immer)



Public NextButtonClick?
Willst du diese Events wirklich in der DFM gespeichert haben?

Besser Sicherer wäre es diese Events nicht an Button.OnClick zu hängen, was man z.B. im Property-Editor dann ändern könnte
und dein internes Event dann nicht mehr funktioniert.

Im Button sollte es eine Click- oder DoClick-Methode geben, worin das OnClick-Event aufgerufen wird.
Diese Methode kannst du überschreiben und darin das Ereignis "direkt" in deine Klasse weiterleiten.
Entweder ein zurätzliches eigenes Protected-OnMyClick-Event in den TMyButton einbauen, wo sich den TKalender anhängt,
oder diese Methode direkt aus dem Button (Owner as TKalender).DoButtonClick(Self) .
Also zwei Methoden in TKalender oder eine Methode, die über den Sender/Parameter erkennt welcher Button es ist.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Aug 2020 um 19:00 Uhr)
  Mit Zitat antworten Zitat
djmsc

Registriert seit: 5. Feb 2005
11 Beiträge
 
#3

AW: OI-Einstellung einer Komponente wird nur in Desingmodus geändert

  Alt 15. Aug 2020, 18:59
Ok danke das probiere ich mal.
  Mit Zitat antworten Zitat
djmsc

Registriert seit: 5. Feb 2005
11 Beiträge
 
#4

AW: OI-Einstellung einer Komponente wird nur in Desingmodus geändert

  Alt 15. Aug 2020, 19:50
Also jetzt funktioniert es
Danke nochmal
Und die OnClick Geschichte werde ich auch noch ändern.

PS: Das Ganze sieht bis jetzt so aus (siehe Anhang) und ich muss noch einiges daran basteln
Miniaturansicht angehängter Grafiken
kalender.jpg  

Geändert von djmsc (15. Aug 2020 um 19:56 Uhr)
  Mit Zitat antworten Zitat
djmsc

Registriert seit: 5. Feb 2005
11 Beiträge
 
#5

AW: OI-Einstellung einer Komponente wird nur in Desingmodus geändert

  Alt 22. Aug 2020, 23:13
Ich habe ein weiteres kleines Problem mit meiner Komponente.

Nach dem ich alles angepasst, kompiliert und die Kompo auf eine Form gezogen habe kam folgende Fehlermeldung

Fehlermeldung

Ich habe herausgefunden, dass es an der Caption vom Button liegt (siehe Code-Schnipsel).

Code:
constructor TKalender.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FBackButton := TMyButton.Create(self);
  with FBackButton do begin
       Parent := self;
       SetSubComponent(true);
       left := 8;
       top := 8;
       width := 25;
       height := 25;
       //Caption := 'b';        Fehlermeldung wenn aktiv
       visible := true;
       OnClick := BackButtonClick;
  end;
Nur kapiere ich das nicht ganz, warum sich die Caption nicht ändern lässt.

PS: Wenn die Kompo schon auf einer Form ist und ich etwas ändere kommt die Fehlermeldung nicht nur wenn ich sie auf einer leeren Form hinzufüge.
Miniaturansicht angehängter Grafiken
fehlerdelphi.jpg  

Geändert von djmsc (22. Aug 2020 um 23:17 Uhr) Grund: Nachtrag
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: OI-Einstellung einer Komponente wird nur in Desingmodus geändert

  Alt 22. Aug 2020, 23:49
Liegt zu dem Zeitpunkt die Komponente auf einer sichtbaren Form? (Parent)

SetCaption wird ein Repaint auslösen und dafür muß ein aktiver Canvas zur Verfügung stehen.
Versuche mal den Parent deines Buttons zuletzt zu setzen, bzw. sieh nach was der Setter vom Caption so alles macht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Aug 2020 um 23:52 Uhr)
  Mit Zitat antworten Zitat
djmsc

Registriert seit: 5. Feb 2005
11 Beiträge
 
#7

AW: OI-Einstellung einer Komponente wird nur in Desingmodus geändert

  Alt 22. Aug 2020, 23:55
Wie ich schon im PS geschrieben habe. Wenn die Kompo bereits auf einer sichtbaren Form liegt und ich Änderungen vornehme gibt es keine Fehlermeldungen. Nur wenn ich die Kompo mit den Änderungen auf eine leere Form ziehe gibt es die Fehlermeldung bei aktivierter Caption.

himitsu schrieb:
Versuche mal den Parent deines Buttons zuletzt zu setzen, bzw. sieh nach was der Setter vom Caption so alles macht.

Werde ich mal testen und nachsehen

Geändert von djmsc (22. Aug 2020 um 23:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: OI-Einstellung einer Komponente wird nur in Desingmodus geändert

  Alt 23. Aug 2020, 00:11
Im Constructor ist die Komponente noch nicht auf der Form.

Parent deines TKalender wird erst nach dem Constructor zugewiesen.

Delphi-Quellcode:
inherited Create(AOwner);
if AOwner is TWinControl then
  Parent := TWinControl(AOwner);
"Normaler Weise" wird/sollte bei Änderungen von Eigenschaften kein Repaint oder Dergleichen ausgelöst werden (von dir), wenn es noch noch nichts zum Zeichnen gibt.
Man kann z.B. auf HandleAllocated prüfen, bevor man auf Handle oder Canvas zugreift oder etwas machen will, was Diese benötigt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Aug 2020 um 00:15 Uhr)
  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 03:51 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