AGB  ·  Datenschutz  ·  Impressum  







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

UserInterface-Klasse

Ein Thema von cltom · begonnen am 30. Dez 2024 · letzter Beitrag vom 31. Dez 2024
Antwort Antwort
cltom

Registriert seit: 22. Sep 2005
224 Beiträge
 
Delphi 12 Athens
 
#1

UserInterface-Klasse

  Alt 30. Dez 2024, 10:16
Delphi-Version: 12 Athens
Hallo,

für einen wiederkehrenden Block von Eingabewerten würde ich gern den Transfer der UI-Elemente ins Objekt als eigene Klasse auslagern, also sinngemäß:

Delphi-Quellcode:

type
  TDataClass = Class(TObject)
        
    public
      ValueA: Integer;
      ValueB: string;

  end;

type
  TTransferClass = Class(TObject)
    
    public
      procedure GetValues(TargetContainer: TWinControl; MyObject: TDataClass);

  end;


Implementation

  procedure TTransferClass.GetValues(TargetContainer: TWinControl; MyObject: TDataClass);
  begin
    TryStrToInt(TargetContainer.edt_ValueA.Text, MyObject.ValueA);
    MyObject.ValueB := TargetContainer.edt_ValueB.Text;
  end;
Das geht natürlich so nicht, weil die Edit-Felder hier ja nicht bekannt sind, die liegen ja am TargetContainer (oder sogar auch nicht).

Eine Variante wäre es, die Controls erst hier zu erzeugen. Finde ich nicht beliebig praktisch, weil die Controls nicht immer an der gleichen Position sind und dann müsste man je nach TargetContainer unterschiedliche Koordinaten definieren. Die zur Designzeit schon zu erzeugen ist da einfacher.

Auch möglich wäre es, via "FindComponent" die Controls zu suchen. Da heißt es (wohl zu recht), dass das nicht empfehlenswert ist, weil langsam und fehleranfällig, wenn sich doch mal ein Controlname ändert.

Ist der Ansatz grundsätzlich verkehrt oder gibt es eine Variante dafür, die ich übersehe?

Danke! Ein frohes neues Jahr!

Geändert von cltom (30. Dez 2024 um 10:22 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.178 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: UserInterface-Klasse

  Alt 30. Dez 2024, 11:06
Du kennst aber Frames, oder?

Mache dir doch
  1. Eine Basisklasse, welche die abstrakte Methoden getValues(..) und setValues(..) hat, aber sonst noch keine weiteren Controls
  2. Je nach Bedarf abgeleitete Klassen, welche dann die gewünschten Controls (Edits, Buttons, ...) beinhalten und die Methoden getValues(..) und setValues(..) implementieren
  3. In deinem Code später brauchst du dann nur noch einmal alle Instanzen von deiner Basisklasse durchgehen, Daten abholen, fertig.
  Mit Zitat antworten Zitat
cltom

Registriert seit: 22. Sep 2005
224 Beiträge
 
Delphi 12 Athens
 
#3

AW: UserInterface-Klasse

  Alt 30. Dez 2024, 11:35
Hallo,

stimmt, an Frames hatte ich auch gedacht. Solange sich die Position der Controls nicht ändern soll, wäre das einfach.

  1. Eine Basisklasse, welche die abstrakte Methoden getValues(..) und setValues(..) hat, aber sonst noch keine weiteren Controls
  2. Je nach Bedarf abgeleitete Klassen, welche dann die gewünschten Controls (Edits, Buttons, ...) beinhalten und die Methoden getValues(..) und setValues(..) implementieren
  3. In deinem Code später brauchst du dann nur noch einmal alle Instanzen von deiner Basisklasse durchgehen, Daten abholen, fertig.
sorry, ich fürchte, das verstehe ich noch nicht ganz

Was enthält diese Basisklasse außer den abstrakten Methoden? Das eigentliche Abholen der Daten aus den Edits implementiere ich dann in der abgeleiteten Klasse - wenn ich das mehrmals brauche auf unterschiedlichen ParentControls muss ich das auch mehrmals implementieren?
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.178 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: UserInterface-Klasse

  Alt 30. Dez 2024, 11:58
Was enthält diese Basisklasse außer den abstrakten Methoden?
Nichts. vielleicht ein Label als Überschrift? Die Basisklasse ganz oben ist eher ein "Interface" die sagt "Du kannst hier TDataClass-Dinge reinstecken und rausholen".

Das eigentliche Abholen der Daten aus den Edits implementiere ich dann in der abgeleiteten Klasse - wenn ich das mehrmals brauche auf unterschiedlichen ParentControls muss ich das auch mehrmals implementieren?
Nein, nur einmal, im Code für deinen abgeleiteten, konkreten Frame. Auf deinem ParentControl kannst du ja dann beliebig viele davon platzieren, aber da schlägst du dich ja nicht mehr mit irgendwelchen Edit-Feldern darin herum, sondern rufst nur noch ein Mal das getValues() auf, um an die eingetragenen Werte in Form deines TDataClass zu kommen.

Ich würde vielleicht einmal mit einem simplen Beispiel loslegen. Das sollte schnell gehen und dann wird einem das bestimmt auch klarer.


PS: Bist du dir sicher, dass du TDataClass wirklich als echtes TObject machen willst? Wenn das nur eine "dumme Datenstruktur" ohne Notwendigkeit für Dinge wie Vererbung und virtuelle Methoden ist ist würde ich das auf jeden Fall als Record machen, dann plagst du dich auch nicht mit Dingen wie der späteren Freigabe (.Free() ) herum.
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
680 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: UserInterface-Klasse

  Alt 30. Dez 2024, 12:14
Du kannst auch ein Interface machen und die Methoden GetValue und SetValue darüber implementieren.
Du kannst sogar mehr Controls draufbringen, musst halt beim GetValue und SetValue den Control-Namen mit angeben und das Control suchen, aber ist ja auch kein Hexenwerk.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.121 Beiträge
 
Delphi 12 Athens
 
#6

AW: UserInterface-Klasse

  Alt 30. Dez 2024, 13:01
Oder Du tauschst Daten unter verschiedenen Objekten mit Messages aus, wie zum Beispiel mit dem TMessageManager.
  Mit Zitat antworten Zitat
cltom

Registriert seit: 22. Sep 2005
224 Beiträge
 
Delphi 12 Athens
 
#7

AW: UserInterface-Klasse

  Alt 31. Dez 2024, 10:57
Was enthält diese Basisklasse außer den abstrakten Methoden?
Nichts. vielleicht ein Label als Überschrift? Die Basisklasse ganz oben ist eher ein "Interface" die sagt "Du kannst hier TDataClass-Dinge reinstecken und rausholen".

Das eigentliche Abholen der Daten aus den Edits implementiere ich dann in der abgeleiteten Klasse - wenn ich das mehrmals brauche auf unterschiedlichen ParentControls muss ich das auch mehrmals implementieren?
Nein, nur einmal, im Code für deinen abgeleiteten, konkreten Frame. Auf deinem ParentControl kannst du ja dann beliebig viele davon platzieren, aber da schlägst du dich ja nicht mehr mit irgendwelchen Edit-Feldern darin herum, sondern rufst nur noch ein Mal das getValues() auf, um an die eingetragenen Werte in Form deines TDataClass zu kommen.

Ich würde vielleicht einmal mit einem simplen Beispiel loslegen. Das sollte schnell gehen und dann wird einem das bestimmt auch klarer.

PS: Bist du dir sicher, dass du TDataClass wirklich als echtes TObject machen willst? Wenn das nur eine "dumme Datenstruktur" ohne Notwendigkeit für Dinge wie Vererbung und virtuelle Methoden ist ist würde ich das auf jeden Fall als Record machen, dann plagst du dich auch nicht mit Dingen wie der späteren Freigabe (.Free() ) herum.
Hallo,

danke für die Rückmeldung!

ok, ich werd's mal versuchen, mal sehen, ob es klarer wird.

ad Datenobjekt: tatsächlich hab ich hier records verwendet für die allermeisten der Datenstrukturen, um die es geht.
  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 06:51 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