Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi FindComponent formübergreifend verwenden (https://www.delphipraxis.net/103561-findcomponent-formuebergreifend-verwenden.html)

little_budda 17. Nov 2007 16:55


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:
  // 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');
Hat jemand eine Iddee für mich?

:gruebel:

Apollonius 17. Nov 2007 16:56

Re: FindComponent formübergreifend verwenden
 
Der Cast TMemo() muss um den Aufruf von FIndComponent herum plaziert werden.

DGL-luke 17. Nov 2007 17:02

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.

little_budda 17. Nov 2007 17:12

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.

DGL-luke 17. Nov 2007 17:14

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?

bitsetter 17. Nov 2007 17:15

Re: FindComponent formübergreifend verwenden
 
Hi,

über
Delphi-Quellcode:
var
  i: integer;
begin
  for i:= 0 to application.ComponentCount- 1 do
    if application.Components[i] is TCustomForm then
      TCustomForm(application.Components[i]).FindComponent('...'))
kannst du die Formulare deiner Anwendung ansprechen.

little_budda 17. Nov 2007 17:21

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.

Apollonius 17. Nov 2007 17:23

Re: FindComponent formübergreifend verwenden
 
Ich meinte mit meinem Post Folgendes:
Delphi-Quellcode:
TMemo(frm_create_result_doc.FindComponent('Memo_daten_1')).Lines.add('Hallo Welt');
Denn frm_create_result_doc.FindComponent gibt ja ein TComponent zurück, das du eben casten musst.

Hawkeye219 17. Nov 2007 17:28

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:
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');
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.

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

little_budda 17. Nov 2007 19:02

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 22:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz