![]() |
Re: function für mehrere Units?
Test wird bei euch 3 mal deklariert, obwohl ihr wahrscheinlich nur 1 nutzen wollt.
|
Re: function für mehrere Units?
keiner eine ahnung ? :cry:
also wir haben uns gedacht das es möglich wäre das aktuelle form zu aktivieren statt form13 zu benutzen nur wissen wir den Befehl dafür nicht vielleicht kennt den ja jemand von euch wir welzen uns grade durch bücher. Was wir erreichen wollen: auf jedem Konfigurationsformular ist das Edit5 feld gleich und dient zum einlesen des spalten namens. Wenn wir nun also diesen String immer aus dem aktuellen Editfeld einlesen fallen viele anweisungen weg |
Re: function für mehrere Units?
Die Frgaber verstehe ich nicht so ganz...
Wenn man von einer anderen Form /unit zugreifen kann man das so machen 1.) procedure-kopf in den Public-abschnitt reinschreiben, z.b. procedure Bla; 2.) vor die procedure im implemnatation-Teil den Klassennamen schreiben, z.b. procedure TForm1.Bla; 3.) die Unit, in der das steht, in den "uses"-Abschnitt der fremden form eingliedern, z.b. uses Uni2 4.) auf die procedure mit Form1.Bla zugreifen |
Re: function für mehrere Units?
|
Re: function für mehrere Units?
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:
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).
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. 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
Delphi-Quellcode:
anmelden.
StringGridEvent.AddStringGrids(...);
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] |
Re: function für mehrere Units?
Hallo,
ich bin ja mit mkinzler nicht oft einer Meinung aber hier hat er Recht.
Delphi-Quellcode:
Überlegt mal was Tstringrid ist? Eine Klasse (Klassendefinition Tstringgrid).
procedure TForm13.ColorButton6Click(Sender: TObject);
begin ProcessGrid (TStringGrid, 1); //<--- Hier tritt der Fehler Auf Ihr übergebt hier einen Klassenbezeichner. ProcessGrid (TStringGrid, 1); //<--- Hier tritt der Fehler Auf Ihr müsst schon das Grid selbst übergeben. Das ist etwa so als wenn du in eine Autowerkstatt gehst und sagst repararier AUTOS. Du musst ihm schon sagen was für ein Auto. So ähnlich muss das aussehen: ProcessGrid (StringGrid1, 1); //<--- Hier tritt der Fehler Auf Grüsse Rainer |
Re: function für mehrere Units?
Hallo Rainer,
[OT] nur zum Verständnis; warum antwortest Du auf etwas, was bereits seit einem dreiviertel Tag geklärt ist? :zwinker: [/OT] |
Re: function für mehrere Units?
[OT]
Zitat:
[/OT] |
Re: function für mehrere Units?
[OT]
Zitat:
![]() [/OT] |
Re: function für mehrere Units?
Zitat:
Es ist mehr OOP und vor allem beachtet es besonders diese Forderung: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz