![]() |
Ansteuerung von einem statt zwei Editfelder
Hallo und guten Tag,
Ich habe nun folgendes Problem: Ich versuche, durch einen Nummernblock, der aus den Ziffern 0-9 besteht, zwei Editfelder EINZELN anzusteuern... Dafür habe ich folgenden Code verwendet
Delphi-Quellcode:
Hierbei werden aber BEIDE Editfelder angesteuert, nicht nur das ausgewählte...
procedure TForm1.Button2Click(Sender: TObject);
begin if Edit1.Showing then begin Strin:= Edit1.text; Strin:=concat(Strin,'1'); Edit1.Text:= Strin; end; if Edit2.Showing then begin Strin2:= Edit2.text; Strin2:=concat(Strin2,'1'); Edit2.Text:= Strin2; end; end; Ich bitte um schnellstmögliche Hilfe. Vielen Dank |
AW: Ansteuerung von einem statt zwei Editfelder
Dann wird showing bei beiden true sein. Du musst dir also überlegen, was wirklich unterschiedlich und damit abfragbar ist.
|
AW: Ansteuerung von einem statt zwei Editfelder
Es gibt eine property Focused. die jedes Control hat. Ist diese True, ist es das aktive Control.
Und der Sender bringt dir nichts, wenn es der Button ist, btw. |
AW: Ansteuerung von einem statt zwei Editfelder
Showing gibt an, ob das Control sichtbar ist.
Delphi-Quellcode:
if Edit1.Focused then
|
AW: Ansteuerung von einem statt zwei Editfelder
Hat zwar nix mit der Frage zu tun aber ist es wirklich so schwer
Delphi-Quellcode:
zu schreiben statt concat zu verwenden?
Strin := Strin + '1';
Außerdem solltest du dich mal über den Delphi-Style-Guide informieren. |
AW: Ansteuerung von einem statt zwei Editfelder
Hmm..
Zitat:
Also, wenn ich sein Showing richtig deute, dann hat er einmal das eine und einmal das andere Edit sichtbar. Dann sollte er mit edit.visible arbeiten statt mit Showing.. Oder er muss von TButton weg auf z.B. TSpeedButton, welche keinen Focus beim CLick erhalten, dann kann er mit Focused arbeiten, da dann die Edits den Focus behalten. |
AW: Ansteuerung von einem statt zwei Editfelder
Mal nebenbei, der Code (vom TE) ist viel zu lang. Folgendes sollte das gleiche bewirken (wie der vom TE) ohne einen Helpstring:
Delphi-Quellcode:
@TE: was philipp.hofmann geschrieben hat ist denke ich ein guter Ansatz. Mach dir Gedanken was eine wirklich einmalige Bedingung ist. Mal ein paar Beispiele:
procedure TForm1.Button2Click(Sender: TObject);
begin if Edit1.Showing then begin Edit1.Text := Edit1.text + '1'; end else if Edit2.Showing then begin Edit2.text := Edit2.text + '1'; end; end; - Kann im Edit.text als letztes Zeichen eine "1" stehen, bevor du sie hinzufügst? Wenn nicht, könntest du das abfragen. - Werden die Edit wirklich ausgeblendet, das .showing oder .visible hier sinnvolle Abfragen wären? - Ist der eingegebene Text ggf. vor dem Hinzufügen der "1" immer gleich lang? Könnte man dies im OnChange abfragen und auf den Button verzichten. usw. BTT: Es gibt noch mehr Möglichkeiten: Man setzt beim Ändern des jeweiligen Edit eine globale Variable, welche anzeigt welches Edit als letztes bearbeitet wurde (im OnChange) und somit die Steuerung übernimmt. Ist zwar keine schöne Methode aber würde funktionieren.
Delphi-Quellcode:
Oder noch einfacher du setzt den Button auf Default (idealerweise im OnEnter der Editfelder, falls du andere Buttons zwischendurch als Default brauchst, daher beim OnExit diesen wieder zurücksetzen), dann bleibt der Focus auch auf dem Edit:
var
sLastEdit : string; procedure EditChange(Sender: TObject); begin sLastEdit := TEdit(Sender).Name; end; procedure TTools.KopierenClick(Sender: TObject); begin if sLastEdit = 'Edit1' then begin end else if sLastEdit = 'Edit2' then begin end; end; Wichtig: Die Eingabe muss dann mit der "Enter"-Taste bestätigt werden damit dies so funktioniert!
Delphi-Quellcode:
(Wenn das die einzige Stelle ist an der ein Button auf "Enter" bei einem Edit reagieren soll bzw. es keine anderen Stellen gibt wo der Default gebraucht wird, kannst du das auch im Objektinspector direkt einstellen. Hier muss man sich aber wirklich sicher sein, da es sonst zu Nebeneffekten kommen kann!)
procedure TForm1.EditEnter(Sender: TObject);
begin //Falls der Default ein anderer Button hat hier austragen Button2.Default := True; end; procedure TForm1.EditExit(Sender: TObject); begin Button2.Default := False; //Falls der Default ein anderer Button haben soll hier eintragen end; procedure TForm1.Button2Click(Sender: TObject); begin if Edit1.Focused then begin Edit1.Text := Edit1.text + '1'; end else if Edit2.Focused then begin Edit2.text := Edit2.text + '1'; end; end; //Als Alternative (hier wäre es jedoch egal welches Edit aktiv ist): procedure TForm1.Button2Click(Sender: TObject); var cEdit : TEdit; begin cEdit := TEdit(Tools.FindComponent(activeControl.Name)); Edit.text := Edit.Text + '1'; end; ...viele Wege führen nach Rom. Sie sind nur anders (besser/schlechter). :) |
AW: Ansteuerung von einem statt zwei Editfelder
Zitat:
|
AW: Ansteuerung von einem statt zwei Editfelder
Ich frag mich was der TE eigentlich will, da der "Ziffernblock" nirgendwo auftaucht.
Ich vermute da so etwas wie
Delphi-Quellcode:
Gruß
case ziffer of
0: edit0.Text:='0'; 1: edit1.Text:='1'; ... end; K-H |
AW: Ansteuerung von einem statt zwei Editfelder
Das denke ich weniger, da er in beiden Fällen die '1' anhängt, müsste ja sonst beim zweiten Edit die '2' sein. Auch das er mit zwei Edit arbeitet denke ich spricht gegen diesen Fall.
Aber ich vermute das der Weg über den Button ggf. nicht der Richtige ist, sondern hier OnChange mit entsprechender/n Bedingung/en der bessere Weg wäre. |
AW: Ansteuerung von einem statt zwei Editfelder
Zitat:
Delphi-Quellcode:
TTools = class(TForm)
... private FLastEdit: TEdit; end; procedure TTools.EditChange(Sender: TObject); begin FLastEdit := Sender as TEdit; end; procedure TTools.KopierenClick(Sender: TObject); begin if Assigned(FLastEdit) then FLastEdit.text := FLastEdit.text + '1'; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 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