Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Löschen Button nur einmal implementieren (https://www.delphipraxis.net/199973-loeschen-button-nur-einmal-implementieren.html)

delphicoder123 6. Mär 2019 23:04

Löschen Button nur einmal implementieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe mehrere Editfelder mit dazugehörigem Löschen Button.
Wenn auf Button1 geklickt wird, dann soll Edit1 gelöscht werden etc.
Das Formular sieht so aus:

https://www.delphipraxis.net/attachm...1&d=1551913338

Ich möchte aber nicht 4 Mal, den Löschen Button implementieren sondern nur einmal.
Ist das irgendwie möglich?

Vielen Dank

DieDolly 6. Mär 2019 23:09

AW: Löschen Button nur einmal implementieren
 
Auf die Schnelle würde ich sowas hier vielleicht machen. Ungetestet. Kommt alles in eine Procedure oder in "einen button click event" den alle Buttons bekommen

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 if Sender = Button1 then
  Edit1.Clear
 else if Sender = Button2 then
  Edit2.Clear;
end;
Mit Tags würde ich gar nicht erst anfangen wenn dir das in den Sinn kommt.

Uwe Raabe 7. Mär 2019 00:28

AW: Löschen Button nur einmal implementieren
 
Wenn die Namensgebung so oder zumindest prinzipiell so bleibt:
Delphi-Quellcode:
procedure TForm1.AllButtonsClick(Sender: TObject);
begin
  (FindComponent('Edit' + Copy((Sender as TButton).Name, 7, MaxInt)) as TEdit).Clear;
end;
Ist aber halt alles sehr unschön.

Alternative, wenn auch optisch anders, wäre die Buttons rauszunehmen und mehrere TButtonedEdit Controls, deren linker oder rechter Button (mit passendem Bildchen) zum Löschen verwendet wird:
Delphi-Quellcode:
procedure TForm1.AllButtonedEditsRightButtonClick(Sender: TObject);
begin
  (Sender as TButtonedEdit).Clear;
end;

EmWieMichael 7. Mär 2019 06:38

AW: Löschen Button nur einmal implementieren
 
Zitat:

Zitat von DieDolly (Beitrag 1427142)
...
Mit Tags würde ich gar nicht erst anfangen wenn dir das in den Sinn kommt.

Weil?

TigerLilly 7. Mär 2019 07:02

AW: Löschen Button nur einmal implementieren
 
* Ein Frame - je einer für ein Edit+Löschbutton
* Erzeugung von Edit+Button im Code und 4x geeignet aufrufen
* Im OnEnter des TEdits einen Button erzeugen + im OnExit wieder zerstören
* Einen Button unsichtbar anlegen, Im OnEnter des TEdits passend verschieben + sichtbar machen, im OnExit unsichtbar machen

mkinzler 7. Mär 2019 07:11

AW: Löschen Button nur einmal implementieren
 
Zitat:

Alternative, wenn auch optisch anders, wäre die Buttons rauszunehmen und mehrere TButtonedEdit Controls, deren linker oder rechter Button (mit passendem Bildchen) zum Löschen verwendet wird:
Dann würde ich aber auf Nummer sicher gehen:
Delphi-Quellcode:
procedure TForm1.AllButtonedEditsRightButtonClick(Sender: TObject);
begin
  if Sender is TButtonedEdit then
    TButtonedEdit(Sender).Clear;
end;

Uwe Raabe 7. Mär 2019 07:46

AW: Löschen Button nur einmal implementieren
 
Zitat:

Zitat von mkinzler (Beitrag 1427153)
Dann würde ich aber auf Nummer sicher gehen:

Na ja, damit wird ein etwaiger Fehler einfach ignoriert. Mit dem
Delphi-Quellcode:
as
Konstrukt kommt wenigstens eine Exception, wenn sowas unerwartet passiert. Das ist dann ein Zeichen, daß das Programm sich nicht so verhält, wie beabsichtigt - und das will ich in der Regel wissen.

haentschman 7. Mär 2019 08:06

AW: Löschen Button nur einmal implementieren
 
Zitat:

nicht so verhält, wie beabsichtigt - und das will ich in der Regel wissen
:thumb:

Dennis07 7. Mär 2019 11:21

AW: Löschen Button nur einmal implementieren
 
Beim erstellen der Komponente (mglw. im FormCreate-Event):

Delphi-Quellcode:
Edit1.Tag := Integer(Button1);
Edit2.Tag := Integer(Button2);
Edit3.Tag := Integer(Button3);
Dann die Löschbuttons im OnClick alle hiermit verknüpfen:

Delphi-Quellcode:
procedure TForm1.AllButtonedEditsRightButtonClick(Sender: TObject);
begin
  TEdit((Sender as TButton).Tag).Clear;
end;
Auch nicht die beste Lösung, aber eine. Das beste und einzig saubere wäre aber, entweder 3 Events (so würd ich es meistens machen), oder ein von TButton abgeleitetes Control, das selber eine "Edit"-Property besitzt und diese dann leert.
Auch wäre eine
Delphi-Quellcode:
TObjectDictionary<TButton, TEdit>
denkbar.

Jumpy 7. Mär 2019 11:28

AW: Löschen Button nur einmal implementieren
 
Das passt aber irgendwie nicht, müsste das nicht umgekehrt sein:

Button1.Tag := Integer(Edit1);
usw.

Schokohase 7. Mär 2019 11:41

AW: Löschen Button nur einmal implementieren
 
Wenn die Frames in Delphi nicht so seltsam wären, würde ich ein Frame vorschlagen mit einem Edit und einem Button und davon dann einfach so viele wie gewünscht auf die Form legen.

Die Verdrahtung zwischen Button und Edit erfolgt einmalig im Frame.

Dennis07 7. Mär 2019 11:53

AW: Löschen Button nur einmal implementieren
 
Zitat:

Zitat von Jumpy (Beitrag 1427195)
Das passt aber irgendwie nicht, müsste das nicht umgekehrt sein:

Button1.Tag := Integer(Edit1);
usw.

Jo, hast recht! :)

freimatz 7. Mär 2019 16:03

AW: Löschen Button nur einmal implementieren
 
Zitat:

Zitat von Schokohase (Beitrag 1427198)
Wenn die Frames in Delphi nicht so seltsam wären, ...

Was ist daran seltsam? :shock:

Schokohase 7. Mär 2019 16:13

AW: Löschen Button nur einmal implementieren
 
Zitat:

Zitat von freimatz (Beitrag 1427245)
Zitat:

Zitat von Schokohase (Beitrag 1427198)
Wenn die Frames in Delphi nicht so seltsam wären, ...

Was ist daran seltsam? :shock:

Leg mal ein Edit und ein Button in eine Frame. Der Button rechtsbündig und der Edit nimmt den Rest der Framefläche.

Jetzt lege dir davon ein paar auf ein Form und verschiebe die Frames mit der Maus.

Genau, sehr leicht hat man nicht das Frame, sondern das Edit-Control in dem Frame verschoben.

peterbelow 8. Mär 2019 10:26

AW: Löschen Button nur einmal implementieren
 
Zitat:

Zitat von Schokohase (Beitrag 1427247)
Zitat:

Zitat von freimatz (Beitrag 1427245)
Zitat:

Zitat von Schokohase (Beitrag 1427198)
Wenn die Frames in Delphi nicht so seltsam wären, ...

Was ist daran seltsam? :shock:

Leg mal ein Edit und ein Button in eine Frame. Der Button rechtsbündig und der Edit nimmt den Rest der Framefläche.

Jetzt lege dir davon ein paar auf ein Form und verschiebe die Frames mit der Maus.

Genau, sehr leicht hat man nicht das Frame, sondern das Edit-Control in dem Frame verschoben.

Das Problem hat man auch mit anderen Container-Controls, wenn man sie ganz mit controls zupflastert. Ein Bißchen Platz zwischen den Controls sieht eh besser aus, also verwende (in deinem Beispiel) AlignWithMargin = true für eine der beiden, z. B. für den Button mit Margin.left = 6 und allen anderen = 0.

Außerdem: Klick auf das Edit, dann ESC, damit hat das Frame die drag handles.

Schokohase 8. Mär 2019 11:02

AW: Löschen Button nur einmal implementieren
 
Zitat:

Zitat von peterbelow (Beitrag 1427314)
Außerdem: Klick auf das Edit, dann ESC, damit hat das Frame die drag handles.

Ich sagte auch nicht das es unmöglich ist, aber eben ein Eiertanz. Das hab ich woanders schon erheblich besser gesehen.

Sherlock 8. Mär 2019 11:30

AW: Löschen Button nur einmal implementieren
 
Man kann das doch fixieren. Oder ist TControl.Locked ein FMX-Feature? Ich mach das ständig. Und bekomme so nur das Container-Objekt zu fassen.

Sherlock

Rollo62 8. Mär 2019 12:02

AW: Löschen Button nur einmal implementieren
 
Frames kann man benutzen, aber in der KomponentenPalette wurde ich das tunlichst vermeiden.
Damit gab es bei mir mal ziemliche Probleme wenn denn die FrameKomponente einen Bug hat, dann lassen sich ganze Projekte nur noch mit viel Mühe wieder laden.

Aber Frames als separate "Form-ähnliche" Container benutze ich mittlerweile sehr oft,
und diese Lade ich zur Laufzeit in Panels, oder andere Container.

Das geht wunderbar, und ist für mich ein guter Kompromiss zw. RAD und alles im Code definieren.
So kann ich alles Visuelle perfekt "RAD" auf dem Frame machen, und den Rest in Code.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:11 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