Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#25

Re: function für mehrere Units?

  Alt 4. Mär 2008, 11:36
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.
  Mit Zitat antworten Zitat