Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   LogFile global ansprechbar machen (https://www.delphipraxis.net/13838-logfile-global-ansprechbar-machen.html)

Steffen 27. Dez 2003 19:38


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:
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
So in etwa soll das aussehen.
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

Uncle Cracker 27. Dez 2003 19:42

Re: LogFile global ansprechbar machen
 
Das ist glaube ich das richtige für dich: Auf mich kann man klicken

Steffen 27. Dez 2003 19:48

Re: LogFile global ansprechbar machen
 
Das soll in einer Scrollbox auf dem HauptFormular geschrieben werden, und nicht in eine Datei!

d3g 27. Dez 2003 19:53

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.

Steffen 27. Dez 2003 19:55

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

Uncle Cracker 27. Dez 2003 19:59

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

Steffen 27. Dez 2003 20:03

Re: LogFile global ansprechbar machen
 
Listbox meinte ich eigentlich auch...

Steffen 27. Dez 2003 20:04

Re: LogFile global ansprechbar machen
 
Aber wie kriege ich nun die Daten aus einer untergeordneten Unit in die ListBox?

Uncle Cracker 27. Dez 2003 20:10

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

Steffen 27. Dez 2003 20:14

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...

Uncle Cracker 27. Dez 2003 20:18

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?

Steffen 27. Dez 2003 20:22

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)

Uncle Cracker 27. Dez 2003 20:27

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.

bundy 27. Dez 2003 20:32

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

d3g 29. Dez 2003 14:26

Re: LogFile global ansprechbar machen
 
Wie wär's mit sowas?

Delphi-Quellcode:
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;
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.

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).

choose 29. Dez 2003 14:41

Re: LogFile global ansprechbar machen
 
Uncle Cracker hat bereits auf einen Thread verwiesen, in dem log4d als Lösung vorgestellt wird, mit der Deine Forderungen problemlos umgesetzt werden können :)


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