Autor Beitrag
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 21.04.11 05:54 
user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
Aber selbst als Array oder in einer anderen Liste, müsste diese syncronisiert werden, sollte eines der Instanzen gekillt werden.
Umgekehrt, die GUI-Verwaltung, die auch die Liste enthält, bekommt den Befehl das entsprechende Feld zu entfernen. Den Rest übernimmt diese.
Das Feld selbst von der GUI zu entfernen und danach an die GUI-Oberflächenverwaltung den Befehl zu geben, dieses Feld auch dort zu löschen, ist natürlich doppelte Arbeit. ;-)

Ich benutze aber für den Zweck auch angepasste Klassen, die die entsprechenden Möglichkeiten bieten. Diese sind dann universell in meinen Programmen einsetzbar, so dass die Verwaltung einfacher wird. Und auch die vorhandenen Klassen können mit Hilfe von Class Helpern (ab Delphi 2006) auch um eine solche Funktionalität ergänzt werden (leider nicht bei generischen Typen).

Bei einzelnen Komponenten macht FindComponent jedenfalls keinen Sinn und bei einer Liste wird oft dann doch eine Schleife zum Ansprechen benutzt und in der ist FindComponent performancemäßig ungeeignet. Zudem reicht es aus aus Versehen den Namen der Komponente zu ändern und schon funktioniert vielleicht irgendetwas nicht mehr. Da man es aber auf diese Art und Weise macht, hat der Compiler keinerlei Möglichkeit, dies zu erkennen. Deshalb gibt es zwar Anwendungsfälle, in denen es Sinn macht, aber man muss aufpassen, dass man sich damit kein Bein stellt.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 21.04.11 09:21 
Also für den Fall mit "Nutzer kann beliebig viele Instanzen von Controls anlegen" fallen mir grad 2 Lösungen ein:

Nummer 1:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type
    TUserControls = record
        L_Feld1: TLabel;
        E_Feld1: TEdit;
        L_Min: TLabel;
        E_Min: TMaskEdit;
        L_Max: TLabel;
        E_Max: TMaskEdit;
        L_Irgendwas: TLabel;
        C_Irgendwas: TCombobox;
    end;

var
    UserControls: array of TUserControls;


Einfügen und Entfernen von Einträgen aus einem Array ist recht trivial, Nutzung im Programm einfach durch:

ausblenden Delphi-Quelltext
1:
UserControls[X].E_Max.Value := '12,5';					


Und siehe da: KEIN FindComponent ... *staun*

Nummer 2:
Die andere wäre, ich definiere mir von TFrame abgeleitet meine Oberfläche und instantiiere das als Frame statt als Record. Dann kann ich das nämlich sogar soweit treiben, dass ich die Prüfungslogik für die Gültigkeit und die zugehörigen Nutzerdaten direkt von dem Frame verwalten lasse.

Die Frames dann entweder in ein Array, eine TList oder eine TObjectList und, warte, ging schon wieder ohne FindComponent.


Ach verdammt, und dabei wollte ich grad so schön zeigen, wie einfach FindComponent den Source unübersichtlich macht ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.