Autor Beitrag
bms
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 735

Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
BeitragVerfasst: Mi 28.04.04 10:39 
Ich hab ein kleines Problem und das sieht so aus: ich hab eine Unit die etwas abarbeitet. Es ist nicht die Unit1, sondern eine extra Unit. Alle Fehler sollen in eine Logdatei gespeichert werden. Dazu hab ich in der Unit ein StringList Objekt erstellt und schreibe da alle Fehlermeldungen rein die beim Durchlauf passieren. Bis her ist also noch alles klar. Ich habe eine StringList in die permanent etwas reingeschrieben wird.

Nun hab ich auf dem Formular eine Memo mit der ich gerne die Log-StringList beobachten möchte. Eine Möglichkeit wäre, daß ich zwischendurch einfach den Inhalt der StringList in die Memo kopiere, z.B. mit Memo1.Lines.Text := StringList.Text. Alles möglich. So will ich es aber nicht machen.

Gibt es eine Möglichkeit die Memo mit der StringList gleichzuschalten. Eigentlich sind beide Objekte. Ich dachte mir einfach, daß ich Memo1.Lines der Adresse von StringList zuweise. Funktioniert aber nicht. Es passiert nichts in der Memo, auch wenn die StringList mit Daten gefüllt wird. Wer kann helfen?

_________________
VORSICHT: Ich behersche seit heute die Fünf-Finger-Handflächen-Herz-Explodier-Schlag-Kampf-Technik >:(
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 28.04.04 11:07 
Mach doch in deiner Log-Unit einen Nachfahren von TStringlist, bei dem du die Methode Add übersteuerst. Ausserdem sollte dieser Nachfahre eine Published-Property Memo bekommen. Der Property weist du zur Laufzeit dann das Memo zu, in das gleichzeitig geschrieben werden soll.

Die übersteuerte Prozedur:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TMyStringlist.Add(Str:String);
begin
  //wenn ein Memo-Objekt zugewiesen wurde, Zeile dort hinzufügen.
  if FMemo<>NIL then
    FMemo.Lines.Add(Str);

  //ursprüngliches Procedere fortsetzen
  inherited;
end;


Cu,
Udontknow
bms Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 735

Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
BeitragVerfasst: Mi 28.04.04 11:25 
Ich verstehe was du vorschlagen möchtest, aber so möchte ich es nicht machen. Die Unit selbst soll nichts von der Memo wissen. Die Unit ist für sich alleine und soll auf keine Komponenten zugreifen, da es durchaus passieren kann, daß ich die Unit später in einem anderen Programm einbaue. Dann muß ich meine Unit an die aktuellen Komponenten anpassen usw. Nein, das möchet ich nicht.

Die Unit ist einfach eine Unabhängige Einheit auf die zugegriffen werden kann, die aber selbst nirgendwo zugreift.

Deshalb dachte ich eben daran die gleichzusetzen. Aber das klappt nicht.

_________________
VORSICHT: Ich behersche seit heute die Fünf-Finger-Handflächen-Herz-Explodier-Schlag-Kampf-Technik >:(
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 28.04.04 11:40 
Du hast es nicht so ganz verstanden. Die Unit weiss nichts von der bestimmten Memo, sondern nur von irgendeiner Memo, die du dynamisch in anderen Units zuweisen kannst.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  type TMyStringlist=class(TStringlist)
  private
    FMemo: TMemo;
    public
      function Add(const S: string): Integer; override;
      property Memo:TMemo read FMemo write FMemo;
  end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function TMyStringlist.Add(const S: string): Integer;
begin
  if FMemo<>NIL then
    FMemo.Lines.Add(S);

  inherited;
end;


Du musst nur irgendwann (in einem Formcreate o.ä.) das Memo der Stringlist zuweisen:

ausblenden Delphi-Quelltext
1:
MyLogUnit.MyStringlist.Memo:=Memo1;					


In anderen Applikationen weist du vielleicht eine andere Memo-Komponente zu.

Wo ich mir das gerade überlege, wäre es vielleicht noch besser, direkt eine TStrings-Instanz als Verweis zu nehmen anstelle des TMemo-Feldes, sodaß die Ausgabe überall hin erfolgen könnte (in eine Combobox, eine Listbox, eine andere Stringlist etc. pp.).

Cu,
Udontknow


Zuletzt bearbeitet von Udontknow am Mi 28.04.04 11:42, insgesamt 1-mal bearbeitet
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 28.04.04 11:41 
Hi!

Wie wäre es damit:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
type
  TMyStringlist = class(TStringList)
  private
    FextList: TStrings;
    procedure SetextList(const Value: TStrings);
  public
    property extList : TStrings read FextList write SetextList;
    function Add(const S: string): Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var myStringList : TMyStringList;
begin
  myStringList := TMyStringList.Create;
  try
    myStringList.extList := Memo1.Lines;
    myStringList.Add('Hallo');
  finally
    myStringList.Free;
  end;
end;

{ TMyStringlist }

function TMyStringlist.Add(const S: string): Integer;
begin
  inherited add(s);
  If Assigned(FextList) then FextList.Add(S);
end;


procedure TMyStringlist.SetextList(const Value: TStrings);
begin
  FextList := Value;
end;


//Edit: Ups, ist ja praktisch das Gleiche wie das von Udontknow

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 28.04.04 11:43 
Boah! Du hast meine Überlegung aber schnell umgesetzt! :wink: :mrgreen:
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 28.04.04 11:49 
:-) Habe aber noch was Neues: Warum nicht mit Ereignissen arbeiten?
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    procedure theAdding(sender : TObject; const theString : String);
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  TAddEvent = procedure(sender : TObject; const theString : Stringof object;

type
  TMyStringlist = class(TStringList)
  private
    FonAdd: TAddEvent;
    procedure SetonAdd(const Value: TAddEvent);
  public
    property onAdd : TAddEvent read FonAdd write SetonAdd;
    function Add(const S: string): Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var myStringList : TMyStringList;
begin
  myStringList := TMyStringList.Create;
  try
    myStringList.onAdd := theAdding;
    myStringList.Add('Hallo');
  finally
    myStringList.Free;
  end;
end;

{ TMyStringlist }

function TMyStringlist.Add(const S: string): Integer;
begin
  inherited add(s);
  If Assigned(FonAdd) then FonAdd(self, s);
end;


procedure TMyStringlist.SetonAdd(const Value: TAddEvent);
begin
  FonAdd := Value;
end;

procedure TForm1.theAdding(sender: TObject; const theString: String);
begin
  Memo1.Lines.Add(theString);
end;

end.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bms Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 735

Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
BeitragVerfasst: Mi 28.04.04 11:55 
Danke Leute, aber ich muß mal erstmal für paar Stunden weg. Mache heute abend weiter. Ich werde es auf jeden Fall testen.

_________________
VORSICHT: Ich behersche seit heute die Fünf-Finger-Handflächen-Herz-Explodier-Schlag-Kampf-Technik >:(
BloodyBastard
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

FC1, Win XP
D6 Enterprise
BeitragVerfasst: Mi 28.04.04 12:40 
Wie wärs einfach mit

ausblenden Delphi-Quelltext
1:
FMyList := Memo1.lines;					


dann wird die StringListe gefüllt und auch gleich eine neue Zeile im Memo erstellt, wenn

ausblenden Delphi-Quelltext
1:
FMyList.Add('hallo');					


ausgeführt wird...
Ich denke, das war was er wollte ;-)

_________________
nix
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 28.04.04 12:50 
Ich verstehe deine Ausführungen nicht ganz. FMyList ist doch das interne Feld, das er gar nicht nutzen will. Auf was für einen Beitrag beziehst du dich? Geht es um Peter Lustig´s Beitrag? Denn bms hatte ja gar nichts von FMyList oder so geschrieben.

BMS hat eine Unit, in der seine Log-Stringlist enthalten ist. Nun will er, daß, wann immer er MyLogUnit.MyStringlist.Add aufruft, gleichzeitig dieser Eintrag in ein Memo geschrieben wird, ohne daß dieses Memo explizit in der Log-Unit erwähnt werden muss.

Cu,
Udontknow
BloodyBastard
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

FC1, Win XP
D6 Enterprise
BeitragVerfasst: Mi 28.04.04 13:46 
Wie schreibt er dann das Log? Also ruft er eine Funktion writeLog auf und dort ist die StringListe gespeichert? Wahrscheilnich schon.. dann kann er der Unit einfach das Memo übergeben, also entweder einem Objekt oder halt einer Variablen.. Aber egal, hab nicht richtig gelesen. Ich dachte, er wollte eine Gleichschaltung, da hab ich ihm eine gegeben *g* ;-)

Also tschööö, muss noch was erledigen

_________________
nix
aM0xACiLLiN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Mi 28.04.04 14:22 
Hi,

mach doch einfach eine Prozedur in deine MainForm, die du dann von der Unit aufrufst.
Die kannst du dann für jedes Programm, das die Unit nutzt, entsprechend anpassen.

cu
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 28.04.04 14:57 
Das ist genau das, was ich oben gemacht habe. Nur, dass ich es in ein Ereignis gepackt habe. Vielleicht sollten wir jetzt erst einmal warten, bis bms sich geäußert hat. Sonst ist die Diskussion ziemlich sinnlos, oder?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".