![]() |
AW: Zur Laufzeit erzeugte Editierfelder
Man könnte auch ein simples Array für die Edits machen, etwa so:
Delphi-Quellcode:
Mann sollte die Edits dann auch wieder freigeben.
tform
edarray:array[1..10] of array[1..10] of tedit; procedure TForm1.CreateMatrix(rang:integer); var i,k : integer; begin for i:=1 to rang do for k:=1 to rang do begin edarray[i,k]:=tedit.create(self); ... editarray[i,k].onexit:=exithandler; end end; procedure TForm1.EditExitHandler(Sender: TObject); begin for i:=1 to rang do for k:=1 to rang do begin if tedit(sender)=edarray[i,k] then // Do something here end; end Nur mal schnell hingeschrieben, kann man sicher auch schöner machen. |
AW: Zur Laufzeit erzeugte Editierfelder
Der Vorteil an Tag oder Dictionary ist, dass man im OnClick/OnMouseMove/sonstwo nicht erst in der Liste/Array suchen muß, da die Komponente (Sender) es einem direkt sagt oder man mit nur einem Zugriff das Dictionary fragen kann.
Wenn die Edits einen passenden Owner im Create mitbekommen, wie z.B. die Form oder ein Panel, dann werden sie bei Freigabe der Form auch mit automatisch freigegeben. Und auch wenn es "eigentlich" ein klein bissl "falsches" Verhalten ist (aber die WinAPI macht es mit seinen Komponenten auch so, also wurde es auch in die VCL eingebaut und hat mich schonmal echt erschrocken, weil ich damit nicht gerechnet hab, denn "eigentlich" ist ja der Owner für die Freigabe zuständig) So gibt die VCL ihre Komponenten auf Forms ebenfalls/zusätzlich über die Parent-Beziehung frei, also z.B. verschwindet das Edit, wenn man das Panel löscht, auf welcher das Edit angezeigt wird. |
AW: Zur Laufzeit erzeugte Editierfelder
Beim erzeugen Speicher ich mir die Referenz in einer "private" liste ab, beim beenden iterier ich die durch und gebe Speicher wieder frei. Das mit "owner panel" gefällt mir, habe ich noch nicht versucht. Danke für den Tipp!
|
AW: Zur Laufzeit erzeugte Editierfelder
In dem Panel kannst dann auch mit Panel.FindComponent suchen.
oder
Delphi-Quellcode:
(TComponent hat einen Standard-Enumerator für .Components),
for P in Panel do
bzw. selbst über die .Components iterieren. .Controls sind die Parent-Beziehungen und .Components die Owner-Beziehungen. |
AW: Zur Laufzeit erzeugte Editierfelder
Nach all den richtigen Hinweisen mal ne dumme Frage:
Zitat:
|
AW: Zur Laufzeit erzeugte Editierfelder
wenn Du sowieso Deine Edits zur Laufzeit erzeugts, kannst Du auch gleich eine TEdit Ableitung erzeugen, die zu der Aufgabenstellung passt. Dort kannst Du dann eine Referenz des passenden Typs verwalten und bist nicht auf die Tags beschränkt und brauchst auch nicht unbedingt Event handler zuzuweisen.
Edt:=TMySpecialEdit.Create(Self); Wenn man Komponenten zur Laufzeit erzeugt, macht es keinen Sinn dort auch Namen zuzuweisen. Man riskiert nur Fehler, wenn Namen bereits existieren. FindComponent brauchst Du nicht, wenn Du alle erzeugten Edits in einer TList<TMySpecialEdit> speicherts. Du kannst So auch einen Pool von Edits haben, deren Funktion Du nach Bedarf neu zuweisen kannst oder sie verstecken. |
AW: Zur Laufzeit erzeugte Editierfelder
dem stimme ich aber nicht ganz zu.
selbst wenn der Name nicht verwendet wird, so ist er beim Debuggen oft sehr hilfreich, z.B. kann man so an der Instanz in einem Eventhandler den Namen auslesen, was leichter zu verstehen ist, als irgendein ObjektZeiger. aber ja, beim automatischen Erstellen muß man natürlich aufpassen, dass es keine Namenskonflikte gibt, aber hier kann man z.B. den Namen aus einem Prefix und der Position in der Matrix gut generieren lassen. |
AW: Zur Laufzeit erzeugte Editierfelder
Auch wenn ein Teil davon bereits erwähnt wurde, zähle ich das noch mal kurz mit auf:
Warum nicht eine Tabelle (Grid) für die Eingabe verwenden? Wenn man Komponenten zur Laufzeit erzeugt, kann man denen auch passende Eigenschaften verpassen:
Delphi-Quellcode:
Speichert man die Komponenten beim Erzeugen in einem Array, wird FindComponent nicht benötigt.
type
TMyEdit = class(TEdit) private FPosition: TPoint; public property Position: TPoint read FPosition write FPosition; end; {...} Edt := TMyEdit.Create(Self); Edt.Position.X := k; Edt.Position.Y := i; Edt.OnExit := ABCOnExit; {...} procedure TForm1.ABCOnExit(Sender: TObject); begin k := TMyEdit(Sender).Position.X; i := TMyEdit(Sender).Position.Y; {...} end;
Delphi-Quellcode:
TForm1 = class(TForm)
private FMyEditABC: array of array of TMyEdit; end; Edt := TMyEdit.Create(Self); FMyEditABC[k, i] := Edt; |
AW: Zur Laufzeit erzeugte Editierfelder
Glück auf!
Vielen Dank für die reichlichen Zuschriften. Habe mich an Ralfs Neumanns Vorschlag gehalten. Special thanks an ihn. Aber gelegentlich tritt ein ganz anderes Problem auf. Beim Linken wird der Laufzeitfehler F2039: ...Ma-Orthogonalisieren.exe kann nicht erstellt werden. Embacadero hat es offensichtlich nicht geschafft, das seit XE2 auftretende Phänomen auf den Leibe zu rücken. (Für Sezialisten: Die dcu-Dateien haben keinen zusätzlichen Punkt.) Komischerweise werden andere Projekte anstandslos gelinkt - aber bei denen wird ja auch nichts geändert. Viele Grüße Kurt |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 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