Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi function für mehrere Units? (https://www.delphipraxis.net/109555-function-fuer-mehrere-units.html)

Borschti 3. Mär 2008 14:56


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

Nuclear-Ping 3. Mär 2008 15:00

Re: function für mehrere Units?
 
Zitat:

Zitat von Borschti
Problem Nr1.: Wo muss ich die function hinschreiben damit ich sie in einer anderen Unit aufrufen kann?

Da wo sie gesehen wird?

Zitat:

Zitat von Borschti
Problem Nr2.: Wie kann ich die function aufrufen? Vielleicht wär ein gutes und Verständliches Tutorial ganz gut ;)

So wie man eine Funktion aufruft? Unit einbinden, Klasse die die Funktion enthält instanzieren, aufrufen?
:wiejetzt:

mkinzler 3. Mär 2008 15:01

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.

Aurelius 3. Mär 2008 15:05

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:
unit
...
uses
...
type
...
   private
   public
     function Test() : bool;
...
implementation

function TMeineForm.Test() : bool;
begin
...
end;
Ansprechen tust du die dann außerhalb des Formulars so:
Delphi-Quellcode:
...
  if MeineForm.test then
...

Borschti 3. Mär 2008 15:16

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

mkinzler 3. Mär 2008 15:19

Re: function für mehrere Units?
 
Hauptformular ist schlecht! Besser weitere Unit.

Nuclear-Ping 3. Mär 2008 15:20

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;

Borschti 3. Mär 2008 15:22

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

Nuclear-Ping 3. Mär 2008 15:26

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:
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;
Wie lange arbeitet ihr schon mit Delphi?

sirius 3. Mär 2008 15:26

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.

Borschti 3. Mär 2008 15:51

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 ?? ^^

Aurelius 3. Mär 2008 15:53

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.

Nuclear-Ping 3. Mär 2008 16:15

Re: function für mehrere Units?
 
Ohne Code zu sehen wird das nix ... Meine Kristallkugel ist grad in der Werkstatt. ;)

Borschti 3. Mär 2008 16:20

Re: function für mehrere Units?
 
okay dann hier mal die code fragmente

Delphi-Quellcode:
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.
Andere Unit

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.

mkinzler 3. Mär 2008 16:32

Re: function für mehrere Units?
 
Ihr solltet vielleicht mal ein paar Grundlagen Tutorials wälzen. :zwinker:

Nuclear-Ping 3. Mär 2008 16:33

Re: function für mehrere Units?
 
Denke ich mir auch grad ... :wall:

taaktaak 3. Mär 2008 16:39

Re: function für mehrere Units?
 
Moin, Moin,

habt ihr wirklich ein Stringgrid mit dem Namen TStringGrid ??????

Zitat:

ProcessGrid (TStringGrid, 1); //<--- Hier tritt der Fehler Auf
Ihr müsst hier den Gridnamen übergeben nicht den Klassennamen...

Nuclear-Ping 3. Mär 2008 16:42

Re: function für mehrere Units?
 
Delphi-Quellcode:
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;
... und warum wird hier wohl ein Grid als Parameter übergeben?

DeddyH 3. Mär 2008 16:46

Re: function für mehrere Units?
 
Delphi-Quellcode:
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;
Siehst Du den Unterschied?

Borschti 4. Mär 2008 08:54

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:
  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;
Andere Unit
Delphi-Quellcode:
  public
     test : String;
/...
procedure TForm13.ColorButton5Click(Sender: TObject);
//Deklaration entfallen
begin

test := Edit5.text;

ProcessGrid(form11.StringGrid1, 2)
end;
Vielleicht könnt ihr uns helfen den String zu übergeben oder vielleicht kennt ihr eine bessere Lösung für unser Problem.

Mit freundlichen Grüßen
Manuel

Aurelius 4. Mär 2008 09:03

Re: function für mehrere Units?
 
Test wird bei euch 3 mal deklariert, obwohl ihr wahrscheinlich nur 1 nutzen wollt.

Borschti 4. Mär 2008 09:52

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

Aurelius 4. Mär 2008 10:04

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

mkinzler 4. Mär 2008 10:06

Re: function für mehrere Units?
 
Auf die Gefahr hin, das ich mich wiederhole
http://www.delphipraxis.net/internal...=853781#853781

sirius 4. Mär 2008 10:36

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:
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
Delphi-Quellcode:
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]

WS1976 4. Mär 2008 12:14

Re: function für mehrere Units?
 
Hallo,
ich bin ja mit mkinzler nicht oft einer Meinung aber hier hat er Recht.

Delphi-Quellcode:
procedure TForm13.ColorButton6Click(Sender: TObject);
begin

ProcessGrid (TStringGrid, 1); //<---  Hier tritt der Fehler Auf
Überlegt mal was Tstringrid ist? Eine Klasse (Klassendefinition Tstringgrid).

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

s-off 4. Mär 2008 12:20

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]

sirius 4. Mär 2008 12:24

Re: function für mehrere Units?
 
[OT]

Zitat:

Zitat von s-off
Hallo Rainer,

nur zum Verständnis; warum antwortest Du auf etwas, was bereits seit einem dreiviertel Tag geklärt ist? :zwinker:

Weil da vielleicht der Seitenumbruch kam :mrgreen: Passiert mir auch gelegentlich.
[/OT]

Nuclear-Ping 4. Mär 2008 13:10

Re: function für mehrere Units?
 
[OT]
Zitat:

Zitat von sirius
[OT]

Zitat:

Zitat von s-off
Hallo Rainer,

nur zum Verständnis; warum antwortest Du auf etwas, was bereits seit einem dreiviertel Tag geklärt ist? :zwinker:

Weil da vielleicht der Seitenumbruch kam :mrgreen: Passiert mir auch gelegentlich.
[/OT]

Yup, vorallem weil du auf der Seite hier fast nochmal genau das gleiche - nur etwas mehr aufgeblasen - als Beispiel vorgibst, was ich auf der vorigen Seite gestern schon tat, nur ziemlich abgespeckt: http://www.delphipraxis.net/internal...=853740#853740
[/OT]

sirius 4. Mär 2008 13:23

Re: function für mehrere Units?
 
Zitat:

Zitat von Nuclear-Ping
Yup, vorallem weil du auf der Seite hier fast nochmal genau das gleiche -

Nö, mein Konzept ist anders.
Es ist mehr OOP und vor allem beachtet es besonders diese Forderung:
Zitat:

Zitat von Borschti
bei einem Klick auf einen Button(z.B. +1 Zeile), 4 StringGrids auf 4 verschiedenen Formularen zu verändern


WS1976 4. Mär 2008 13:35

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

sirius 4. Mär 2008 13:36

Re: function für mehrere Units?
 
Zitat:

Zitat von WS1976
Hi sirius,

sorry aber vielleicht ist das das Alter. Ich war der Meinung topaktuell zu sein.
"Leise rieselt der Kalk......."

Grüsse
Rainer

Macht nix, wir kommen alle mal dahin.

Übrgiens: Es hat dich s-off "kritisiert" :mrgreen:

Nuclear-Ping 4. Mär 2008 13:47

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