![]() |
TEdit Text "überschreiben"
moin
Kann man nur die Read-Eigenschaft Text von einem TEdit überschreiben, wenn man sich eine Komponente von TEdit ableitet?
Delphi-Quellcode:
habs so probiert bekomme aber einen Stackoverflow.
type
TTemperatureEdit = class(TEdit) private { Private declarations } procedure SetText(Value : String); function ReadText : String; protected { Protected declarations } public { Public declarations } published { Published declarations } property Text : String Read ReadText Write SetText; end; procedure Register; implementation procedure TTemperatureEdit.SetText(Value : String); begin inherited Text := Value; end; function TTemperatureEdit.ReadText : String; begin Result := 'mein text'; end; end. |
Re: TEdit Text "überschreiben"
Zitat:
Versuch mal, die Getter-proc GetText oder so zu überschreiben ... ;) |
Re: TEdit Text "überschreiben"
Hai LoL,
durch dein
Delphi-Quellcode:
rufst Du deine Setter-Methode (SetText) ja immer wieder selber auf.
procedure TTemperatureEdit.SetText(Value : String);
begin inherited Text := Value; end; |
Re: TEdit Text "überschreiben"
Erstmal vielen dank für eure schnelle Antwort
Folgendes: @sharky: Wie muss ich das dann schreiben das die Write procedure die geerbten Sachen ausführt? ich dachte das geht mit inherited :gruebel: @jfheins: Ich hab probiert die Function GetText zu überschreiben=> not found in base class. In der Beschreibung von GetText steht auch drin das diese Protected ist. Kann man sie trotzdem irgend überschreiben? |
Re: TEdit Text "überschreiben"
Hai LoL,
was genau möchtest Du denn machen? Wenn Du immer den selben String beim lesen von .Text haben möchtest brauchst Du überhaupt keinen Setter zu schreiben. Dann reicht auch das
Delphi-Quellcode:
Aber das dir das bringen soll kann ich nicht erkennen ;-)
type
TTemperatureEdit = class(TEdit) private { Private declarations } function ReadText : String; protected { Protected declarations } public { Public declarations } published { Published declarations } property Text : String Read ReadText; end; implementation function TTemperatureEdit.ReadText : String; begin Result := 'mein text'; end; |
Re: TEdit Text "überschreiben"
Ähm Sharky...
Du versteckst dort Control.Text. D.h: diese Klasse wird sich nicht so verhalten wie es der Nutzer erwarten würde. ;) TEdit(DeinEdit).Text wird ohne die Logik aus deinem Setter sein... (Es würde Text von TControl nehmen...) Es ist IMHO nicht möglich einem TControl Nachfahren eine brauchbare eigene Implementierung von Text zu verpassen. Weder setter noch getter sind virtual protected. Also lässt sich da nicht viel auf eine zumutbare Art machen... :wall: |
Re: TEdit Text "überschreiben"
Zitat:
Aber was würde er denn erwarten? Wenn beim auslesen von .Text etwas anderes kommen soll als in dem Edit steht wird der Nutzer doch sicherlich auch sehr seltsam schauen? |
Re: TEdit Text "überschreiben"
Du erzeugst eine NEUE Property.
TEdit(DeinEdit).Text -> "normales" Text DeinEdit.Text -> das neue Text Das Problem dabei ist, dass das "polymorphisch betrachtet" inkonsistent ist. Schließlich ist es keine readonly Property, da eine Verwendung als Vorgänger dir wieder Schreibrechte gibt. ;) Man müsste also auch noch Change überschrieben um auf Änderungen zu reagieren... |
Re: TEdit Text "überschreiben"
Du kannst die Fenstermeldungen WM_GETTEXT und WM_GETTEXTLEN abfangen und dort jeweils deinen konstanten String einsetzen. Musst aber aufpassen, dass du bei WM_GETTEXT nicht den Puffer überschreibst.
|
Re: TEdit Text "überschreiben"
Ihr habt das jetzt in den falschen Hals bekommen :)
Natürlich ist der String nicht Konstant wäre sonst ja auch einfach. Eher sowas:
Delphi-Quellcode:
Ist wie gesagt nur ein Beispiel. Also ist die Ausgabe nicht konstant.
ReadText
begin if bedingung then Result := IntToStr(StrToInt(Text) *2) else Result := Text; end; Hintergedanke ist folgende: In diesem Edit sollen Temperaturen eingegeben werden. Die Temperatur die aber gelsesen werden soll, soll immer °C sein gleichzeitig aber soll im Edit die Temperatur stehen die der Benutzer auch eigegeben hat. Da ich immer die Temperatur über "Text" auslesen will, hab ich mir eben das überlegt das meine Frage war um mir die Arbeit zu erleichtern. Oder hat jemand eine bessere Lösung? |
Re: TEdit Text "überschreiben"
wie ich bereits schrieb: Du bräuchtest nur Change überschreiben. ;)
Ein abstrakter Bleistift würde so aussehen:
Delphi-Quellcode:
Der Code ist /nicht/ gedacht um direkt übernommen zu werden! Nur um dir das Prinzip zu zeigen. ;)
uses
StdCtrls; type TCelsiusEdit = class(TEdit) protected procedure Change; override; end; implementation uses StrUtils, SysUtils; { TCelsiusEdit } procedure TCelsiusEdit.Change; var TrimmedText :string; Dummy :double; IsNumeric, EndsWithCelcius :Boolean; begin TrimmedText := Trim(Text); IsNumeric := TryStrToFloat(TrimmedText,Dummy); EndsWithCelcius := (RightStr(TrimmedText, 2) = '°C'); if IsNumeric and not EndsWithCelcius then inherited Text := TrimmedText + ' °C' else inherited; end; |
Re: TEdit Text "überschreiben"
Ich will doch aber nicht den Text verändern den der Benutzer eingegeben hat. Ich will lediglich den text verändern den man von dem Edit mit "Text" liest. Ist das überhaupt möglich?
Besipiel: Im Edit steht "32" (°Fahrenheit). Nun will ich wenn ich den Text davon lese nicht "32" lesen sondern "0" ((32-32)/1.8). Im Edit soll aber weiterhin 32 drin stehen. |
Re: TEdit Text "überschreiben"
Achso...
Dann füge doch einfach eine Property á la FormattedText o.ä. hinzu. ;) Change könntest du immer noch überschreiben, um zum Beispiel eine Exception auszulösen wenn etwas nicht numerisches drinsteht... |
Re: TEdit Text "überschreiben"
Genau das ist ja das was ich vermeiden wollte. Ich will weiterhin von der Eigenschaft Text lesen! Das zwar, wie im Beispiel, eine zahl drin steht aber beim lesen der Zahl eine andere zurückgegeben wird. Deshalb wollte ich das Read-Dingens von der TExt Property überschreiben. Hat aber irgendwie nicht so ganz geklappt. s.o.^^
Also wäre halt mein Vorschlag gewesen bei der Text-Property zwar Read zu überschreiben, aber Write so zu belassen. Hat aber wie gesagt nicht ganz so mit dem inherited funktioniert wie ich wollte :gruebel: . Weis jemand dazu Rat? |
Re: TEdit Text "überschreiben"
Hi LoL
einfach folgendermassen:
Delphi-Quellcode:
Der Edit1.Text bleibt so wie er ist.
Var
GradCelsius:Integer; ... procedure TForm1.Edit1Exit(Sender: TObject); begin Try GradCelsius:=StrToInt(Edit1.Text)-32; except GradCelsius:=0; end; end; mfg BrunoT |
Re: TEdit Text "überschreiben"
SCH*** kann mich mal jemand schlagen :mrgreen: ?
ich hab ja nicht daran gedacht das Text->Inhalt in der Komponente in der nicht Richtung verbunden sind, sondern nur Inhalt->Text. :wall: Sow einfach kanns sein Vielen Vielen dank :thumb: |
Re: TEdit Text "überschreiben"
Zitat:
Weder Setter noch Setter sind virtual, virtual properties hat Delphi nicht und selbst wenn es das hätte hätten die Borländer es einfach "vergessen" so zu deklararieren. :roll: Die Eigenschaft Text ist für dich in keinster Weise veränderbar, da keiner ihrer accessor virtuell ist. ;) Es geht halt nur indem du in einer Read property auf Text zugreifst und hinten was anhängst... :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 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 by Thomas Breitkreuz