Autor Beitrag
Adam_B
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 31.07.09 12:20 
Hallo!

Meine Frage hängt eigentlich mit Daten zusammen, die ich mit Komponenten associieren möchte. Das bedeutet, dass ich eine ein TList habe, wo sämtliche Daten zusammengefügt sind, und meine Komponenten sollten über diese Daten bescheid wissen: wenn sich die Daten ändern, sollten auch die Komponente darauf reagieren können. Die Komponente zeigen eigentlich die Daten an die in der Liste sind. Ich habe dies bisher mit Nachrichten (SendMessage) gemacht, aber ich wundere mich ob es techniken gibt womit dies besser gemacht werden kann.
Da meine Komponente auf recht viele Forms verteilt sind, war diese Nachrichten versendung nicht so günstig und natürlich wenn die Komponente auf/in einer TPanel liegen, funktioniert das auch nicht so gut.
Ich hatte die Idee, dass ich das Handle von den Komponenten auch in einer Liste verwalte, und die Nachrichten direkt an diese Versende, aber das erscheint mir auch nicht so gut.
Ich hoffe ich habe mein Problem klar geschildert, Entschuldigung für Fehler, meine Muttersprache ist nicht Deutsch..

Danke,
Adam
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 31.07.09 12:35 
Schau Dir mal Eventhandler an. Methoden wie z.B. das OnClick eines Buttons kann man sich nämlich auch selber schreiben. Du müsstest dann lediglich jede Komponente, die etwas von einem Ereignis wissen möchte, über einen Aufruf der Eventhandler informieren.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Adam_B Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 31.07.09 12:47 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Schau Dir mal Eventhandler an. Methoden wie z.B. das OnClick eines Buttons kann man sich nämlich auch selber schreiben. Du müsstest dann lediglich jede Komponente, die etwas von einem Ereignis wissen möchte, über einen Aufruf der Eventhandler informieren.


Hallo BenBE,

Danke, vielleicht habe ich aber nicht richtig erklären können was ich meine. Ich habe eine (fast) globale Objektliste, wovon meine Komponente die Daten die angezeigt werden "holen" sollten. Egal auf welcher Form, oder wo diese Komponenten sind, sollten die über diese Liste bescheid wissen, so dass wenn sich etwas ändert, die Komponente sich neu auf dem Bildschirm malen (invalidate).
Was mein Problem ist, wie soll ich den Komponenten (alle Komponenten in allen Formen) bescheid sagen auf eleganter weise, dass sie sich aktualisieren sollten. Jeder Komponenten ist für einen spezifischen Objekt in der Liste verantwortlich...
Ich hoffe jetzt habe ich es richtig hingerkriegt, danke für die Hilfe!

Adam
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 31.07.09 12:58 
Also dein Problem ist:
- der Komponente bescheid geben, die für ein Objekt zuständig ist
- allen Komponenten, unabhängig davon, ob sie zuständig sind, mitzuteilen, dass sich etwas geändert hat?

Beispiel:
ausblenden 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:
Unit unitList;

interface

type TComponentNotifyEvent = procedure(List: TObjectList; Index: Integer) of object;

var ObjList: TObjectList; //Bla blubb
var Events: array of TComponentNotifyEvent;

procedure AddEvent(E: TComponentNotifyEvent);
procedure RemoveEvent(E: TComponentNotifyEvent);

procedure NotifyChange(List: TObjectList; Index: Integer);

{...}

implementation

procedure NotifyChange(List: TObjectList; Index: Integer);
var
    I: Integer;
begin
    For I := Low(Events) To High(Events) do
        Events[I](List, Index);
end;

{...}

end.


Möchtest Du, dass sehr viele unterschiedliche Objekte verwaltet werden, sich aber jede Komponente eintragen kann, wofür es sich interessiert, so würde eine solche Event Liste pro verwaltetem Objekt gehören. Siehe hierzu auch Observer Pattern.

BTW: Du brauchst kein Fullquote, wenn Du dich auf den vorherigen Beitrag direkt beziehst; einzig beim Herausgreifen von Teilaspekten.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Adam_B Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 31.07.09 13:26 
Hallo,

Erstmal vielen Dank für die Antwort, und auch für den Code-snippet.
Ja, mein Problem ist, dass ich den Komponenten die für einen Objekt zuständig sind, mitzuteilen, wenn sich etwas beim Objekt ändert, ohne immer die neuen Daten direkt an den Komponenten mit SendMessage zu senden und durch Forms zu stöbern.
Also spezisicher:
In der Liste werden Daten von Personen gespeichert und auch andere Werte damit im Zusammenhang, und ich habe Komponente die diese Daten auf dem Bildschirm zeigen.
Ich habe also ein MainForm, und verschieden andere Forms (MDI modell), die auch andere Forms anzeigen können, die wiederum mit den selben Datein arbeiten.
Diese "globale" Liste steht dann für alle Forms die diese Komponente verwalten zu verfügung. Die Daten können aber geändert werden, und dann müssen davon die Komponente bescheid wissen, und gemäss reagieren können. Wenn zum Beispiel der Name geändert wird, sollten dann die Komponente sich sofort neu-malen mit den Neuen Namen.

Vielen Dank also, ich werde diesen Modell nachlesen, und danke auch für den Snippet, ich hoffer das hilft mir schon weiter!

Adam
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Fr 31.07.09 16:29 
Ich habe ähnliche Probleme mit mit Notify-Events gelöst, ähnlich wie BenBE das auch beschrieben hat.
Du willst ja imer nur dann Deine Komponenten über eine änderung der Daten informieren, wenn sie auch sichtbar/geladen sind.
Das heisst, wenn Du deine Komponente/Form etc erstellst, kann diese sich bei der hauptliste anmelden mit einem Eventhandler, der aufgerufen wird, wenn sich was ändert. Geht die Form (mit der angemeldeten Komponente), dann muss sie sich natürlich brav abmelden.

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw