Ahnung haben hier ne ganze Menge (zu diesem Problem). Aber genausoviele Varianten der Umsetzung würdest du hier finden. Welche für dich am besten ist, kann man von außen nicht wirklich entscheiden. Das hängt von vielen Faktoren ab:
-aktuelle Struktur des Programmes
-Mögliche Erweiterungen dieses Programmteiles
-persönliche Präferenzen
-...
Deswegen wurden hier mehrere Lösungswege angegeben. Ich versuche mal (mkinzlers +) meinen Vorschlag auszumalen.
Du legst eine extra
Unit an:
Delphi-Quellcode:
Unit StringGridNotify;
interface
uses {...,} Grids, Contnrs;
type TStringGridEvent=class
constructor Create;
destructor Destroy;
override;
private
FStringGrids:TObjectList;
public
procedure AddStringGrid(aStringGrid:TStringGrid);
procedure DeleteStringGrid(aStringGrid:TStringGrid);
procedure Clear;
//man könnte auch FStringGrids als property rauslegen...
//und dabei TObjectList vorher noch ableiten
procedure ChangeTitle(aCol:integer;
const aTitle:
string);
//weitere Ereignisse
end;
//hier mal als globale Variable (eine von vielen Varianten);
//Besser könnte es noch sein, die globale Variable zu vermeiden.
//Aber ich kenne die restliche Programmstruktur nicht.
var StringGridEvent:TStringGridEvent;
implementation
constructor TStringGridEvent.Create;
//Liste für alle StringGrids anlegen
begin
inherited;
//besser is
FStringGrids:=TObjectList.Create;
FStringGrids.OwnsObjects:=false;
end;
destructor TStringGridEvent.Destroy;
begin
inherited;
FStringGrids.Free;
end;
procedure TStringGridEvent.AddStringGrid(aStringGrid:TStringGrid);
//ein StringGrid "anmelden"
begin
if FStringGrids.IndexOf(aStringGrid)<0
then
FStringGrids.Add(aStringGrid);
//hier evtl. noch die Destroy Methode/Event des Grids umleiten, damit man mitbekommt,
//wenn ein StringGrid gelöscht wird
end;
procedure TStringGridEvent.DeleteStringGrid(aStringGrid:TStringGrid);
//ein StringGrid "abmelden"
var index:integer;
begin
index:=FStringGrids.IndexOf(aStringGrid);
if index>=0
then FStringGrids.Delete(
index);
end;
procedure TStringGridEvent.Clear;
//alle StringGrids "abmelden"
begin
FStringGrids.Clear;
end;
procedure TStringGridEvent.ChangeTitle(aCol:integer;
const aTitle:
string);
//Beispiel für ein Ereignis:
//Es wird in allen angemeldeten StringGrids der Titel von Spalte aCol
//auf den Parameter aTitle geändert
var i:integer;
begin
for i:=0
to FStringGrids.Count-1
do
(FStringGrids.Items[i]
as TStringGrid).Cells[aCol,0]:=aTitle;
end;
//weil wir eine globale Variable verwenden noch die 4 Zeilen
initialization
StringGridEvent:=TStringGridEvent.Create;
finalization
StringGridEvent.Free;
end.
Das ist nur ein Beispiel. Und ich bin mir zu 99% sicher, dass ich je nach Gegebenheit das noch anpassen würde (Stichworte: siehe Kommentare).
So könnte man es in deinem Beispiel erstmal verwenden. Du musst in jeder Formular-
Unit diese
Unit einbinden und beim Erstellen der StringGrids diese mit
StringGridEvent.AddStringGrids(...);
anmelden.
Dann kannst du beispielsweise die Methode StringGridEvent.ChangeTitle aufrufen, und alle StringGrids bekommen entsprechend des Codes einen neuen Titel.
[rote Kästen habe ich gesehen, ich brauchte halt etwas länger zum Tippen]
[Edit1: Korrekturen zur Verbesserung der Lesbarkeit]
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.