![]() |
LogFile global ansprechbar machen
Hallo!
Ich bin gerade dabei eine etwas größere (Delphi-) Anwendung zu schreiben. Ich möchte auf meinem HauptFormular eine Auflistung aller Aktionen des Programms anzeigen: Season-Log:
Delphi-Quellcode:
So in etwa soll das aussehen.
12:13:54 / 27.12.2003 Programm gestartet
12:13:55 / 27.12.2003 Suchfunktion geöffnet 12:13:56 / 27.12.2003 Suche in "Archiv" nach Suchwort "Auto" 12:13:59 / 27.12.2003 17 Eintrgäe gefunden Meine Frage ist nun, wie ich das am besten realisiere, dass ich von jeder Stelle in meinem Programm einen Text an HauptFormular senden kann. (Natürlich ohne eine schlechte Unit-Nutzung) Ich kann ja nicht einfach aus einer Untergeordnete-Klasse eine Methode der Main-Unit aufrufen... Gruß, Steffen |
Re: LogFile global ansprechbar machen
Das ist glaube ich das richtige für dich:
![]() |
Re: LogFile global ansprechbar machen
Das soll in einer Scrollbox auf dem HauptFormular geschrieben werden, und nicht in eine Datei!
|
Re: LogFile global ansprechbar machen
Jetzt kommt es darauf an, wie du dein Programm designt hast. Wenn das Design schön objektorientiert ist, dann sollte das alles eigentlich kein Problem darstellen.
Skizziere mal die Struktur deines Programms. |
Re: LogFile global ansprechbar machen
Momentan habe ich es so gemacht:
Ein MainFormular. Dieses Bindet zwei Datenmodule ein. Aus dem MainForm rufe ich auch noch andere Formulare auf. Wie soll ich's besser beschreiben? Änderungen an der Struktur meines Programms sind herzlich willkommen! :-D |
Re: LogFile global ansprechbar machen
Warum in einer Scrollbox?
Du kannst das doch auch in einer Listbox machen, ist einfacher, nämlich mit ListBox1.Items.Add('Test'). |
Re: LogFile global ansprechbar machen
Listbox meinte ich eigentlich auch...
|
Re: LogFile global ansprechbar machen
Aber wie kriege ich nun die Daten aus einer untergeordneten Unit in die ListBox?
|
Re: LogFile global ansprechbar machen
Indem du die Hauptform (in meinem Fall Form1) direkt ansprichst.
D.h. Erst die uses für die Form einbinden und dann mit Form1.Listbox1.Items.Add('test'). Somit wird in die Listbox der Hauptform etwas eingetragen |
Re: LogFile global ansprechbar machen
Aber die Unit's in denen ich auf die Listbox(der MainUnit) zugreifen will, werden schon von der MainUnit eingebunden.
Das würde eine zyklische Einbinde-Hierarchie ergeben... Und das ist nicht so ganz okay... |
Re: LogFile global ansprechbar machen
:wiejetzt:
Was ist das Problem, wenn du einfach Form1.ListBox1.Items.Add('test') machst, dass dürfte doch ohne Probleme gehen und was ist daran so schlimm, wenn du die Hauptunit ansprichts? |
Re: LogFile global ansprechbar machen
1. Sollte man nicht direkt aus einer Unit auf Komponenten einer anderen zugreifen
2. Sollte es Tabu sein, dass eine Unit die selbe Unit einbidet, von der sie eingebunden wurde. (Dann könnte man gleich eine draus machen) |
Re: LogFile global ansprechbar machen
Du kannst ja in der zweiten, nicht in der MainForm, eine globale Variable machen, einen String, von dem du dann mit MainForm den String aus der eingeunden Unit ausließt.
Einen besseren Weg kenn ich nicht. Oder natürlich du speicherts alles zwischen durch in eine Datei ab und ließt dann mit der MainForm aus, doch das ist sinnlos, dann kann man es gleich per String machen. |
Re: LogFile global ansprechbar machen
Hallo,
Wenn du am form1 das form2 in einer Procedure aufrufst, dann used der Compiler das form2 automatisch. Er fragt dich dann ob er Form2 usen soll. mfg Bundy |
Re: LogFile global ansprechbar machen
Wie wär's mit sowas?
Delphi-Quellcode:
Ist so ziemlich sauber implementiert. Wie gesagt, ohne Unit-Einbinden geht's nicht, weil du sonst nur auf Methoden von TWinControl zugreifen könntest, was nicht reichen sollte.
type
TMainForm = class(TImage) public procedure AddLogFileEntry(msg: String); { ... } end; procedure TMainForm.AddLogFileEntry(msg: String); begin MyListBox.Items.Add(DateTimeToString(Now) + ' --- ' + msg); end; // Das hier in der Projektdatei (*.dpr): f1 := TFirstChildForm.Create(MainForm); f1.Parent := MainForm; f2 := TSecondChildForm.Create(MainForm); f2.Parent := MainForm; // usw. // Deine Kindformulate können die Logfileentries dann so machen: uses MainForm; // MUSS sein; anders kann man gar nicht auf's Hauptformlar zugreifen procedure TFirstChildForm.AnyMethodYouCouldThinkOf(); begin (Parent as TMainForm).AddLogFileEntry; end; Du kannst das Einbinden natürlich auch umgehen, indem du den Umweg über Windows machst und Messages versendest. Das ist aber kein so besonders sauberes OOP, weil du keine Typensicherheit hast und außerdem nicht besonders performant, weil du die Message-Queue von Windows zusätzlich beanspruchen musst (oder besser gesagt: öfter beanspruchen musst; du merkst nur nicht, dass du es ständig tust und jetzt müsstest du sogar explizit). Außerdem verlörest du die Plattformunabhängigkeit. Alles andere (was ich mir vostellen kann) wäre nur ekelig und unpraktisch, weil von Echtzeit überhaupt nicht mehr die Rede sein kann (z.B. beim regelmäßigen Pollen einer Property der Kindformulare). |
Re: LogFile global ansprechbar machen
Uncle Cracker hat bereits
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 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-2025 by Thomas Breitkreuz