Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Ansteuerung von einem statt zwei Editfelder (https://www.delphipraxis.net/201675-ansteuerung-von-einem-statt-zwei-editfelder.html)

Fallenzer 14. Aug 2019 13:45

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:
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;
Hierbei werden aber BEIDE Editfelder angesteuert, nicht nur das ausgewählte...

Ich bitte um schnellstmögliche Hilfe.
Vielen Dank

philipp.hofmann 14. Aug 2019 13:56

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.

MyRealName 14. Aug 2019 13:57

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.

mkinzler 14. Aug 2019 14:00

AW: Ansteuerung von einem statt zwei Editfelder
 
Showing gibt an, ob das Control sichtbar ist.

Delphi-Quellcode:
if Edit1.Focused then

DieDolly 14. Aug 2019 14:43

AW: Ansteuerung von einem statt zwei Editfelder
 
Hat zwar nix mit der Frage zu tun aber ist es wirklich so schwer
Delphi-Quellcode:
 Strin := Strin + '1';
zu schreiben statt concat zu verwenden?
Außerdem solltest du dich mal über den Delphi-Style-Guide informieren.

HolgerX 14. Aug 2019 15:44

AW: Ansteuerung von einem statt zwei Editfelder
 
Hmm..

Zitat:

Zitat von MyRealName (Beitrag 1441337)
Es gibt eine property Focused. die jedes Control hat. Ist diese True, ist es das aktive Control.

Das dürfte auch nichts bringen, da im Button.click bereits der Focus auf den Button selber gewandert ist und keines der Edits mehr den focus hat... ;)

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.

Moombas 15. Aug 2019 07:13

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:
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;
@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:
- 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:
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;
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:

Wichtig: Die Eingabe muss dann mit der "Enter"-Taste bestätigt werden damit dies so funktioniert!

Delphi-Quellcode:
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;
(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!)

...viele Wege führen nach Rom. Sie sind nur anders (besser/schlechter). :)

exilant 15. Aug 2019 08:34

AW: Ansteuerung von einem statt zwei Editfelder
 
Zitat:

Zitat von DieDolly (Beitrag 1441342)
Hat zwar nix mit der Frage zu tun aber ist es wirklich so schwer
Delphi-Quellcode:
 Strin := Strin + '1';
zu schreiben statt concat zu verwenden?
Außerdem solltest du dich mal über den Delphi-Style-Guide informieren.

Ist genau die Art von hilfreicher Antwort die ein Einsteiger gerne liest.

p80286 15. Aug 2019 09:28

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:
case ziffer of
 0: edit0.Text:='0';
 1: edit1.Text:='1';
...
end;
Gruß
K-H

Moombas 15. Aug 2019 09:42

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.

jaenicke 15. Aug 2019 09:54

AW: Ansteuerung von einem statt zwei Editfelder
 
Zitat:

Zitat von Moombas (Beitrag 1441418)
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:
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;

Das ist nicht schön, nein, aber so wäre es doch in Ordnung:
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 23:30 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