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/)
-   -   Prism Komponente soll eigene Eigenschaften ändern (https://www.delphipraxis.net/69652-komponente-soll-eigene-eigenschaften-aendern.html)

gfjs 18. Mai 2006 06:40


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:
TextBox1.Width := 300;
In >Leave< wird die Größe wieder zurückgesetzt.

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

jim_raynor 18. Mai 2006 06:53

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:
type
  TMyEdit = class(TCustomEdit)
  public
    procedure WeiteAnpassen;
  end;

.
.


procedure TMyEdit.WeiteAnpassen;
begin
  Width:=200; /// Funktioniert

  Self.Width; /// Funktioniert auch.
end;
Wäre ja schlimm wenn der Name bekannt sein müsste. Dann hätte man dieses Problem ja bei jedem Objekt.

gfjs 18. Mai 2006 07:14

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:
width := self.width - 20;
Left := 10;
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
Delphi-Quellcode:
Edit1.Width := self.Width - 20;
Edit1.Left := 10;
eingegeben habe. Das Edit war vergrößert und auch die Position stimmte.

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

Mavarik 18. Mai 2006 07:32

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:
procedure TForm.wubdi;
begin
  width := 10;
  self.With := 10;
end;
Ist das gleiche und bezieht sich auf TForm.

Aber:
Delphi-Quellcode:
procedure TMyEdit.OnEnter;
begin
  width := 100;
  self.With := 100;
end;
Bezieht sich auf TMyEdit... -> TMyEdit = class(TEdit);


Frank :coder:

Hawkeye219 18. Mai 2006 07:48

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:
procedure TForm1.Edit1Enter(Sender: TObject);
begin
  (Sender AS TEdit).Width := 300;
end;
Das Zurücksetzen der Breite würde ich in der Behandlungsroutine für das Ereignis OnExit durchführen.

//Edit: Ich sehe gerade, daß es ein .NET-Thema ist. Ich hoffe es geht dort genau so wie in Win32. :roll:

Gruß Hawkeye

gfjs 18. Mai 2006 09:23

Re: Komponente soll eigene Eigenschaften ändern
 
Vielen Dank für Eure Unterstützung - werd' ich heute Abend gleich ausprobieren.

Gruß Jürgen

gfjs 18. Mai 2006 17:29

Re: Komponente soll eigene Eigenschaften ändern
 
@ Mavarik

Meine Auffassung, dass >self< sich auf das Formular bezieht ist wohl doch richtig:
Delphi-Quellcode:
procedure TWinForm.TextBox3_Enter(sender: System.Object; e: System.EventArgs);
begin
  Self.Width := 500;
  Self.BackColor := System.Drawing.Color.Red;
end;
Hier wird die Breite des Formulars und dessen BackColor verändert.

@ Hawkeye219

Dein Beispiel klappt wunderbar:

Delphi-Quellcode:
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;
Das klappt auch, wenn mehrere TextBoxen die gleiche Prozedur verwenden.

Ein Problem ist aber doch noch aufgetaucht:

Delphi-Quellcode:
procedure ChangeColor;
begin
  TextBox3.BackColor := System.Drawing.Color.Yellow; // Fehler: nicht deklarierter Bezeichner TextBox3 ...
  Self.TextB.... // Fehler: nicht deklarierter Bezeichner
end;
Wie kann ich denn auf die Eigenschaften einer Komponente von ausserhalb zugreifen?

Gruß Jürgen

Mavarik 18. Mai 2006 17:36

Re: Komponente soll eigene Eigenschaften ändern
 
Zitat:

Zitat von gfjs
@ Mavarik

Meine Auffassung, dass >self< sich auf das Formular bezieht ist wohl doch richtig:
Delphi-Quellcode:
procedure TWinForm.TextBox3_Enter(sender: System.Object; e: System.EventArgs);
begin
  Self.Width := 500;
  Self.BackColor := System.Drawing.Color.Red;
end;
Hier wird die Breite des Formulars und dessen BackColor verändert.

Also nochmal...

Self bezieht sich IMMER auf das was hinter dem procedure steht...

Also
Delphi-Quellcode:
procedure TBloedsinn.Cool;
begin
  Self.width := 100;
end;
Dann bezieht sich self auf TBloedsinn!

Frank

[edit=SirThornberry]Delphi-Tags ergänzt. Mfg, SirThornberry[/edit]

gfjs 18. Mai 2006 18:29

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:

Also nochmal...

Self bezieht sich IMMER auf das was hinter dem procedure steht...
Ich glaube ich habe jetzt verstanden was Du meinst. Allerdings weiß ich noch nicht, wie mir das weiterhelfen könnte. Wenn ich bei
Delphi-Quellcode:
procedure TWinForm.TextBox3_Enter(sender: System.Object; e: System.EventArgs);
begin
end;
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' ...".

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 03:03 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