![]() |
function für mehrere Units?
Hallo,
ich bin gerade dabei ein etwas größeres Programm mit vielen Formularen zu erstellen, das klappt auch schonmal soweit ;) Allerdings bin Ich gerade auf ein kleines Problem gestoßen, und zwar versuche Ich bei einem Klick auf einen Button(z.B. +1 Zeile), 4 StringGrids auf 4 verschiedenen Formularen zu verändern. Also das in jedem StringGrid die gleiche Änderung vorgenommen wird. Hierzu versuche Ich gerade eine function zu schreiben das Ich nicht den ganzen Quelltext in jedes OnClick Event packen muss. Problem Nr1.: Wo muss ich die function hinschreiben damit ich sie in einer anderen Unit aufrufen kann? Problem Nr2.: Wie kann ich die function aufrufen? Vielleicht wär ein gutes und Verständliches Tutorial ganz gut ;) Schonmal danke für eure Antworten. mfg Alex |
Re: function für mehrere Units?
Zitat:
Zitat:
:wiejetzt: |
Re: function für mehrere Units?
1.) Am Besten Klasse in weiterer Unit, welche du in die andere einbindest
2.) einfach die Property des Ereignissen mit der Methode verbinden. Das geklickte Element erhälst du als Referenz im Parameter Sender. |
Re: function für mehrere Units?
Ganz einfach:
du muss im public-Bereich deiner Unit die Function definieren und sie dann im implemantation-Teil erstellen:
Delphi-Quellcode:
Ansprechen tust du die dann außerhalb des Formulars so:
unit
... uses ... type ... private public function Test() : bool; ... implementation function TMeineForm.Test() : bool; begin ... end;
Delphi-Quellcode:
...
if MeineForm.test then ... |
Re: function für mehrere Units?
Hallo zusammen,
der Teamkollege meldet sich auch mal zu Wort ;). Also unser Problem ist, dass wir einen Abgleich des Layouts der sich verändernden Tabellen erreichen wollen. Per buttonclick werden so Spalten oder Zeilen hinzugefügt was mit den logisch in verbindung stehenden Tabellen auch geschehen soll. Wir haben 2 verschiedene Anweisung die jeweseils die Spalten um eins erhöhen und sie beschriften das gleiche passiert mit dem Zeilen. In allen Tabellen ist das Layout gleich aber der Inhalt ändert sich (z.B. EK VK). Da wir nicht in jede Unit alles für die anderen Units schreiben wollen, möchten wir eine Funktion im Mainprogramm schaffen, die dann für alle anderen gültig ist. Quasi ist der Klick auf dem spezifischen Formular, die verarbeitung im Mainprogramm und die Ausgabe bzw. der Abgleich findet mit allen in Verbindung stehen Tabellen statt (Es sind vier tabellen). Da die Anzahl an Anweisungen mit jeder weiteren Tabelle Expotential steigt, könnt ihr euch vorstellen das wir das gerne umgehen würden xD. so ^^ hoffe das hilft zum Verständnis weiter. Mit freundlichen Grüßen Manuel |
Re: function für mehrere Units?
Hauptformular ist schlecht! Besser weitere Unit.
|
Re: function für mehrere Units?
Wie wäre es mit einer Funktion, der ihr das StringGrid übergebt?
Delphi-Quellcode:
procedure ProcessGrid (Grid: TStringGrid; ActionId: Integer);
begin case ActionId of 1: AddSomething (Grid); 2: DeleteSomething (Grid); // ... end; end; |
Re: function für mehrere Units?
an Nuclear-Ping
kannst du uns vill genauer erklären wie die Syntax aussieht und wie das von statten geht |
Re: function für mehrere Units?
:wiejetzt:
Delphi-Quellcode:
unit Irgendwas;
interface uses ...; procedure ProcessGrid (Grid: TStringGrid; ActionId: Integer); implementation procedure AddSomething (Grid: TStringGrid); begin // ... end; procedure ProcessGrid (Grid: TStringGrid; ActionId: Integer); begin case ActionId of 1: AddSomething (Grid); 2: DeleteSomething (Grid); // ... end; end; end.
Delphi-Quellcode:
Wie lange arbeitet ihr schon mit Delphi?
unit Unit1;
interface uses ...; type TForm1 = class(TForm) // ... procedure Button1Click (Sender: TObject); private // ... public // ... end; var // ... implementation uses Irgendwas; {$R *.dfm} procedure TForm1.Button1Click (Sender: TObject); begin ProcessGrid (StringGrid1, 1); end; |
Re: function für mehrere Units?
Nochmal zur Frage. Habe ich das richtig verstanden?
1. Es ändert sich etwas bei StringGrid1 auf irgendeinem Formular (Es wird z.B. irgendwo draufgeklickt) 2. Daraufhin soll sich z.B. das Design mehrere oder aller StringGrids (inkl. StringGrid1) ändern Wenn das stimmt, dann würde ich mkinzlers Vorschlag hoch halten. |
Re: function für mehrere Units?
Nun teilt der Compiler uns leider mit, dass es einen Fehler mit dem TStringGrid gibt bei diesen Stellen:
procedure ProcessGrid (Grid: TStringGrid ; ActionId: Integer); procedure addmon (Grid: TStringGrid); usw... Woran könnte das leigen Fehlermeldung: Undefinierter Bezeichner: 'TStringGrid' Frage: Woran liegt das, weil es ja eigentlich richtig sein müsste, oder haben wir etwas übersehen ? (EDIT) Das problem ist gelöst. nun folgt das nöchste -.-... Lösung für das erste war das wir die "Grids" nicht unter uses eingetragen hatten nun haben wir im nicht mainprogramm die fehler meldung Inkompatible Typen: 'TStringGrid' und 'Class reference' und was bedeutet das nun und was ist eine Class reference überhaupt ?? ^^ |
Re: function für mehrere Units?
Ihm wird eine benötigte Unit fehlen. Einfach die Delphi-Hilfe aufmachen, TStringgrid suchen. Im Hilfefenster sollte dann zu sehen sein was für eine Unit das benötigt.
|
Re: function für mehrere Units?
Ohne Code zu sehen wird das nix ... Meine Kristallkugel ist grad in der Werkstatt. ;)
|
Re: function für mehrere Units?
okay dann hier mal die code fragmente
Delphi-Quellcode:
Andere Unit
unit Main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, GIFImg, ExtCtrls, Grids; procedure ProcessGrid (Grid: TStringGrid ; ActionId: Integer); type //... private { Private-Deklarationen } public { Public-Deklarationen } end; var Form5: TForm5; implementation uses BList, BListK, Kndst, KndstK, Eink, EinkK, Verk, VerkK, KursT, KursTK; {$R *.dfm} procedure addmon (Grid: TStringGrid); var i : Integer; b : String; begin i := 0; Form4.StringGrid1.RowCount := Form4.StringGrid1.RowCount +1; for i := 1 to Form4.Stringgrid1.rowcount - 1 do begin b := IntToStr(i); Form4.Stringgrid1.Cells[0,i] := (b + '. Monat'); end end; //... procedure ProcessGrid (Grid: TStringGrid ; ActionId: Integer); begin case ActionId of 1: addmon (Grid); //2: adddrug (Grid); //3: killcol (Grid); end; end; end.
Delphi-Quellcode:
unit EinkK; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit8, Grids; type //... var Form13: TForm13; implementation uses Main, BList, BListK, Kndst, KndstK, Eink, Verk, VerkK; {$R *.dfm} procedure TForm13.ColorButton2Click(Sender: TObject); begin ColorDialog1.Execute; Form11.StringGrid1.Color := ColorDialog1.Color; end; procedure TForm13.ColorButton3Click(Sender: TObject); begin form13.close; end; procedure TForm13.ColorButton4Click(Sender: TObject); begin FontDialog1.Execute; Form11.StringGrid1.Font := FontDialog1.Font; end; procedure TForm13.ColorButton6Click(Sender: TObject); begin ProcessGrid (TStringGrid, 1); //<--- Hier tritt der Fehler Auf end; end. |
Re: function für mehrere Units?
Ihr solltet vielleicht mal ein paar Grundlagen Tutorials wälzen. :zwinker:
|
Re: function für mehrere Units?
Denke ich mir auch grad ... :wall:
|
Re: function für mehrere Units?
Moin, Moin,
habt ihr wirklich ein Stringgrid mit dem Namen TStringGrid ?????? Zitat:
|
Re: function für mehrere Units?
Delphi-Quellcode:
... und warum wird hier wohl ein Grid als Parameter übergeben?
procedure addmon (Grid: TStringGrid);
var i : Integer; b : String; begin i := 0; Form4.StringGrid1.RowCount := Form4.StringGrid1.RowCount +1; for i := 1 to Form4.Stringgrid1.rowcount - 1 do begin b := IntToStr(i); Form4.Stringgrid1.Cells[0,i] := (b + '. Monat'); end end; |
Re: function für mehrere Units?
Delphi-Quellcode:
Siehst Du den Unterschied?
procedure addmon (const Grid: TStringGrid);
var i : Integer; b : String; begin Grid.RowCount := Grid.RowCount.RowCount +1; for i := Grid.FixedRows to Grid.rowcount - 1 do begin b := IntToStr(i); Grid.Cells[0,i] := (b + '. Monat'); end; end; |
Re: function für mehrere Units?
Hi nochmal :lol:
Wir haben eine Globale Variable test und wollen nun von einem Formular die variable test aus einem Editfeld an die Prozedur im Mainprogramm übergeben. Dieser String dient als Beschriftung für die Spalte EDITIERT !! Unnötige Deklarationen sind jetzt weg Funktioniert auch so weit, aber unsere frage jetzt kann man das direkte zugreifen auf form13 umgehen, sodass die Procedur allgemein gültig ist und von jeder Form angesprochen werden kann Main:
Delphi-Quellcode:
Andere Unit
public
//Deklaration entfallen /... procedure adddrug (Const Grid: TStringGrid); begin // Vorher hier Grid.ColCount := Grid.ColCount + 1; grid.Cells[Grid.ColCount ,0] := form13.test; //Jetzt Hier Grid.ColCount := Grid.ColCount + 1; end; /... procedure ProcessGrid (Grid: TStringGrid ; ActionId: Integer); begin case ActionId of 1: addmon (Grid); 2: adddrug (Grid); //3: killcol (Grid); end; end;
Delphi-Quellcode:
Vielleicht könnt ihr uns helfen den String zu übergeben oder vielleicht kennt ihr eine bessere Lösung für unser Problem.
public
test : String; /... procedure TForm13.ColorButton5Click(Sender: TObject); //Deklaration entfallen begin test := Edit5.text; ProcessGrid(form11.StringGrid1, 2) end; Mit freundlichen Grüßen Manuel |
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:
|
Re: function für mehrere Units?
Hi sirius,
sorry aber vielleicht ist das das Alter. Ich war der Meinung topaktuell zu sein. "Leise rieselt der Kalk......." Grüsse Rainer |
Re: function für mehrere Units?
Zitat:
Übrgiens: Es hat dich s-off "kritisiert" :mrgreen: |
Re: function für mehrere Units?
Trotzdem ist es unterm Strich das gleiche, nur anders formuliert.
Ich bin eigentlich davon ausgegangen, dass die Fragesteller Delphi beherrschen, deswegen sollte das auch nur zur Veranschaulichung dienen und keinen Anspruch auf vollständigkeit haben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 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