Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi OI-Einstellung einer Komponente wird nur in Desingmodus geändert (https://www.delphipraxis.net/205234-oi-einstellung-einer-komponente-wird-nur-desingmodus-geaendert.html)

djmsc 15. Aug 2020 18:23

OI-Einstellung einer Komponente wird nur in Desingmodus geändert
 
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 :-)

himitsu 15. Aug 2020 18:48

AW: OI-Einstellung einer Komponente wird nur in Desingmodus geändert
 
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
Delphi-Quellcode:
(Owner as TKalender).DoButtonClick(Self)
.
Also zwei Methoden in TKalender oder eine Methode, die über den Sender/Parameter erkennt welcher Button es ist.

djmsc 15. Aug 2020 18:59

AW: OI-Einstellung einer Komponente wird nur in Desingmodus geändert
 
Ok danke das probiere ich mal.

djmsc 15. Aug 2020 19:50

AW: OI-Einstellung einer Komponente wird nur in Desingmodus geändert
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

djmsc 22. Aug 2020 23:13

AW: OI-Einstellung einer Komponente wird nur in Desingmodus geändert
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

himitsu 22. Aug 2020 23:49

AW: OI-Einstellung einer Komponente wird nur in Desingmodus geändert
 
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.

djmsc 22. Aug 2020 23:55

AW: OI-Einstellung einer Komponente wird nur in Desingmodus geändert
 
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 :-)

himitsu 23. Aug 2020 00:11

AW: OI-Einstellung einer Komponente wird nur in Desingmodus geändert
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:56 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