![]() |
Komponente erstellen und Ereignis zuweisen
Hallo,
ich hab mir das Tutorial zum Erstellen einer Komponente schon durchgelesen, das schonmal vorweg! :D Ich versuche nun verzeifelt eine Komponente zu erstellen und einem Ereignis eine Methode zuzuweisen. Wie mache ich das? |
Re: Komponente erstellen und Ereignis zuweisen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var button :TButton; begin button := TButton.Create(Form1); button.Parent := Form1; button.Caption := 'Test'; button.Top := 100; button.Left := 100; button.OnClick := self.Button2Click end; procedure TForm1.Button2Click(Sender: TObject); begin ShowMessage('test'); end; |
Re: Komponente erstellen und Ereignis zuweisen
Nein, nicht zu Laufzeit!!!
Ich will eine neue Komponente erstellen, die das macht. Wie könnte ich jetzt zum Beispiel einen neuen Button erstellen, der immer, wenn ich draufklicke irgendwas macht?? |
Re: Komponente erstellen und Ereignis zuweisen
Delphi-Quellcode:
Das unter die Zeile
btn2 := TButton.Create(Form1);
btn2.Parent := Form1; btn2.Caption := 'btn2'; btn2.OnClick := button.OnClick;
Delphi-Quellcode:
schreiben. Deklaration nicht vergessen. Und der Btn2 führt das OnClick ereignis des buttons aus den du vorher erstellt hast
button.OnClick := self.Button2Click;
|
Re: Komponente erstellen und Ereignis zuweisen
Ups..Sorry...Moment..Ich guck mal
|
Re: Komponente erstellen und Ereignis zuweisen
![]() Hoffe das hast du nicht schon gelesen. Das ist eigentlich ganz gut für den anfang |
Re: Komponente erstellen und Ereignis zuweisen
Ok, gelesen. :D Wie weise ich jetzt einem Ereignis meiner abgeleiteten Komponente bereits im Konstruktor eine Routine zu?
|
Re: Komponente erstellen und Ereignis zuweisen
Moin Stevie,
schau Dir doch noch mal Kapitel 6 des genannten Tutorials an. Der Unterschied ist nur, dass Du keine published property daraus machst. Ein internes Feld genügt, und diesem weist Du dann eben die Routine zu. Ist genau das gleiche, als würdest Du eine Kompo dynamisch erzeugen. |
Re: Komponente erstellen und Ereignis zuweisen
1.) Wenn ich es doch published mache, und ein Benutzer dann im OI eine neue Routine dafür anlegt, wird dann meine "interne" überschrieben?
2.) Wenn ich ein bereits vorhandenes Ereignis mit einer Routine belege, müsste doch im OI dann doch was stehen, oder? 3.) Wenn ich als Eigenschaft der Vorgänger-Komponente eine Liste von Komponenten habe, ich im Konstruktor meiner Komponente einige Komponenten in diese Liste einfüge, kann ich dann auch so einfach diesen einzelnen Komponenten Ereignisroutinen zuweisen? |
Re: Komponente erstellen und Ereignis zuweisen
Moin Stevie,
1. Ja, aber Du könntest ja den Wert in der Eigenschaft mit dem Deiner internen Methode vergleichen. Sind die unterschiedlich wurde im OI eine Routine zugewiesen. 2. Weiss nich'. Probier's am Besten mal aus ;-) 3. Falls ich das richtig verstanden habe: Ja, warum nicht. (ggf. wäre vielleicht eine ausführlichere Erklärung nötig, was Du genau meinst) |
Re: Komponente erstellen und Ereignis zuweisen
zu 3.): Ist immernoch das Prob wegen dem TCPServer. Ich will nämlich schon beim Erstellen einige CommandHandler einbauen, die auf bestimmte Befehle reagieren (das klappt) und Routinen ausführen (das klappt nicht). Es passiert nicht das, was passieren sollte, sprich: Die Routine, die ich im Konstruktor einem CommandHandler zugewiesen hab, wird nicht ausgeführt! :cry:
|
Re: Komponente erstellen und Ereignis zuweisen
Moin Stevie,
sorry, aber da ich mit den Indys bislang noch nicht viel gemacht habe, kann ich Dir da im Moment nicht mehr so recht folgen. |
Re: Komponente erstellen und Ereignis zuweisen
ALso ich hoffe das das hier rein passt!!!
Ich möchte eine Komponente erstellendie von TImage abgeleitet ist!!! ICh möchte aber noch drei zusätzliche bilder angeben, die je nach ereignis in das image geladen werden. Bei TImage gibt es ja "Picture" und davon will ich sozusagen noch drei weitere ... wie stelle ich das am besten an??? |
Re: Komponente erstellen und Ereignis zuweisen
Entweder so:
Delphi-Quellcode:
und dann weist du der Eigenschaft Picture eins von den 3 Pictures zu.
unit MyImage;
interface uses Windows, Messages, SysUtils, Classes, Controls, ExtCtrls, Graphics; type TMyImage = class(TImage) private FPicture1: TPicture; FPicture2: TPicture; FPicture3: TPicture; procedure SetPicture1(const Value: TPicture); procedure SetPicture2(const Value: TPicture); procedure SetPicture3(const Value: TPicture); protected public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Picture1: TPicture read FPicture2 write SetPicture2; property Picture2: TPicture read FPicture3 write SetPicture3; property Picture3: TPicture read FPicture4 write SetPicture4; end; procedure Register; implementation { TMyImage } constructor TMyImage.Create(AOwner: TComponent); begin inherited Create(AOwner); FPicture1 := TPicture.Create; FPicture2 := TPicture.Create; FPicture3 := TPicture.Create; end; destructor TMyImage.Destroy; begin FPicture1.Free; FPicture2.Free; FPicture3.Free; inherited Destroy; end; procedure TMyImage.SetPicture1(const Value: TPicture); begin FPicture1.Assign(Value); end; procedure TMyImage.SetPicture2(const Value: TPicture); begin FPicture2.Assign(Value); end; procedure TMyImage.SetPicture3(const Value: TPicture); begin FPicture3.Assign(Value); end; procedure Register; begin RegisterComponents('Beispiele', [TMyImage]); end; end. Oder:
Delphi-Quellcode:
Die meiner Meinung nach beste Lösung ist aber:
unit MyImage;
interface uses Windows, Messages, SysUtils, Classes, Controls, ExtCtrls, Graphics; type TMyPicture = class(TCollectionItem) private FPicture: TPicture; procedure SetPicture(const Value: TPicture); protected public constructor Create(ACollection: TCollection); override; destructor Destroy; override; published property Picture: TPicture read FPicture write SetPicture; end; TMyPictures = class(TOwnedCollection) private function GetItems(AIndex: Integer): TMyPicture; procedure SetItems(AIndex: Integer; const Value: TMyPicture); function GetOwnedBy: TPersistent; protected public function Add: TMyPicture; constructor Create(AOwner: TPersistent); reintroduce; property Items[AIndex: Integer]: TMyPicture read GetItems write SetItems; property OwnedBy: TPersistent read GetOwnedBy; published end; TMyImage = class(TImage) private FIndex: Integer; FPictures: TMyPictures; procedure SetIndex(const Value: Integer); procedure SetPictures(const Value: TMyPictures); protected public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Pictures: TMyPictures read FPictures write SetPictures; property Index: Integer read FIndex write SetIndex; end; procedure Register; implementation procedure Register; begin RegisterComponents('Beispiele', [TMyImage]); end; { TMyPicture } constructor TMyPicture.Create(ACollection: TCollection); begin inherited Create(ACollection); FPicture := TPicture.Create; end; destructor TMyPicture.Destroy; begin inherited Destroy; end; procedure TMyPicture.SetPicture(const Value: TPicture); begin FPicture.Assign(Value); end; { TMyPictures } function TMyPictures.Add: TMyPicture; begin Result := TMyPicture(inherited Add); end; constructor TMyPictures.Create(AOwner: TPersistent); begin inherited Create(AOwner, TMyPicture); end; function TMyPictures.GetItems(AIndex: Integer): TMyPicture; begin Result := TMyPicture(inherited Items[AIndex]); end; function TMyPictures.GetOwnedBy: TPersistent; begin Result := GetOwner; end; procedure TMyPictures.SetItems(AIndex: Integer; const Value: TMyPicture); begin inherited SetItem(AIndex, Value); end; { TMyImage } constructor TMyImage.Create(AOwner: TComponent); begin inherited Create(AOwner); FIndex := -1; FPictures := TMyPictures.Create(Self); end; destructor TMyImage.Destroy; begin FPictures.Free; inherited Destroy; end; procedure TMyImage.SetIndex(const Value: Integer); begin if (Value > -1) then begin if (Value < (FPictures.Count)) then FIndex := Value else FIndex := Pred(FPictures.Count); Picture.Assign(FPictures.Items[FIndex].FPicture); end else begin FIndex := -1; Picture.Assign(nil); end; end; procedure TMyImage.SetPictures(const Value: TMyPictures); begin FPictures.Assign(Value); end; end.
Delphi-Quellcode:
Aber solche Komponenten gibt es ja schon...
unit MyImage;
interface uses Windows, Messages, SysUtils, Classes, Controls, ExtCtrls, Graphics; type TMyImage = class(TImage) private FIndex: Integer; FImageList: TImageList; procedure SetIndex(const Value: Integer); procedure SetImageList(const Value: TImageList); protected public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property ImageList: TImageList read FImageList write SetImageList; property Index: Integer read FIndex write SetIndex; end; procedure Register; implementation procedure Register; begin RegisterComponents('Beispiele', [TMyImage]); end; { TMyImage } constructor TMyImage.Create(AOwner: TComponent); begin inherited Create(AOwner); FIndex := -1; FImageList := nil; end; destructor TMyImage.Destroy; begin FreeAndNil(FImageList); inherited Destroy; end; procedure TMyImage.SetImageList(const Value: TImageList); begin FImageList := Value; end; procedure TMyImage.SetIndex(const Value: Integer); var ABitmap: TBitmap; APicture: TPicture; begin ABitmap := TBitmap.Create; APicture := TPicture.Create; if (Value > -1) and Assigned(FImageList) then begin if (Value < (FImageList.Count)) then FIndex := Value else FIndex := Pred(FImageList.Count); FImageList.GetBitmap(FIndex, ABitmap); APicture.Bitmap.Assign(ABitmap); Picture.Assign(APicture); end else begin FIndex := -1; Picture.Assign(nil); end; ABitmap.Free; APicture.Free; end; end. |
Re: Komponente erstellen und Ereignis zuweisen
Hallo,
Schönen dank auch!!!! Jetzt habe ich noch eine Letzte Frage: Ich möchte gerne eine liste machen können, Ahnlich der Listen wie sie bei Fileboxen benutzt werden um die Filter zu definieren!!! Ich benötige das selbe (als property versteht sich) nur mit mehr spalten (ich glaube 7 müsten das sein)!!! Kann mir da jdm weiterhelfen??? |
Re: Komponente erstellen und Ereignis zuweisen
Moin pmc,
neue Frage - neuer Thread. Das mit den Images ist wohl durchgerutscht ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz