![]() |
Komponente soll eigene Eigenschaften ändern
Guten Morgen, Allerseits.
Ich möchte gerne folgendes Problem lösen: Aus Platzgründen habe ich auf einem Formular nur eine kleine TextBox. Um die Eingabe komfortabel zu gestalten, soll sich die TextBox für die Eingabe selbst vergrößern. Das habe ich im Ereignis >Enter< so gelöst:
Delphi-Quellcode:
In >Leave< wird die Größe wieder zurückgesetzt.
TextBox1.Width := 300;
Wenn ich dafür eine eigene Komponente erstelle, kann ja bei der Verwendung der Komponente ein beliebiger Name ausgewählt werden. Also hilft mir TextBox1.Width nicht weiter. Wie kann die Komponente ihren eigenen Namen feststellen und in die Anweisung xxx.Width := ??? übernehmen. Vielen Dank im Voraus und noch einen schönen Tag. Jürgen |
Re: Komponente soll eigene Eigenschaften ändern
Wenn du eine eigene Komponente erstellst, kannst du doch in einer Methode der Komponente direkt mit Width darauf zugreifen. Der Name wird doch nur beim Zugriff ausserhalb benötigt. Denn jedes Objekt hat natürlich eine Referenz auf sich selbst, die auch mit Self im Objekt angesprochen werden kann.
Delphi-Quellcode:
Wäre ja schlimm wenn der Name bekannt sein müsste. Dann hätte man dieses Problem ja bei jedem Objekt.
type
TMyEdit = class(TCustomEdit) public procedure WeiteAnpassen; end; . . procedure TMyEdit.WeiteAnpassen; begin Width:=200; /// Funktioniert Self.Width; /// Funktioniert auch. end; |
Re: Komponente soll eigene Eigenschaften ändern
@ jim_raynor
Guten Morgen, Christian. Vielen Dank für Deine schnelle Nachricht. Da ist mir jetzt aber etwas nicht ganz klar. Ich habe das gestern einmal auf einem alten Rechner mit Delphi5 probiert. Ich hatte ein TEdit auf ein Formular gelegt. Nachdem ich der Meinung war, self würde sich auf das Formular beziehen hatte ich eingegeben:
Delphi-Quellcode:
Darauf hat sich die Position des TEdits verändert, seine Breite blieb aber gleich. Daraus schloß ich, dass sich width ohne Qualifizierer - ebenos wie self.width - auf das Formular bezieht. Es hat aber funktioniert, als ich dann
width := self.width - 20;
Left := 10;
Delphi-Quellcode:
eingegeben habe. Das Edit war vergrößert und auch die Position stimmte.
Edit1.Width := self.Width - 20;
Edit1.Left := 10; Leider kann ich jetzt im Moment nichts ausprobieren, da ich im Büro kein Delphi auf dem Rechner habe. Aber ich werd's heute Abend noch einmal probieren. Jürgen |
Re: Komponente soll eigene Eigenschaften ändern
Hallo!
Der Unterschied liegt darin, ob es eine Komponete ist oder nicht... Das sel bezieht sich auf das Object... Beispiel:
Delphi-Quellcode:
Ist das gleiche und bezieht sich auf TForm.
procedure TForm.wubdi;
begin width := 10; self.With := 10; end; Aber:
Delphi-Quellcode:
Bezieht sich auf TMyEdit... -> TMyEdit = class(TEdit);
procedure TMyEdit.OnEnter;
begin width := 100; self.With := 100; end; Frank :coder: |
Re: Komponente soll eigene Eigenschaften ändern
Hallo Jürgen,
wenn ich deinen Beitrag richtig verstanden habe, änderst du in der Behandlungsmethode für das Ereignis OnEnter die Breite des Edit-Felds. In diesem Fall wird dir das auslösende Edit-Control im Parameter Sender übergeben. Mit dem folgenden Code kannst du das gewünschte Verhalten programmieren:
Delphi-Quellcode:
Das Zurücksetzen der Breite würde ich in der Behandlungsroutine für das Ereignis OnExit durchführen.
procedure TForm1.Edit1Enter(Sender: TObject);
begin (Sender AS TEdit).Width := 300; end; //Edit: Ich sehe gerade, daß es ein .NET-Thema ist. Ich hoffe es geht dort genau so wie in Win32. :roll: Gruß Hawkeye |
Re: Komponente soll eigene Eigenschaften ändern
Vielen Dank für Eure Unterstützung - werd' ich heute Abend gleich ausprobieren.
Gruß Jürgen |
Re: Komponente soll eigene Eigenschaften ändern
@ Mavarik
Meine Auffassung, dass >self< sich auf das Formular bezieht ist wohl doch richtig:
Delphi-Quellcode:
Hier wird die Breite des Formulars und dessen BackColor verändert.
procedure TWinForm.TextBox3_Enter(sender: System.Object; e: System.EventArgs);
begin Self.Width := 500; Self.BackColor := System.Drawing.Color.Red; end; @ Hawkeye219 Dein Beispiel klappt wunderbar:
Delphi-Quellcode:
Das klappt auch, wenn mehrere TextBoxen die gleiche Prozedur verwenden.
procedure TWinForm.TextBox1_Enter(sender: System.Object; e: System.EventArgs);
begin (Sender as TextBox).Width := (Sender as TextBox).Width*2; (Sender as TextBox).Text := (Sender as TextBox).Tag.ToString; end; Ein Problem ist aber doch noch aufgetaucht:
Delphi-Quellcode:
Wie kann ich denn auf die Eigenschaften einer Komponente von ausserhalb zugreifen?
procedure ChangeColor;
begin TextBox3.BackColor := System.Drawing.Color.Yellow; // Fehler: nicht deklarierter Bezeichner TextBox3 ... Self.TextB.... // Fehler: nicht deklarierter Bezeichner end; Gruß Jürgen |
Re: Komponente soll eigene Eigenschaften ändern
Zitat:
Self bezieht sich IMMER auf das was hinter dem procedure steht... Also
Delphi-Quellcode:
Dann bezieht sich self auf TBloedsinn!
procedure TBloedsinn.Cool;
begin Self.width := 100; end; Frank [edit=SirThornberry]Delphi-Tags ergänzt. Mfg, SirThornberry[/edit] |
Re: Komponente soll eigene Eigenschaften ändern
@ Mavarik
Hallo Frank, tut mir leid, dass ich mich so blöd anstelle - aber schön, dass Du dir soviel Mühe mit mir gibst. Zitat:
Delphi-Quellcode:
das "TWinForm." weglasse, bekomme ich eine Fehlermeldung: "ungenügende Forward-Deklaration TWinForm.TextBox3_Enter" und wenn ich in die Prozedur die Anweisung "Self.Width := 200;" einfüge bekomme ich zusätzlich die Fehlermeldung "nicht definierter Bezeichner 'self' ...".
procedure TWinForm.TextBox3_Enter(sender: System.Object; e: System.EventArgs);
begin end; Entweder kapiere ich das tatsächlich nicht oder ist da vielleicht ein Unterschied zwischen einer WinForm- und einer VCL-Anwendung? Ich hoffe, ich nerve Euch nicht allzu sehr. Gruß Jürgen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 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