AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Zur Laufzeit erzeugte Editierfelder

Offene Frage von "Kurt Wallander"
Ein Thema von Kurt Wallander · begonnen am 23. Apr 2021 · letzter Beitrag vom 29. Apr 2021
Antwort Antwort
Seite 1 von 2  1 2   
Kurt Wallander

Registriert seit: 11. Mai 2020
11 Beiträge
 
Delphi 10.3 Rio
 
#1

Zur Laufzeit erzeugte Editierfelder

  Alt 23. Apr 2021, 21:10
Glück auf!

In meiner geplanten app habe ich Matrizen unterschiedlicher Größe (Rang) zu verarbeiten. Deshalb erzeuge ich die Editierfelder für die Komponenten ABC[i,k] zur Laufzeit durch folgenden Code:
Delphi-Quellcode:
procedure TForm1.CreateMatrix(rang:integer);
var
   Edt : TEdit;
   i,k : integer;
begin
   SetLength(ABC,rang,rang);
   for i:=0 to rang-1 do
      for k:=0 to rang-1 do
      begin
         if TEdit(FindComponent('ABC'+IntToStr(i)+IntToStr(k))) = nil then
         begin
            Edt:=TEdit.Create(Self);
            Edt.Parent:=GroupBox1;
            Edt.Name:='ABC'+IntToStr(i)+IntToStr(k);
            Edt.Width:=75;Edt.Height:=24;
            Edt.Top:=30+i*35;
            Edt.Left:=15+k*90;
            Edt.Alignment:=taRightJustify;
            Edt.BiDiMode:=bdLeftToRight;
            Edt.Visible:=true;Edt.Enabled:=true;
            Edt.Text:=''
         end;
      end;
   if rang=3 then
   begin
      GroupBox1.Width:=290;GroupBox1.Height:=145;
   end
   else
   begin
      GroupBox1.Width:=195;GroupBox1.Height:=100;
   end;
end;
Das funktioniert einwandfrei. Aber ich habe keine Idee, wie ich die Behandlungsroutinen, z. B. Edt.OnExit, ebenfalls zur Laufzeit erzeugen kann. Statisch geht es nicht, da der Compiler die TEdiit-Felder nicht kennt - sie werden ja erst zur Laufzeit erzeugt - und meckert daher (berechtigt).
Hat jemand da eine Idee?
Ein schönes WE
Kurt
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.593 Beiträge
 
Delphi 5 Professional
 
#2

AW: Zur Laufzeit erzeugte Editierfelder

  Alt 23. Apr 2021, 21:56
Füge eine entsprechende Ereignisroutine in deine Klasse (hier wohl TForm1) hinzu und weise diese in der Schleife zu. D.h. alle TEdits verwenden dieselbe Methode.

Grüße
Dalai
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
108 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Zur Laufzeit erzeugte Editierfelder

  Alt 23. Apr 2021, 22:12
Und gib den Editfeldern eine individuellen Tag, dann weißt Du, welches Feld das Ereignis ausgelöst hat.

Code:
id:= (Sender As TEdit).Tag
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
Kurt Wallander

Registriert seit: 11. Mai 2020
11 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Zur Laufzeit erzeugte Editierfelder

  Alt 24. Apr 2021, 12:04
Glück auf!

Vielen Dank für die Replies.
Noch einmal, mein Problem ist, daß ich die Editierfelder zur Laufzeit erzeugen kann. Die Editierfelder haben Namen:ABC00_Edt, ABC01_Edt usw. usf. In diese Editierfelder gebe ich die Werte der Matrixkomponenten ein. Wenn ich nun mit der TAB-Taste zum nächsten Editierfeld "wandere", soll ein OnExit-Ereignis ausgelöst werden, welches ich benutzen will, um den Wert im Editierfeld den Variablen ABC[0,0], ABC[0,1] ... zuzuweisen. Zur Programmierzeit sind ja weder die ABC00_Edt, ABC01_Edt noch ABCOnExit dem Compiler bekannt.
Den Code habe ich inzwischen leicht modifiziert, so daß ich ihn wieder einstelle.
Delphi-Quellcode:
procedure TForm1.CreateMatrix(rang:integer);
var
   Edt : TEdit;
   i,k : integer;
begin
   SetLength(ABC,rang,rang);
   for i:=0 to rang-1 do
      for k:=0 to rang-1 do
      begin
         if TEdit(FindComponent('ABC'+IntToStr(i)+IntToStr(k)+'_Edt')) = nil then
         begin
            Edt:=TEdit.Create(Self);
            Edt.Parent:=GroupBox1;
            Edt.Name:='ABC'+IntToStr(i)+IntToStr(k)+'_Edt';
            Edt.Width:=75;Edt.Height:=24;
            Edt.Top:=30+i*35;
            Edt.Left:=15+k*90;
            Edt.Alignment:=taRightJustify;
            Edt.BiDiMode:=bdLeftToRight;
            Edt.Visible:=true;Edt.Enabled:=true;
            Edt.Text:='';
            Edt.OnExit:=ABCOnExit;
         end;
      end;
   if rang=3 then
   begin
      GroupBox1.Width:=290;GroupBox1.Height:=145;
   end
   else
   begin
      GroupBox1.Width:=195;GroupBox1.Height:=100;
   end;
end;
Viele Grüße
Kurt
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.588 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Zur Laufzeit erzeugte Editierfelder

  Alt 24. Apr 2021, 12:20
Ich bin ehrlich. Ich verstehe dein Problem aktuell nicht. In deinem letzten Beitrag steht auch keine wirkliche Frage mehr.

Das was du hier ja schon gemacht hast sieht soweit alles ok aus. Du musst jetzt nur noch den Event Handler für OnExit() programmieren.

Delphi-Quellcode:
procedure TForm1.EditExitHandler(Sender: TObject);
begin
  // Alternativ den Tag statt des Namens verwenden
  if (Sender.Name = 'ABCxx') then begin
    // Do something here
  end;
end;
So in der Art könnte der aussehen. Dann kompiliert dein Programm auch. Es sei denn du hast uns in deinem Code Snippet die OnExit() Methode vorenthalten.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.563 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Zur Laufzeit erzeugte Editierfelder

  Alt 24. Apr 2021, 15:41
nicht namen vergleichen ... maximal Konstante, aber niemals "irgendwelche" losen strings!!!!!!
niemals mit = ... wenn, dann SameText oder so
und besser immer Variable mit Instanz vergleichen! (z.B. array oder liste mit sprechenden kostanten)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (24. Apr 2021 um 15:43 Uhr)
  Mit Zitat antworten Zitat
Kurt Wallander

Registriert seit: 11. Mai 2020
11 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Zur Laufzeit erzeugte Editierfelder

  Alt 26. Apr 2021, 17:46
Glück auf!

Ich kämpfe noch.
Frage an TomyN: Welchen Typ hat id? Integer oder pointer? Ich muß ja dem Compiler sagen, was es ist.
Und zu Aviator: Ein Code-Snippet habe ich nicht verheimlicht. Genau den suche ich. Aber die Anweisung
if (Sender.Name = 'ABCxx') then bringt den Compiler ins Stolper: Er kennt nämlich die oder das ABCxx nicht. Die werden ja erst zur Laufzeit aktuell.
Die Editierfelder, die mich da gerade interessieren, haben alle "GroupBox1" als parent. Aber iw kann ich das erfragen? Eine Methode sender.parent existiert nicht.
Einen guten Start in die neue Woche
Kurt
  Mit Zitat antworten Zitat
Benutzerbild von runningsoft
runningsoft

Registriert seit: 8. Okt 2004
Ort: Bernau
101 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Zur Laufzeit erzeugte Editierfelder

  Alt 26. Apr 2021, 18:19
Tags von Komponenten sind immer vom Typ integer. Demzufolge müsste die Variable "id" auch integer sein.

Den Codevorschlag von Aviator könntest du folgendermaßen abwandeln, wenn alle deine Editfelder einen eindeutigen Tag erhalten haben:

Delphi-Quellcode:
procedure TForm1.EditExitHandler(Sender: TObject);
begin
  // Alternativ den Tag statt des Namens verwenden
  if (Sender as TEdit).Tag = 1 then begin
    // Do something here
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.061 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Zur Laufzeit erzeugte Editierfelder

  Alt 26. Apr 2021, 18:27
// Alternativ den Tag statt des Namens verwenden
Anstelle alternativ, immer so vorgehen, in allen events, ist mE. die beste Universallösung. Jedenfalls nutze ich es so in meinen dynamischen krams seitdem mich jemand aus der DP darauf gebracht hatte.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.563 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Zur Laufzeit erzeugte Editierfelder

  Alt 26. Apr 2021, 18:42
In mindestens Win32 könnte man zwar auch zur Laufzeit ein Datenobjekt zu Integer casten und im Tag ablegen.
In der eigenen Datenklasse kann man dann ALLES speichern, was man will.
Aber im Formdesigner lässt sich sowas natürlich nicht nutzen.


Man kann die Komponenten ableiten und eigene Property einbauen.
Ist auch super, um mal bei allen gleichen Komponenten im später einen Bugfix zu integrieren oder Weiteres einzubauen.

Alternativ z.B. ein zusätzliches TDictionary<>, wo man Verknüpfungen zwischen Objekten (Objektzeiger) und irgendwas Anderem speichern kann.



Ach ja, INTEGER wurde eingefroren und wird im 64-Bit-Compiler nicht zu 64 Bit, was vorallem bei Casts zwischen Integer und Pointer/TObject knallen wird.

Aber Tag wurde zum Glück auf NativeInt geändert, womit es 64 Bit werden würde, damit solche bösen Castst nicht gleich fieß abrauchen, aber der Cast muß dafür natürlich auch den "richtigen" Typen verwenden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (26. Apr 2021 um 18:45 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 06:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf