Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Frage über FindComponent
Ruffstaarr - Mi 01.04.09 13:18
Titel: Frage über FindComponent
Hallo
Ich habe in meinem Programm 81 Labels in einem Fenster, und 81 Edits in einem Anderen.
Bevor ich wusste das es FindComponent gibt, habe ich alle manuell Manipuliert und kam mir ZIEMLICH DOOF dabei vor.
Aber Irgendwie Funtioniert es trotzem nicht...
hier mal der code
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100:
| procedure TForm2.Button1Click(Sender: TObject); var
i: integer; begin
for i := 1 to 81 do begin (FindComponent('form1.label' + IntToStr(i)) as TLabel).caption:=(FindComponent('edit1'+ IntToStr(i)) as TEdit).text; end; close; end;
end. |
wäre Nett wenn jemand helfen könnte
Moderiert von
Gausi: Code- durch Delphi-Tags ersetzt
BenBE - Mi 01.04.09 13:34
FindComponent sucht direkt bei dem Objekt, auf dass es sich bezieht. Wenn Du also Form1.FindComponent machst, sucht er nach Componenten, deren Owner deine Form ist. Du
brauchstdarfst hier, da es sich um einen relativen Pfad handelt, keinen vollqualifizierten Bezeichner angeben.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm2.Button1Click(Sender: TObject); var i: integer; begin for i := 1 to 81 do begin (Form1.FindComponent('label' + IntToStr(i)) as TLabel).caption:=(Form1.FindComponent('edit1'+ IntToStr(i)) as TEdit).text; end; end; |
Wenn Du nicht ständig Form1 schreiben möchtest, geht auch:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm2.Button1Click(Sender: TObject); var i: integer; begin for i := 1 to 81 do begin With Form1 Do Begin (FindComponent('label' + IntToStr(i)) as TLabel).caption:=(FindComponent('edit1' + IntToStr(i)) as TEdit).text; end; end; end; |
Weiterhin kannst Du (wenn du dir absolut sicher bist, dass Du Objekte der richtigen Klasse unter diesem Namen findest) auch explizite Typecasts nutzen (ACHTUNG: Delphi prüft dann keine Typen, was zu schwer lokalisierbaren Fehlern kann, wenn man nicht weiß, was man tut!):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm2.Button1Click(Sender: TObject); var i: integer; begin for i := 1 to 81 do begin With Form1 Do Begin TLabel(FindComponent('label' + IntToStr(i))).caption:=TEdit(FindComponent('edit1' + IntToStr(i))).text; end; end; end; |
delfiphan - Mi 01.04.09 23:16
Du hast 81 Labels und 81 Edit Felder. Sind die in einer eigenen GroupBox oder Panel drin? Falls ja, kannst du auch mit einer Forschleife über MyGroup.Components[] / MyGroup.ComponentCount iterieren. Dürfte einiges schneller sein als über Stringbezeichner zu gehen.
jaenicke - Do 02.04.09 00:38
Dei Frage ist doch eher wofür so viele Labels und Edits irgendwie sinnvoll sein sollen... Ich kann mir da keine sinnvolle Anwendung vorstellen, schließlich gibts ja auch TListView, TStringGrid, usw.
delfiphan - Do 02.04.09 17:38
Ich tippe auf sowas wie Sudoku. Ganz klar, 81 Edit Felder sind nicht sinnvoll, nur schon weil der Zugriff auf die Felder nicht wirklich elegant möglich ist.
Ruffstaarr - Do 02.04.09 22:20
Hallo
Danke erstmal für die schnellen Antworten...
leider bin ich TOTALER Delphi Anfänger, und, ja die sind für ein Sodoku....
habe schon ein fertiges in Turbo Pascal....
als ich versucht habe unter
Type
Label: array [1..3, 1..3, 1..9] of TLabel;
bekam ich keine Labels angezeigt...
also hab ich halt Label mit copy & paste die Labels erzeugt... ;-)
Wenn jemand ein gutes online Tutorial hat, für jemanden mit Pascal Kenntnissen wäre ich auch nicht uninterresiert
@BenBe
Zitat:
...:=(Form1.FindComponent('edit1'+ IntToStr(i)) as TEdit).text;
hinter := ... Die Edit Felder liegen doch in Form 2... muss ich trotztem Form1 schreiben?
und gehen dann die anderen codes darunter auch?
BenBE - Do 02.04.09 22:46
Ruffstaarr hat folgendes geschrieben : |
| leider bin ich TOTALER Delphi Anfänger, |
Das brauchst Du nicht schreiben; das kann man in der Regel aus den Postings auch so herauslesen; ansonsten wird nach deinem Kenntnis-Stand gefragt, sollte das wichtig sein. Solche Formulierungen blamieren einfach nur dich selbst ;-)
Ruffstaarr hat folgendes geschrieben : |
als ich versucht habe unter
Delphi-Quelltext 1: 2:
| Type Label: array [1..3, 1..3, 1..9] of TLabel; |
bekam ich keine Labels angezeigt... |
Du musst Label nicht nur deklarieren (was übrigens mit
var geht und nicht mit
type, sondern diese auch Instantiieren und auf das Formular legen; Im Forum und der Bibliothek sollte es dazu eine Reihe von Beispielen geben.
Ruffstaarr hat folgendes geschrieben : |
| also hab ich halt Label mit copy & paste die Labels erzeugt... ;-) |
Dünn-Brett-Coder :P
Ruffstaarr hat folgendes geschrieben : |
| Wenn jemand ein gutes online Tutorial hat, für jemanden mit Pascal Kenntnissen wäre ich auch nicht uninterresiert |
:arrow:
Crashkurs Delphi [
http://www.christian-stelzmann.de/artikel/crashkurs.htm] von
Christian S.
Ruffstaarr hat folgendes geschrieben : |
@BenBE
Zitat:
Delphi-Quelltext 1:
| ...:=(Form1.FindComponent('edit1'+ IntToStr(i)) as TEdit).text; |
hinter := ... Die Edit Felder liegen doch in Form 2... muss ich trotztem Form1 schreiben?
und gehen dann die anderen codes darunter auch? |
Ich bin nach deinem Source oben gegangen, was Du in dem FindComponent angegeben hattest ... und das war Form1. Wenn der Quelltext in Form2 ist, und die Edits auch dort liegen, kann die explizite Angabe des Objektes (FormXY) entfallen --- Sollte sogar für die Portabilität des Quelltextes.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!