Autor |
Beitrag |
bms
      
Beiträge: 735
Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 735
Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
Zuletzt bearbeitet von Udontknow am Mi 28.04.04 11:42, insgesamt 1-mal bearbeitet
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 28.04.04 11:41
Hi!
Wie wäre es damit:
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
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 28.04.04 11:43
Boah! Du hast meine Überlegung aber schnell umgesetzt! 
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 28.04.04 11:49
 Habe aber noch was Neues: Warum nicht mit Ereignissen arbeiten?
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. |
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
bms 
      
Beiträge: 735
Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
|
Verfasst: 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
      
Beiträge: 22
FC1, Win XP
D6 Enterprise
|
Verfasst: 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
Delphi-Quelltext
ausgeführt wird...
Ich denke, das war was er wollte 
_________________ nix
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
      
Beiträge: 22
FC1, Win XP
D6 Enterprise
|
Verfasst: 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
      
Beiträge: 64
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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".
|
|