|
![]() |
|
Registriert seit: 31. Jan 2006 Ort: Weimar 345 Beiträge Delphi 10.4 Sydney |
#1
Huhu.
Scheinbar habe ich einige Prizipien nicht gelernt/verstanden. Nachdem ich die beiden Subkomponenten verschoben abe, ist es mir nicht mehr möglich, Standard-Eigenschaften von den Komponenten anzusprechen.
Delphi-Quellcode:
Jetzt müsste ich der Hauptkomponente also alle Eigenschaften, die ich später im Code setzten möchte, noch hinzufügen.
public
property SubImage: TImage read FSubImage; property SubLabel: TLabel read FSubLabel; Wo liegt jetzt der Vorteil in dieser Vorgensweise? LG nach Dubai ![]()
Mathias
Ich vergesse einfach zu viel. |
![]() |
Registriert seit: 15. Sep 2008 Ort: Dubai 749 Beiträge Delphi 10.3 Rio |
#2
Jetzt müsste ich der Hauptkomponente also alle Eigenschaften, die ich später im Code setzten möchte, noch hinzufügen.
Wo liegt jetzt der Vorteil in dieser Vorgensweise? Ich habe Komponenten die fassen 5 oder 6 andere in einer zusammen. Die möchte ich nicht alle im Property Editor haben. Ich lege für die dann aber garkein Property an. Ich habe ja die lokale Variable im Object. Aber, für alles was Du nur im Code setzen willst brauchst Du ja nicht wirklich Properties. Nur was über den Editor zur Designzeit einstellbar sein soll muss zwingend ein Property bekommen. Durch Getter und Setter hat man bestimmte Vorteile. Ich liebe Properties dafür. Aber die sind bei mir trotzdem nur public oder protected deklariert. Nicht published. Denn ich brauche sie nicht sichtbar zur Designzeit. weil ich nicht weiß, wie es anders gemacht wird und angenommen hatte, dass properties immer in published gehören. Ich mache die Programmiererei als Hobby, bin kein gelernter Programmierer.
Stefan
Nur die Besten sterben jung ![]() A constant is a constant until it change. |
![]() |
Registriert seit: 31. Jan 2006 Ort: Weimar 345 Beiträge Delphi 10.4 Sydney |
#3
Guten Morgen.
Hier ist ein Test, damit ich das Prinzip verstehen kann. Was mir jetzt fehlt, sind folgende Properties: Falls möglich, hätte ich die gerne gebündelt dargestellt, will heißen, im ObjectExplorer sollte z.B.:
Code:
erreichbar sein.
aImage + (aufklappbar)
- Caption - Visible aImage + (aufklappbar) - Picture - Visible [..] (weitere property)
Code:
TMyLabel ->
property Caption; property Visible; // als Test TMyImage -> property Picture; property Visible; // auch ein Test
Delphi-Quellcode:
unit ImageLabelTEST;
interface uses System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Graphics, Vcl.Forms; type TMyImage = class(TImage) private public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Picture; property Visible; end; TMyLabel = class(TLabel) private public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Caption; property Visible; end; TImageLabelTEST = class(TCustomControl) private FImage: TMyImage; FLabel: TMyLabel; function GetImage: TPicture; procedure SetImage(const Value: TPicture); function GetLabelCaption: TCaption; procedure SetLabelCaption(const Value: TCaption); function GetLabelFont: TFont; procedure SetLabelFont(const Value: TFont); protected procedure Resize; override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; property aImage: TMyImage read FImage; property aLabel: TMyLabel read FLabel; published // folgende properties würde ich gerne mit den properties aus den eigenen Subkomponenten ersetzen property I_Picture: TPicture read GetImage write SetImage; property L_Caption: TCaption read GetLabelCaption write SetLabelCaption; property L_Font: TFont read GetLabelFont write SetLabelFont; property Align; property Anchors; property Visible; end; procedure Register; implementation procedure Register; begin RegisterComponents('TRM', [TImageLabelTEST]); end; { TMyImage } constructor TMyImage.Create(AOwner: TComponent); begin inherited Create(AOwner); end; destructor TMyImage.Destroy; begin Self.Free; inherited Destroy; end; { TMyLabel } constructor TMyLabel.Create(AOwner: TComponent); begin inherited Create(AOwner); end; destructor TMyLabel.Destroy; begin Self.Free; inherited Destroy; end; { TImageLabel } constructor TImageLabelTEST.Create(AOwner: TComponent); begin inherited Create(AOwner); FImage := TMyImage.Create(Self); FImage.Parent := Self; FImage.Align := alTop; FImage.Height := 100; FLabel := TMyLabel.Create(Self); FLabel.Parent := Self; FLabel.Align := alClient; FLabel.Alignment := taCenter; end; procedure TImageLabelTEST.Resize; begin inherited; end; function TImageLabelTEST.GetImage: TPicture; begin Result := FImage.Picture; end; procedure TImageLabelTEST.SetImage(const Value: TPicture); begin FImage.Picture.Assign(Value); end; function TImageLabelTEST.GetLabelCaption: TCaption; begin Result := FLabel.Caption; end; procedure TImageLabelTEST.SetLabelCaption(const Value: TCaption); begin FLabel.Caption := Value; end; function TImageLabelTEST.GetLabelFont: TFont; begin Result := FLabel.Font; end; procedure TImageLabelTEST.SetLabelFont(const Value: TFont); begin FLabel.Font.Assign(Value); end; destructor TImageLabelTEST.Destroy; begin FImage.Free; FLabel.Free; inherited Destroy; end; end.
Mathias
Ich vergesse einfach zu viel. |
![]() |
Registriert seit: 15. Sep 2008 Ort: Dubai 749 Beiträge Delphi 10.3 Rio |
#4
Delphi-Quellcode:
// folgende properties würde ich gerne mit den properties aus den eigenen Subkomponenten ersetzen
property I_Picture: TPicture read GetImage write SetImage; property L_Caption: TCaption read GetLabelCaption write SetLabelCaption; property L_Font: TFont read GetLabelFont write SetLabelFont;
Delphi-Quellcode:
type
TMyImage = class(TImage) private public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Picture; property Visible; end; TMyLabel = class(TLabel) private public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Caption; property Visible; end; Alles was Du nicht unter published haben willst must Du in deiner Ableitung als public deklarieren. Weglassen bedeutet das es in der gleichen Sichtbarkeit bleibt wie es ist. Dann könntest du das so machen:
Delphi-Quellcode:
public
constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property ImageProps: TMyImage read FImage; property LabelProps: TMyLabel read FLabel; property Align; property Anchors; property Visible; end;
Stefan
Nur die Besten sterben jung ![]() A constant is a constant until it change. |
![]() |
Registriert seit: 31. Jan 2006 Ort: Weimar 345 Beiträge Delphi 10.4 Sydney |
#5
Ich verzweifle bald
![]() Testweise habe ich in den SubComponenten Anchors beim TImage und Caption beim TLabel in public verschoben. Dennoch sind die weiterhin im Objectexplorer sichtbar und auch änderbar. Wo ist denn mein Fehler im Code, damit die beiden Properties nicht mehr angezeigt werden?
Delphi-Quellcode:
LG Mathias
unit ImageLabelTEST;
interface uses System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Graphics, Vcl.Forms; type { TMyImage } TMyImage = class(TImage) private protected public property Anchors; published end; { TMyLabel } TMyLabel = class(TLabel) private protected public property Caption; published end; { TIMageLabelTest } TImageLabelTEST = class(TCustomControl) private MyImage: TMyImage; MyLabel: TMyLabel; protected public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Resize; override; published property MySubImage: TMyImage read MyImage; property MySubLabel: TMyLabel read MyLabel; end; procedure Register; implementation procedure Register; begin RegisterComponents('TRM', [TImageLabelTEST]); end; { TMyImage } { TMyLabel } { TImageLabel } constructor TImageLabelTEST.Create(AOwner: TComponent); begin inherited Create(AOwner); Self.Parent := TWinControl(AOwner); MyImage := TMyImage.Create(Self); MyImage.SetSubComponent(True); MyImage.Parent := Self; MyLabel := TMyLabel.Create(Self); MyLabel.SetSubComponent(True); MyLabel.Parent := Self; end; procedure TImageLabelTEST.Resize; begin inherited; end; destructor TImageLabelTEST.Destroy; begin MyImage.Free; MyLabel.Free; inherited Destroy; end; end.
Mathias
Ich vergesse einfach zu viel. |
![]() |
Registriert seit: 31. Jan 2006 Ort: Weimar 345 Beiträge Delphi 10.4 Sydney |
#6
Hallo an alle.
Danke für eure Hilfen. Inzwischen habe ich meine Komponente erweitert und bin zufrieden damit ![]()
Delphi-Quellcode:
LG und ein schönes langes Wochenende
unit TRM_ImageLabel;
(* TRM_ImageLabel erstellt von Mathias Fiege 2024 www.nogad.de Open Source License Permission is hereby granted, free of charge, to any person obtaining a copy of this software component and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Thanks and greetings to www.delphipraxis.net *) interface uses System.Classes, Vcl.Controls, Vcl.ExtCtrls, Vcl.Forms, Vcl.Imaging.GIFConsts, Vcl.Imaging.GIFImg, Vcl.Imaging.JConsts, Vcl.Imaging.jpeg, Vcl.Imaging.pngimage, Vcl.Imaging.pnglang, Vcl.StdCtrls, Vcl.Graphics; const _version = '2024.05.19.0015'; type TTRM_ImageLabel = class(TCustomPanel) private FSubImage: TImage; FSubImageAlign: TAlign; FSubLabel: TLabel; FSubLabelCaption: String; FSubLabelAlign: TAlign; FPictureDefault: TPicture; FPictureHover: TPicture; FPictureLeave: TPicture; FHoverLeaveLabel: Boolean; FHoverLeaveImage: Boolean; FVersion: String; function GetSubImageAlign: TAlign; procedure SetSubImageAlign(Value: TAlign); function GetPictureDefault: TPicture; procedure SetPictureDefault(Value: TPicture); procedure ChangePictureDefault(Sender: TObject); function GetPictureHover: TPicture; procedure SetPictureHover(Value: TPicture); function GetPictureLeave: TPicture; procedure SetPictureLeave(Value: TPicture); function GetLabelCaption: String; procedure SetLabelCaption(const Value: String); function GetSubLabelAlign: TAlign; procedure SetSubLabelAlign(Value: TAlign); procedure ImageClick(Sender: TObject); procedure ImageDblClick(Sender: TObject); procedure ImageMouseEnter(Sender: TObject); procedure ImageMouseLeave(Sender: TObject); procedure LabelClick(Sender: TObject); procedure LabelDblClick(Sender: TObject); procedure LabelMouseEnter(Sender: TObject); procedure LabelMouseLeave(Sender: TObject); protected public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property SubImage: TImage read FSubImage; property SubLabel: TLabel read FSubLabel; property Align; property Anchors; property BevelInner; property BevelKind; property BevelOuter; property BevelWidth; property BorderWidth; property BorderStyle; property Caption; property Ctl3D; property Cursor; property ParentBackground; property PopupMenu; property OnClick; property OnDblClick; property OnMouseEnter; property OnMouseLeave; property PictureDefault: TPicture read GetPictureDefault write SetPictureDefault; property PictureHover: TPicture read GetPictureHover write SetPictureHover; property PictureLeave: TPicture read GetPictureLeave write SetPictureLeave; property HoverLeaveLabel: Boolean read FHoverLeaveLabel write FHoverLeaveLabel default True; property HoverLeaveImage: Boolean read FHoverLeaveImage write FHoverLeaveImage default True; property ImageAlign: TAlign read GetSubImageAlign write SetSubImageAlign default alClient; property LabelCaption: String read GetLabelCaption write SetLabelCaption; property LabelAlign: TAlign read GetSubLabelAlign write SetSubLabelAlign default alBottom; property Version: String read FVersion; end; procedure Register; implementation procedure Register; begin RegisterComponents('TRM', [TTRM_ImageLabel]); end; { TTRM_ImageLabel } constructor TTRM_ImageLabel.Create(AOwner: TComponent); begin inherited Create(AOwner); Self.Parent := TWinControl(AOwner); FSubImage := TImage.Create(Self); FSubImage.SetSubComponent(True); FSubImage.Parent := Self; // FSubImage.Align := alClient; FSubImage.Center := True; FSubImage.OnClick := ImageClick; FSubImage.OnDblClick := ImageDblClick; FSubImage.OnMouseEnter := ImageMouseEnter; FSubImage.OnMouseLeave := ImageMouseLeave; FSubLabel := TLabel.Create(Self); FSubLabel.SetSubComponent(True); FSubLabel.Parent := Self; // FSubLabel.Align := alBottom; FSubLabel.AutoSize := True; FSubLabel.Height := 25; FSubLabel.AlignWithMargins := False; FSubLabel.Margins.Left := 0; FSubLabel.Margins.Right := 0; FSubLabel.Margins.Top := 8; FSubLabel.Margins.Bottom := 0; FSubLabel.Caption := '...'; FSubLabel.Font.Size := 14; FSubLabel.OnClick := LabelClick; FSubLabel.OnDblClick := LabelDblClick; FSubLabel.OnMouseEnter := LabelMouseEnter; FSubLabel.OnMouseLeave := LabelMouseLeave; FPictureDefault := TPicture.Create; FPictureDefault.OnChange := ChangePictureDefault; FPictureHover := TPicture.Create; FPictureLeave := TPicture.Create; Self.Width := 64; Self.Height := 89; Self.AlignWithMargins := True; Self.Margins.Top := 0; Self.Margins.Left := 8; Self.Margins.Right := 8; Self.Margins.Bottom := 0; Self.BevelInner := bvNone; Self.BevelKind := bkNone; Self.BevelOuter := bvNone; Self.BevelWidth := 1; Self.BorderStyle := bsNone; Self.BorderWidth := 0; Self.Caption := ''; Self.Ctl3D := False; Self.Cursor := crHandPoint; Self.ParentBackground := True; HoverLeaveLabel := True; HoverLeaveImage := True; ImageAlign := alClient; LabelAlign := alBottom; FVersion := _version; end; function TTRM_ImageLabel.GetSubImageAlign: TAlign; begin Result := FSubImageAlign; FSubImage.Align := FSubImageAlign; Repaint; end; procedure TTRM_ImageLabel.SetSubImageAlign(Value: TAlign); begin if FSubImageAlign <> Value then begin FSubImageAlign := Value; FSubImage.Align := FSubImageAlign; Repaint; end; end; function TTRM_ImageLabel.GetPictureDefault: TPicture; begin Result := FPictureDefault; FSubImage.Picture.Assign(FPictureDefault); Repaint; end; procedure TTRM_ImageLabel.SetPictureDefault(Value: TPicture); begin if FPictureDefault <> Value then begin FPictureDefault.Assign(Value); FSubImage.Picture.Assign(FPictureDefault); Repaint; end; end; procedure TTRM_ImageLabel.ChangePictureDefault(Sender: TObject); begin FSubImage.Picture.Assign(FPictureDefault); Repaint; end; function TTRM_ImageLabel.GetPictureHover: TPicture; begin Result := FPictureHover; end; procedure TTRM_ImageLabel.SetPictureHover(Value: TPicture); begin if FPictureHover <> Value then FPictureHover.Assign(Value); end; function TTRM_ImageLabel.GetPictureLeave: TPicture; begin Result := FPictureLeave; end; procedure TTRM_ImageLabel.SetPictureLeave(Value: TPicture); begin if FPictureLeave <> Value then FPictureLeave.Assign(Value); end; function TTRM_ImageLabel.GetLabelCaption: String; begin if FSubLabelCaption = '' then Result := SubLabel.Caption else Result := FSubLabelCaption; Repaint; end; procedure TTRM_ImageLabel.SetLabelCaption(const Value: string); begin if FSubLabelCaption <> Value then begin FSubLabelCaption := Value; Self.SubLabel.Caption := FSubLabelCaption; Repaint; end; end; function TTRM_ImageLabel.GetSubLabelAlign: TAlign; begin Result := FSubLabelAlign; FSubLabel.Align := FSubLabelAlign; Repaint; end; procedure TTRM_ImageLabel.SetSubLabelAlign(Value: TAlign); begin if FSubLabelAlign <> Value then begin FSubLabelAlign := Value; FSubLabel.Align := FSubLabelAlign; Repaint; end; end; procedure TTRM_ImageLabel.ImageClick(Sender: TObject); begin if assigned(OnClick) then inherited OnClick(Self); end; procedure TTRM_ImageLabel.ImageDblClick(Sender: TObject); begin if assigned(OnDblClick) then inherited OnDblClick(Self); end; procedure TTRM_ImageLabel.ImageMouseEnter(Sender: TObject); begin if HoverLeaveImage then begin Self.SubImage.Picture.Assign(FPictureHover); Repaint; end; if assigned(OnMouseEnter) then inherited OnMouseEnter(Self); end; procedure TTRM_ImageLabel.ImageMouseLeave(Sender: TObject); begin if HoverLeaveImage then begin Self.SubImage.Picture.Assign(FPictureLeave); Repaint; end; if assigned(OnMouseLeave) then inherited OnMouseLeave(Self); end; procedure TTRM_ImageLabel.LabelClick(Sender: TObject); begin if assigned(OnClick) then inherited OnClick(Self); end; procedure TTRM_ImageLabel.LabelDblClick(Sender: TObject); begin if assigned(OnDblClick) then inherited OnDblClick(Self); end; procedure TTRM_ImageLabel.LabelMouseEnter(Sender: TObject); begin if FHoverLeaveLabel then begin Self.SubImage.Picture.Assign(FPictureHover); Repaint; end; if assigned(OnMouseEnter) then inherited OnMouseEnter(Self); end; procedure TTRM_ImageLabel.LabelMouseLeave(Sender: TObject); begin if FHoverLeaveLabel then begin Self.SubImage.Picture.Assign(FPictureLeave); Repaint; end; if assigned(OnMouseLeave) then inherited OnMouseLeave(Self); end; destructor TTRM_ImageLabel.Destroy; begin FSubImage.Free; FSubLabel.Free; FPictureDefault.Free; FPictureHover.Free; FPictureLeave.Free; inherited Destroy; end; end. ~Mathias
Mathias
Ich vergesse einfach zu viel. |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |