Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi von TImage abgeleitete Klasse wird nicht angezeigt (https://www.delphipraxis.net/116405-von-timage-abgeleitete-klasse-wird-nicht-angezeigt.html)

ösichemiker 28. Jun 2008 17:50


von TImage abgeleitete Klasse wird nicht angezeigt
 
Hi

Ich Hab ne Komponente von TImage abgeleitet, ihr ein paar neue Eigenschaften hinzugefügt, n paar neue prozeduren und funktionen beigebracht und den constructor create

Delphi-Quellcode:
constructor myObject.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);
end;
Prozeduren: Move, Draw
Funktionen: isMoveable (frage die Eigenschaft Moveable: Boolean ab)

Hab das ganze dann compiliert und installiert und ausprobiert --> zur Laufzeit wurde die Komp. nicht angzeigt. Hab dann bei Move-Aufrufen die aktuelle Position der Komponente abgefragt. Die Position hat sich immer korrekt geändert aber die Komp wurde nicht angezeigt (Visible := true!).

Kann mir da jemand weiterhelfen

mfg
ösichemiker

_frank_ 28. Jun 2008 18:06

Re: von TImage abgeleitete Klasse wird nicht angezeigt
 
.oO(wo wir wieder bei TImage und Zeichnen wären...*rofl*)

wo wird die Komponente nicht engezeigt? auf dem form oder in der toolpalette?
//edit
...gut, wenn du von Laufzeit redest, erzeugst du die Komponente sicher zur Laufzeit...hierzu sollte beachtet werden dass das Parent gesetzt wird...

Gruß Frank

sx2008 29. Jun 2008 07:21

Re: von TImage abgeleitete Klasse wird nicht angezeigt
 
Ich würde die Klasse TImage nicht ableiten, sondern benützen.
Es gibt im Prinzip 3 Möglichkeiten:
* Vererbung: du leitest deine Klasse von TImage ab
* Aggregation: deine Klasse enthält ein Objekt von Typ TImage
* Benützen (acquaintance): deine Klasse benützt ein existierendes Objekt vom Typ TImage

In der VCL finden sich alle 3 Varianten.
Beispiele:
Vererbung wird sehr häufig eingesetzt.
Aggreagation: jedes TEdit enthält/besitzt ein TFont-Objekt. Ein TImage enthält ein Objekt der Klasse TPicture. usw.
Benützen: TDataSource verweist auf ein TDataset-Objekt. Ein TControl benützt ein TPopupMenu.

Es kommt natürlich immer auf das Ziel an.
Also erklär' mal, was deine Klasse leisten soll.

ösichemiker 29. Jun 2008 08:07

Re: von TImage abgeleitete Klasse wird nicht angezeigt
 
Also ich hab das so gemacht:

Delphi-Quellcode:
type
  TMovPic = class(TImage)
   private
    FMoveable: Boolean;
   protected
   public
    constructor Create(AOwner: TCOmponent); override;
    procedure Move(direction: Byte); // 1= rechts, 2= links, 3= oben, 4= unten
  published
    property Moveable: Boolean read FMoveable write FMoveable default false;
 end;

constructor TMovPic.Create;
begin
  inherited Create(AOwner);
end;

procedure TMovPic.Move;
begin
  if Moveable = false then Exit;
  case direction of
   // wird in die jewielige richtung verschoben
end;
hab das ganze dann installiert (wird in der Komp-Palette angezeigt). aus der komp-Palette auf eine neue form gezogen (Bild zugewiesen) und buttons die verschiedenen richtungen zugewiesen. zur Entwurfszeit wurde die Komponente mit Bild angezeigt. Es wurden auch keine Fehler gemeldet nur als ich es ausprobiert war die Komponente verschwunden.
Hab dann noch jedesmal bei Move die aktuelle Position in die Form-Caption geschrieben. Die hat sich immer richtig geändert.
Ich weiß nicht mehr weiter..

@frank: ich erzeuge die Komponente zur entwurfszeit! und dort wird sie ja auch angezeigt...

mfg
Ösichemiker

marabu 29. Jun 2008 09:06

Re: von TImage abgeleitete Klasse wird nicht angezeigt
 
Moin,

zur Entwurfszeit wählst du den Container für dein Control bewusst (oder unbewusst) aus, wodurch die Eigenschaft Parent entsprechend gesetzt wird. Bei zur Laufzeit erstellten Controls musst du nach dem Aufruf des Konstruktors auch noch den Container bestimmen, der dann dein Control auffordern wird sich zu zeichnen. Also mache, was Frank dir geraten hat:

Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
begin
  with TMovPic.Create(self) do
  begin
    Width := 120;
    Height := 90;
    Top := 8;
    Left := 8;
    Name := NewComponentName('MovPic', self); // Name := 'MovPic1';
    Parent := SomePanel; // contemplation advised
  end;
end;
Grüße vom marabu

Die Muhkuh 29. Jun 2008 09:10

Re: von TImage abgeleitete Klasse wird nicht angezeigt
 
Hi,

für die Richtung könnte man doch noch eine Enumeration verwenden.

ösichemiker 29. Jun 2008 10:08

Re: von TImage abgeleitete Klasse wird nicht angezeigt
 
Hab ich eh:
TDirection = (dRechts, dLinks, dOben, dUnten);
habs nur nicht hingeschrieben, weil dort ja nicht das Problem liegt...

danke für die antworten. Werds mal versuchen..

mfg
ösichemiker


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