AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente soll eigene Eigenschaften ändern

Ein Thema von gfjs · begonnen am 18. Mai 2006 · letzter Beitrag vom 18. Mai 2006
Antwort Antwort
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#1

Komponente soll eigene Eigenschaften ändern

  Alt 18. Mai 2006, 06:40
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:
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
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#2

Re: Komponente soll eigene Eigenschaften ändern

  Alt 18. Mai 2006, 06:53
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.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Komponente soll eigene Eigenschaften ändern

  Alt 18. Mai 2006, 07:14
@ 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
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Komponente soll eigene Eigenschaften ändern

  Alt 18. Mai 2006, 07:32
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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Komponente soll eigene Eigenschaften ändern

  Alt 18. Mai 2006, 07:48
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.

Gruß Hawkeye
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Komponente soll eigene Eigenschaften ändern

  Alt 18. Mai 2006, 09:23
Vielen Dank für Eure Unterstützung - werd' ich heute Abend gleich ausprobieren.

Gruß Jürgen
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Komponente soll eigene Eigenschaften ändern

  Alt 18. Mai 2006, 17:29
@ 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
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: Komponente soll eigene Eigenschaften ändern

  Alt 18. Mai 2006, 17:36
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]
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Komponente soll eigene Eigenschaften ändern

  Alt 18. Mai 2006, 18:29
@ 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
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:47 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