Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Frame aus einer Unit ansprechen (https://www.delphipraxis.net/169722-frame-aus-einer-unit-ansprechen.html)

HPB 7. Aug 2012 19:15

Delphi-Version: XE2

Frame aus einer Unit ansprechen
 
Guten Tag Delphianer,
ich möchte eine Memo-Komponente aus einer Unit aus ansprechen.
Den Beitrag "Zugriff auf Frame-Objekte" kenne ich, bringt aber keine Lösung.
Folgendendes:
In einer Unit z. B. Update3000 tue ich irgendetwas, das Ergebnis (Erfolg, nicht Erfolgt) soll eine Zeile
Memo.Add.Lines(erfolg/ nicht efolgt) erzeugen.
In der Unit Update3000, habe ich das Frame mit z.B. HauptFrame := TMainFrame.Create, eingebunden und erzeugt.
Wie kann ich nun das Memofeld "MemoAnzeige", das auf dem HauptFrame liegt, ansprechen.
Wie z. B. HauptFrame.MemoAnzeige.Add.Lines('text');

Bisher ist es mir nicht gelungen!!
Weiß irgendeiner was ich falsch mache, falsch verstanden habe??
Vielen Dank für die Hilfe.
HPB

bernau 7. Aug 2012 19:18

AW: Frame aus einer Unit ansprechen
 
Hast du Lines und Add vertauscht? Sollte es nicht heissen:

Delphi-Quellcode:
HauptFrame.MemoAnzeige.Lines.Add('text');

HPB 7. Aug 2012 19:21

AW: Frame aus einer Unit ansprechen
 
Zitat:

Zitat von bernau (Beitrag 1177258)
Hast du Lines und Add vertauscht? Sollte es nicht heissen:

Delphi-Quellcode:
HauptFrame.MemoAnzeige.Lines.Add('text');

In der Tat.
Aber dies löst nicht das ursprüngliche Problem.
Mit Gruß
HPB

himitsu 7. Aug 2012 20:19

AW: Frame aus einer Unit ansprechen
 
Zitat:

Zitat von HPB (Beitrag 1177256)
Bisher ist es mir nicht gelungen!!
Weiß irgendeiner was ich falsch mache, falsch verstanden habe??

Bezüglich der Überschrift hast du vermutlich garnichts falsch gemacht.
Und schön, wenn Fehlermeldungen unterschlagen werden, bzw. wenn niemand verrät, wie diese lauten.

Zitat:

Delphi-Quellcode:
HauptFrame.MemoAnzeige.Add.Lines('text');

Denn der Compiler meckert erst beim Add ("Add" ist nicht deklariert oder so), was also bedeutet, daß HauptFrame und MemoAnzeige erfolgreich angesprochen werden konnten. :angle2:

Oder lautet die Fehlermeldung etwa anders?

sx2008 8. Aug 2012 04:25

AW: Frame aus einer Unit ansprechen
 
Du könntest ein Event verwenden.
Das gleiche Prinzip, dass die VCL so vielseitig einsetzbar macht, ist auch innerhalb deiner Anwendung geeignet die verschiedenen Units, Klassen und Komponenten zu entkoppeln.

Furtbichler 8. Aug 2012 07:14

AW: Frame aus einer Unit ansprechen
 
Dein Frame ist mitteilsam. Gut so.
Stell Dir vor, nicht nur dieses Frame wäre mitteilsam, sondern viele andere auch. Vielleicht ist eine unsichtbare Klasse auch mitteilsam und möchte Nachrichten loswerden.

Du kannst Dir eine Klasse bauen, die alle Mitteilungen entgegennimmt und irgendwo anzeigt oder speichert. Diese Klasse wäre auch z.B. in der Lage, das Memo im Hauptformular zu befüllen. Diese Klasse nennen wir einfach mal TMessageCollector.

Davon benötigen wir jetzt eine Instanz.

Dein Frame ruft also MessageCollector.AddMessage('Ich bin ein Frame und hatte Erfolg') auf. Für das Frame ist die Sache damit erledigt.

Der MessageCollector kann diesen Text z.B. mit Zeitstempel in einer Datei ablegen. So hättest Du eine Art Logging. Oder er schickt die Nachricht an das Hauptformular. Das ist aber vielleicht keine sooo gute Idee, denn dann müsste der MessageCollector ja von dem Hauptformular wissen und du könntest diese an sich sehr praktische Klasse später nicht noch einmal verwenden.

Also könnte man das so lösen, das der Collector z.B. eine Property "LogStrings" vom Typ TStrings definiert. Das Hauptformular setzt nun diese Property auf Memo.Lines und fertig ist die Kiste.

Dann muss man nur noch darauf achten, das der MessageCollector die LogStrings nicht in einem Thread befüllt.

Eine andere Möglichkeit wäre, das der Messagecollector die anzuzeigenden Strings per SendMessage an ein Handle schickt. Das Hauptformular implementiert einen Messagehandler und teilt dem Messagecollector noch sein Handle mit.

Man könnte auch bemängeln, das das Frame und alle Klassen zu starr mit dem Messagecollector verbunden sind, aber das muss man abwägen. In vielen Projekten habe ich so einen Collector, weil ich unbedingt Logausgaben/Dateien benötige, um Troubleshooting zu betreiben.

Viele Wege führen nach Rom.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 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