Entwickler-Ecke
Sonstiges (Delphi) - Eine StringList mit einem Memo geleichsetzten.
bms - Mi 28.04.04 10:39
Titel: Eine StringList mit einem Memo geleichsetzten.
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?
Udontknow - 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:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TMyStringlist.Add(Str:String); begin if FMemo<>NIL then FMemo.Lines.Add(Str);
inherited; end; |
Cu,
Udontknow
bms - 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.
Udontknow - 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.
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; |
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:
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
Christian S. - Mi 28.04.04 11:41
Hi!
Wie wäre es damit:
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;
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
Udontknow - Mi 28.04.04 11:43
Boah! Du hast meine Überlegung aber schnell umgesetzt! :wink: :mrgreen:
Christian S. - Mi 28.04.04 11:49
:-) Habe aber noch was Neues: Warum nicht mit Ereignissen arbeiten?
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); public end;
type TAddEvent = procedure(sender : TObject; const theString : String) of 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;
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. |
bms - 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.
BloodyBastard - Mi 28.04.04 12:40
Wie wärs einfach mit
Delphi-Quelltext
1:
| FMyList := Memo1.lines; |
dann wird die StringListe gefüllt und auch gleich eine neue Zeile im Memo erstellt, wenn
ausgeführt wird...
Ich denke, das war was er wollte ;-)
Udontknow - 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 - 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
aM0xACiLLiN - 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. - 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?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!