![]() |
FindComponent formübergreifend verwenden
Hallo,
ich verwende "FindComponent" um mehrere gleichartig benannte Komponenten der aktiven Form anzusprechen. Klappt gut. Kann ich auf diese Art und Weise auch Komponenten ansprechen die nicht auf meiner eigenen Form liegen? Hab es probiert mit ...
Delphi-Quellcode:
Hat jemand eine Iddee für mich?
// Hier meckert schon der Compiler weil Form.TMemo nicht zugelassen ist
frm_create_result_doc.TMemo(FindComponent('Memo_daten_1')).Lines.add('Hallo Welt'); // Hier bringt mir die IDE eine Exeption mit Zugriffsverletzung TMemo(FindComponent('frm_create_result_doc.Memo_daten_1')).Lines.add('Hallo Welt'); :gruebel: |
Re: FindComponent formübergreifend verwenden
Der Cast TMemo() muss um den Aufruf von FIndComponent herum plaziert werden.
|
Re: FindComponent formübergreifend verwenden
Man sollte sich einmal ansehen, in welcher klasse FindComponent deklariert ist :roll:
Es ist übrigens in 75% der fälle absoluter schwachsinn, findcomponent zu benutzen. |
Re: FindComponent formübergreifend verwenden
@Apollonius
Ich dachte das hätte ich in meinem zweiten Versuch getan. Habe ich nicht? @DGL-luke Danke für die Einschätzung. Sehr konstruktiv. |
Re: FindComponent formübergreifend verwenden
Sag mir doch mal, was genau du vorhast.
Wenn du anscheinend Name der Form und Name der Kompoennte literal weißt - wofür brauchst du FindComponent? |
Re: FindComponent formübergreifend verwenden
Hi,
über
Delphi-Quellcode:
kannst du die Formulare deiner Anwendung ansprechen.
var
i: integer; begin for i:= 0 to application.ComponentCount- 1 do if application.Components[i] is TCustomForm then TCustomForm(application.Components[i]).FindComponent('...')) |
Re: FindComponent formübergreifend verwenden
@DGL-luke
Ich habe eine weitere Form mit 17 Memofeldern (je drei Zeilen / "Memo_daten_1" bis "Memo_daten_17") Sicher kenne ich die Bezeichner der Memos aber ich arbeite den Inhalt innerhalb einer Schleife ab und wollte die Variante über Case vermeiden @bitsetter Danke für den Code. Ich werde es mal versuchen. |
Re: FindComponent formübergreifend verwenden
Ich meinte mit meinem Post Folgendes:
Delphi-Quellcode:
Denn frm_create_result_doc.FindComponent gibt ja ein TComponent zurück, das du eben casten musst.
TMemo(frm_create_result_doc.FindComponent('Memo_daten_1')).Lines.add('Hallo Welt');
|
Re: FindComponent formübergreifend verwenden
Hallo,
warum spendierst du deinem Formular keine Methode, mit der Text in ein Memo eingefügt werden kann?
Delphi-Quellcode:
Falls du später das Memo durch eine andere Komponente ersetzen solltest, sind nur Änderungen in der Formular-Unit notwendig, nicht aber bei den verwendenden Units.
type
TResultForm = class (TForm) // oder wie auch immer die Klasse heißt... [...] public procedure AddDataLine (const s: string); end; procedure TResultForm.AddDataLine (const s: string); begin Memo_daten_1.Lines.Add(s); end; // Aufruf: frm_create_result_doc.AddDataLine ('Hallo Welt'); Wenn du zwischen mehreren Memos unterscheiden möchtest, kannst du das ja über einen weiteren Parameter steuern (Memo-Nummer o.ä.). Die dann erforderliche Fallunterscheidung wird da implementiert, wo sie hingehört - in der Unit, die auch die Memos enthält. Un um Lukas' Vorschlag noch aufzugreifen: wenn du Verweise auf die Memos einmalig im OnCreate des Formulars in einem Array ablegst, dann benötigst du nicht einmal eine Fallunterscheidung. Gruß Hawkeye |
Re: FindComponent formübergreifend verwenden
Der Vorschlag mit der procedure im public Bereich ist so simpel und doch löst sie alle meine Probleme.
Danke. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 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 by Thomas Breitkreuz