Autor |
Beitrag |
Jakane
      
Beiträge: 257
|
Verfasst: Di 21.06.11 10:34
Hallo liebe Delphi-Helfer
ich habe ein Formular und möchte, wenn der Anwender in ein Feld was reingeschrieben hat, dass dann automatisch ein neues Textfeld erstellt wird, ohne das ich das vorher im Programm vorgebe.
Daher die Frage:
Wie sage ich Delphi, erstelle mir ein EditFeld
Namens Feld_x (x als berechnende Variable)
auf Top:= Höhe * x und Width:= 5
Sprich, Name mit Variablen Wert zuweisen oder mit festen Wert und natürlich das das Feld dann auch wirklich da ist für den Anwender
Danke an alle die helfen können :) Moderiert von Narses: Topic aus Dateizugriff verschoben am Di 21.06.2011 um 12:12
|
|
pwsolaris
      
Beiträge: 71
Erhaltene Danke: 1
MS DOS, Win 95, Win 98, Win ME, Win XP, Win Vista, Win 7 Ultimate
Delphi 5 Enterp., Delphi 2007, Delphi 2009, Informix 4GL, VB .NET, MS/SQL, PL/SQL
|
Verfasst: Di 21.06.11 11:01
Hi,
du möchtest also ein normales Edit-Feld zur Laufzeit hinzufügen?
Ich habe das bisher nur mit Bildern (TImage) gemacht, denke aber, dass das Prinzip wohl das gleiche ist
Zunächst einmal habe ich eine Variable der benötigten Komponente erstellt:
Delphi-Quelltext
Dann habe ich mir eine kleine Prozedur geschrieben, in der ich meine Komponente erstelle:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| begin Test := TEdit.create(self); Test.parent := self; Test.height := 10; Test.width := 100; Test.top := 100; Test.left := 100; Test.visible := true; Test.Show; Test.enabled := true; end; |
Mag sein, dass die ganze Geschichte einfacher zu lösen ist oder sauberer umzusetzen ist, aber das ist immerhin ein Anfang 
Für diesen Beitrag haben gedankt: Jakane
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Di 21.06.11 11:05
Unter umständen ist es auch einfacher das Feld einfach nur auf Hidden zu setzen im Objektinspektor und bei bedarf auf visible....
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Di 21.06.11 13:02
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Di 21.06.11 13:16
Ah hatte das falsch gelesen in deinem Fall ist es so natürlich sinnvoller....
|
|
Kay E.
      
Beiträge: 118
|
Verfasst: Di 21.06.11 14:42
Wobei anzumerken ist, dass du das Objekt dynamisch erstellst. Du reservierst dir damit Speicherplatz, den du dann auch manuell wieder freigeben musst wenn dus nicht mehr brauchst, in deinem Fall mit Test.Free;
Desweiteren brauchst du die drei Zeilen hier nicht:
Delphi-Quelltext 1: 2: 3: 4: 5:
| begin Test.visible := true; Test.Show; Test.enabled := true; end; |
Das sind die Standarteinstellungen der Komponente, so dass du sie nicht extra noch einmal setzen musst.
Wichtig ist, dass du als Parent die Form angibst, auf der das Edit-Feld angezeigt werden soll. Also
Delphi-Quelltext
Das hat den Vorteil, dass, wenn du vergisst, die Komponente freizugeben, der GarbageCollector den Speicher freigeben kann und auch weitere Sachen sind damit sinnvoller.
Grüße Kay
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Di 21.06.11 15:05
Kann dir nicht ganz zustimmen 1. gehe ich davon aus das Self in dem Fall Form1 ist.
Und 2.
The AOwner parameter is the owner of the T(Custom)Form object. The owner of the form is responsible for freeing the form (memory allocated by the form) when needed. What's more the form created appears in the Components array of its owner. Second, the form is destroyed automatically when its owner is destroyed. For forms, the latter is usually more important.
Should you provide "nil", "self" or "Application"?
Alternativ: delphi.about.com/od/...05/qt/nilselfapp.htm
Edit:
Self ist meiner Meinung nach sowieso besser da er dann unabhängig vom Namen seines Formulars ist. Er kann es also beliebig umbenennen ohne überall Form1 z.b. in Form2 zu ändern.
//EDIT: zu schnell... 
Zuletzt bearbeitet von thepaine91 am Di 21.06.11 15:18, insgesamt 2-mal bearbeitet
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 21.06.11 15:07
Moin!
Kay E. hat folgendes geschrieben : | Wobei anzumerken ist, dass du das Objekt dynamisch erstellst. Du reservierst dir damit Speicherplatz, den du dann auch manuell wieder freigeben musst wenn dus nicht mehr brauchst, in deinem Fall mit Test.Free; |
Ich nehme mal an, du beziehst dich auf folgendes Stück Code: pwsolaris hat folgendes geschrieben : | Delphi-Quelltext 1: 2: 3: 4:
| Test := TEdit.create(self); Test.parent := self; Test.height := 10; | |
Wenn dem so ist, dann ist deine Aussage leider falsch, denn durch die Angabe eines Owners wird die neue Komponente Eigentum des Formulars (hier: self) und damit beim Beenden des Programmes automatisch freigegeben. Es ist eher so, dass du solche Komponenten (also mit beim Erzeugen angegebenem Owner) besser nicht manuell wieder freigibst!  Wenn du die Komponenten selbst verwalten willst, solltest du als Owner NIL beim Create übergeben.
Kay E. hat folgendes geschrieben : | Wichtig ist, dass du als Parent die Form angibst, auf der das Edit-Feld angezeigt werden soll. Also
Delphi-Quelltext |
Das ist in dem Code oben doch drin, sogar allgemeiner (=besser) per self formuliert.
Kay E. hat folgendes geschrieben : | Das hat den Vorteil, dass, wenn du vergisst, die Komponente freizugeben, der GarbageCollector den Speicher freigeben kann und auch weitere Sachen sind damit sinnvoller. |
Ein seltsames Gerücht: Delphi hat keinen GarbageCollector  Speicher, den du anforderst und nicht wieder frei gibst, ist bis zum Programmende unwiederbringlich verloren.  Z.B. C# oder Java arbeiten mit einem GarbageCollector, der nicht mehr referenzierten Speicher einsammelt und wieder zur Verfügung stellt.
cu
Narses
//EDIT: zu langsam... 
_________________ There are 10 types of people - those who understand binary and those who don´t.
Für diesen Beitrag haben gedankt: Jakane
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Mi 22.06.11 08:36
hmm...
In einem steht irgendwas englisches und ich glaube ein Mod hat das korrigiert, ist daswas da steht irgendwie relevant für mein Fall....?
Bis auf
Kay E. hat folgendes geschrieben : | Wichtig ist, dass du als Parent die Form angibst, auf der das Edit-Feld angezeigt werden soll. Also
Delphi-Quelltext |
Versteh nämlich nix
Aber der Hinweis ist Prima, da ich nämlich mit InfoPanel arbeite 
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Mi 22.06.11 09:05
Englisch sollte man verstehen als Programmierer.
Aber Narses hat es auch wunderbar auf Deutsch formuliert.
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Mi 22.06.11 11:02
versteh trotzdem nicht was er meint 
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 22.06.11 11:15
Moin!
Jakane hat folgendes geschrieben : | versteh trotzdem nicht was er meint  |
Was genau verstehst du nicht?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Mi 22.06.11 11:36
Narses hat folgendes geschrieben : | Es ist eher so, dass du solche Komponenten (also mit beim Erzeugen angegebenem Owner) besser nicht manuell wieder freigibst! Wenn du die Komponenten selbst verwalten willst, solltest du als Owner NIL beim Create übergeben.
Kay E. hat folgendes geschrieben : | Das hat den Vorteil, dass, wenn du vergisst, die Komponente freizugeben, der GarbageCollector den Speicher freigeben kann und auch weitere Sachen sind damit sinnvoller. | Ein seltsames Gerücht: Delphi hat keinen GarbageCollector Speicher, den du anforderst und nicht wieder frei gibst, ist bis zum Programmende unwiederbringlich verloren. Z.B. C# oder Java arbeiten mit einem GarbageCollector, der nicht mehr referenzierten Speicher einsammelt und wieder zur Verfügung stellt.
|
damit kann ich so gar nichts anfangen, aber ich habe auch nicht das gefühl das es für mich wichtig ist.
ich habe nur grade gemerkt, felder auslesen die erst bei programmlauf erzeugt werden krieg ich irgendwie nicht hin
wie kann ich so ein feld auslesen, zB in eine variable?
Moderiert von Narses: Zitat repariert.
--- Moderiert von Narses: Beiträge zusammengefasst---
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var txtNeu : TEdit; Begin txtNeu:= TEdit.Create(Self); txtNeu.Parent:= fmAuftrag.IPAuftragPos; txtNeu.Height:= 21; txtNeu.Width:= 25; txtNeu.Top:= gPos * 25; txtNeu.Left:= 10; txtNeu.MaxLength:= 3; txtNeu.Name:= 'txtPos_' + IntToStr(gPos); txtNeu.OnKeyPress:= txtPos_0KeyPress; if gPos < 10 then txtNeu.Text:= '00' + IntToStr(gPos) else if gPos < 100 then txtNeu.Text:= '0' + IntToStr(gPos) else txtNeu.Text:= IntToStr(gPos); |
also so schaut das bei mir aus
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 22.06.11 11:50
Moin!
Jakane hat folgendes geschrieben : | damit kann ich so gar nichts anfangen, aber ich habe auch nicht das gefühl das es für mich wichtig ist. |
OK, ich mach nochmal eine Kurzfassung für dich:
Narses hat folgendes geschrieben : | Es ist eher so, dass du solche Komponenten (also mit beim Erzeugen angegebenem Owner) besser nicht manuell wieder freigibst! Wenn du die Komponenten selbst verwalten willst, solltest du als Owner NIL beim Create übergeben.  |
Fazit: Lass das txtNeu.Free; weg, da du hier txtNeu:= TEdit.Create(Self); stehen hast.
Narses hat folgendes geschrieben : | Kay E. hat folgendes geschrieben : | Das hat den Vorteil, dass, wenn du vergisst, die Komponente freizugeben, der GarbageCollector den Speicher freigeben kann und auch weitere Sachen sind damit sinnvoller. | Ein seltsames Gerücht: Delphi hat keinen GarbageCollector Speicher, den du anforderst und nicht wieder frei gibst, ist bis zum Programmende unwiederbringlich verloren. Z.B. C# oder Java arbeiten mit einem GarbageCollector, der nicht mehr referenzierten Speicher einsammelt und wieder zur Verfügung stellt.
|
Das ist nur Hintergrund und eigentlich an Kay E. gerichtet gewesen.  Fazit: Heute für dich nicht wichtig.
Jakane hat folgendes geschrieben : | wie kann ich so ein feld auslesen, zB in eine variable? |
Das Problem ist etwas komplexer, als es auf den ersten Blick aussieht: Du hast die Variable txtNeu: TEdit lokal deklariert, deshalb hast du nach dem Ende der Prozedur keinen Zugriff mehr darauf.  Einfach (aber unschöne Lösung): Global deklarieren (zumindest zum Testen kannste das mal machen). Wenn du das später mit viel mehr Komponenten machen willst, solltest du dir die Referenzen dazu in einer z.B. TObjectList aufheben.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Mi 22.06.11 11:59
Narses hat folgendes geschrieben : | Jakane hat folgendes geschrieben : | wie kann ich so ein feld auslesen, zB in eine variable? | Das Problem ist etwas komplexer, als es auf den ersten Blick aussieht: Du hast die Variable txtNeu: TEdit lokal deklariert, deshalb hast du nach dem Ende der Prozedur keinen Zugriff mehr darauf. Einfach (aber unschöne Lösung): Global deklarieren (zumindest zum Testen kannste das mal machen). Wenn du das später mit viel mehr Komponenten machen willst, solltest du dir die Referenzen dazu in einer z.B. TObjectList aufheben. |
1. danke fürs zusammenfassen
2. danke das du meine posts repariert hast und
3....
ich habe 6 felder pro durchgang die ich auf die weise erstelle, wie mach ich das mit der obejektliste?
Moderiert von Narses: Zitat gekürzt.
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Mi 22.06.11 12:36
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Mi 22.06.11 13:13
ich merk wiedermal... mit komponenten die ich nicht sehen kann lern ich den umgang nur schwer
erstellen, hinzufügen und löschen ist klar
aber wie verwend ich das sinnvoll mit meinem problem 
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Mi 22.06.11 17:00
Da wo du Felder erzeugst fügst du sie in der Liste hinzu da wo du Felder verwerfen möchtest Löscht du sie aus der Liste ich verstehe grade nicht was daran für dich genau Unklar ist?
Erstell doch zuerst eine Methode zum erstellen der Felder und wenn du dann Probleme hast kannst du eine spezifische Frage inkl. Codebeispiel stellen. Aber ich finde du solltest dir selbst die Gedanken machen wie du das sinnvoll kombinierst.
|
|
|