Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prozedur einer anderen Form aufrufen (https://www.delphipraxis.net/30706-prozedur-einer-anderen-form-aufrufen.html)

Delphimagnet 28. Sep 2004 11:19


Prozedur einer anderen Form aufrufen
 
Ich ab zwar die Suche benutzt und das Thema auch zwei-, dreimal gefunden, will aber irgendwie nicht richtig funktionieren.

Das Problem ist eigentlich relativ einfach und die Lösung vermutlich auch, aber ich komm nicht drauf.

Ich habe einen Dialog der eine prozedur einer anderen Form aufrufen will, aber er sagt mir dauernd das der Prozedurname ein Undefinierter Bezeichner ist.

Die Form steht in der Usesliste und die Prozedur ist puplic deklariert:

Code:
unit DLG_suchergebniss;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, ExtCtrls, ValEdit, Buttons, ActnList,
  DB, DBTables, DLG_suchergebnissUebernahme;

Code:
public
    { Public-Deklarationen }
    constructor Create(aOwner:Tcomponent);override; //overload
    destructor destroy; override;

    procedure fuelleMitarbeiterDaten(MiaID : integer);
  end;

Aufruf der Prozedur über:

Code:
DLGsuchergebnissUebernahme.fuelleMitarbeiterDaten(MiaID);

alcaeus 28. Sep 2004 11:23

Re: Prozedur einer anderen Form aufrufen
 
Hi DelphiMagnet,

den Aufruf musst du so:
Delphi-Quellcode:
Form1.DeineProzedur
machen.

Greetz
alcaeus

[edit]War wohl zu schnell, das macht er ja :wall: :oops:[/edit]

Delphimagnet 28. Sep 2004 12:01

Re: Prozedur einer anderen Form aufrufen
 
@ alcaeus
Ich hab anfangs auch gedacht das ich vielleicht den falschen Namen meiner Form angebe.

Aber nach ein bisschen ausprobieren hab ich gesehen das die schreibweise schon richtig ist weil er sonst sagt das der Form Name undefiniert ist.

---// edit //---

Auch:
Code:
self.Owner.Owner.fuelleMitarbeiterDaten(MiaID);
...geht nicht. :wink:

Obwohl ja eingentlich:
Code:
showmessage(self.Owner.Owner.Name);
...den richtigen Namen ausgibt. :?

OregonGhost 28. Sep 2004 12:16

Re: Prozedur einer anderen Form aufrufen
 
Zitat:

self.Owner.Owner.fuelleMitarbeiterDaten(MiaID);
Dass das nicht geht, ist ja wohl klar: Owner ist vom Typ TComponent (oder TControl, hab' gerade keine Hilfe zur Hand) und somit ist die Funktion fuelleMitarbeiterDaten nicht enthalten.

Wie heißt denn bei dir das Formular?

Delphimagnet 28. Sep 2004 12:43

Re: Prozedur einer anderen Form aufrufen
 
Name des Formulars:
DLGsuchergebnissUebernahme

Name der Unit:
DLG_suchergebnissUebernahme

Momentaner Aufruf mit der Fehlermeldung:
[Fehler] DLG_suchergebniss.pas(96): Undefinierter Bezeichner: 'fuelleMitarbeiterDaten'
-> DLG_suchergebnissUebernahme.fuelleMitarbeiterDaten (MiaID);

TStringlist 28. Sep 2004 13:04

Re: Prozedur einer anderen Form aufrufen
 
Zitat:

Zitat von Delphimagnet
Momentaner Aufruf mit der Fehlermeldung:
[Fehler] DLG_suchergebniss.pas(96): Undefinierter Bezeichner: 'fuelleMitarbeiterDaten'
-> DLG_suchergebnissUebernahme.fuelleMitarbeiterDaten (MiaID);

Gemäß deiner hier letzten Zeile hättest du dann wohl den Unitnamen anstatt des Namens des Formulars benutzt. (In deinem ersten Post hattest du es allerdings richtig geschrieben).

Delphimagnet 28. Sep 2004 13:12

Re: Prozedur einer anderen Form aufrufen
 
Ich weiss.

Wenn ich den Formnamen verwende:
[Fehler] DLG_suchergebniss.pas(96): Undefinierter Bezeichner: 'DLGsuchergebnissUebernahme'


Und das obwohl:
Code:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, ExtCtrls, ValEdit, Buttons, ActnList,
  DB, DBTables, DLG_suchergebnissUebernahme;
(letzter Eintrag)

:?

TStringlist 28. Sep 2004 13:34

Re: Prozedur einer anderen Form aufrufen
 
Dann zeig doch noch mal kurz den Code wo du den Namen für die Formular-Instanz deklarierst. Wahrscheinlich hast du dich da ja trotzdem irgendwie verschrieben, ...ist bei so langen Namen ja auch durchaus mal möglich. Ansonsten müsste es nämlich schon genau so funktionieren.

Delphimagnet 28. Sep 2004 13:41

Re: Prozedur einer anderen Form aufrufen
 
@TStringlist
Meinst du das:

Delphi-Quellcode:
procedure TMDIvertreterkonto.act_HVSuchenExecute(Sender: TObject);
var
  dlg : TDLGsuchergebnissUebernahme;

Begin
  dlg := TDLGsuchergebnissUebernahme.create(self);
  dlg.Showmodal();
end;
Bevor jemand fragt:
dlg.fuelleMitarbeiterDaten(MiaID); -> [Fehler] DLG_suchergebniss.pas(97): Undefinierter Bezeichner: 'dlg'

gordon freeman 28. Sep 2004 13:43

Re: Prozedur einer anderen Form aufrufen
 
Ich hatte ein ähnliches Problem. Hier ist der Threat zu dem Thema der Threat Ich wollte einfach 'ne Prozedure aus nem anderen Form aufrufen. Hoffe der Threat hilft dir weiter.

read you, gordon

TStringlist 28. Sep 2004 13:50

Re: Prozedur einer anderen Form aufrufen
 
@Delphimagnet

Demgemäß hieße deine fragliche Formularinstanz allerdings nur 'dlg' und nicht etwa 'DLGsuchergebnissUebernahme'.

Außerdem: So wie das da steht existiert dieser Instanzbezeichner auch nur in dieser Procedure (weil es sich hier nämlich bloß um eine lokale Variable handelt), aber bestimmt nicht mehr dort, wo du diese 'fuelleMitarbeiterDaten'-Methode aufrufen willst.

Muetze1 28. Sep 2004 13:53

Re: Prozedur einer anderen Form aufrufen
 
... und zusätzlich wird dadurch der Speicher nicht mehr ordentlich freigegeben und das Programm hat ein Speicherleck...

Delphimagnet 28. Sep 2004 14:05

Re: Prozedur einer anderen Form aufrufen
 
@TStringlist

Zur Struktur:
Es öffnet sich ein Suchergebnissübernahmedialog der beim onload direkt einen Suchendialog öffnet der wenn er ein Ergebniss findet einen Suchergebnissdialog öffnet.
(bescheuerte Struktur soll aber so gemacht werden)


Alle diese Dialoge werden modal geöffnet und beim schliessen wird mittels Action := caFree;
ihr Speicher wieder freigegeben (@Muetze1).

Bei einem Doppleklick auf die gefunden Ergebnisse des Suchergebnissdialogs sollen die Daten in den Suchergebnissübernahmedialog transferiert werden und genau das soll die Prozedur bewerkstelligen, sie muss dabai nur MiaID mitliefern weil diese ID jedem Mitarbeiter einzigartig ist.

Ich hatte anfangs auch gedacht das ich mit dlg.{Funktionsname} meine Funktion aufrufe, allerdings ist dann wieder dlg Undefiniert.

Er scheint nur DLG_suchergebnissUebernahme zukennen.

Ich hab auch grad mal nachgeschaut und mir ist aufgefallen das ich in dieser Form schon einen andere ausgegliedert Funktion aufrufe (mdiMain.set_ErrQueryOpen(QY_ergebnissliste)) die allerdings ohne Beschwerden akzeptiert wird. :?

Muetze1 28. Sep 2004 14:12

Re: Prozedur einer anderen Form aufrufen
 
Moin!

Deine DLG_suchergebnissUebernahme Variable schein die globale Form Instanzenvariable zu sein in der Unit. Da diese Form bestimmt nicht mehr AutoCreateForm ist, solltest du die Instanz in diese Variable ablegen und nicht in eine lokale Variable. So lange du dies nicht tust, sollte in DLG_suchergebnissUebernahme keine Instanz vorhanden sein, sondern nur zufällige Werte bzw. nix ordentliches.

Und wenn DLG_suchergebnissUebernahme wirklich eine Variable vom Typ TDLGsuchergebnissUebernahme ist, dann sollte der Aufruf ohne Probleme funktionieren. Ansonsten such dir mal die Deklaration raus die Delphi nutzt (Rechtsklick auf die Variable und "Deklaration suchen") und schau nach das es wirklich von dem Typ ist bzw es wirklich nicht der UnitName ist...

MfG
Muetze1

Delphimagnet 28. Sep 2004 14:21

Re: Prozedur einer anderen Form aufrufen
 
@Muetze1
Sowas in der Richtung hab ich mir auch so langsam gedacht.
Dadurch das ich alle Dialoge lokal öffnen sind sie ja eigentlich für die anderen nicht ansprechbar. :?

Hmmm... entweder global deklarieren oder einen Umweg über die Hauptform nehmen (MiaID dort ablegen bei dem vorherigen Dialog die MiaID in Main prüfen und gegebenfalls Daten holen)

oki 28. Sep 2004 14:49

Re: Prozedur einer anderen Form aufrufen
 
Hi Delphimagnet,

ich hab das jetzt mal kurz gelesen und komme selber schon mit deinen Bezeichnern und dem was du da machst durcheinande.

Wenn ich solche Sachen machen muß lege ich mir erst mal folgende Grundprinzipien fest um spätere Verwirrung zu vermeiden:

1. Alle modalen Fenster werden global erzeugt und bleiben während der gesamten Programmlaufzeit existent, oder ich erzeuge sie generell lokal und sorge auch lokal für die Freigabe (generell).
Erste Methode hat den Vorteil, dass man sich nicht lokal um die Instanz kümmern muß. Es müssen beim Aufruf immer nur die Initialisierungswerte neutralisiert werden (vom Vorherigen Eintrag bleiben keine Werte bestehen, außer das ist so gewünscht).
Zweite Methode ist dann sinnvoll wenn relativ viel an Werten übergeben werden soll und das bereinigen der Daten zuviel Schreibarbeit kostet. Außerdem weden nicht alle Dialoge zur Startzeit erstellt und man spart somit natürlich Resourcen.

Du scheinst aber offensichtlich die zweite Methode zu bevorzugen. Dann mache ich folgendes:

In der automatisch erzeugten Formular-Unit lösche ich den globalen Var-Eintrag auf das Fenster (aus reiner Sicherheit, falls man doch mal aus reiner Dummheit diese verwenden will).

Der Button zum Schließen des Fensters erhält bei mir nur das ModalResult (z.B. mrOK). Somit wird das Fenster zwar geschlossen, aber die Instanz noch erhalten. Jetzt werte ich modalResult des Fensters aus und reagiere dementsprechend mit der Übernahme von Werten. Danach wird die Instanz mittels Destroy, Free oder FreeAndNil freigegeben. Damit bei Fehlern keine Speicherleiche zurück bleibt kapsel ich alles in einen try finally Block.

So funzt es bei mir schon ewig und ohne Murren.

Codebsp.:
Delphi-Quellcode:
procedure TMDIvertreterkonto.act_HVSuchenExecute(Sender: TObject);
var
  dlg : TDLGsuchergebnissUebernahme;

Begin
  dlg := TDLGsuchergebnissUebernahme.create(self);
  try
    dlg.Showmodal();
    IF DLG.ModalResult = mrcancel then Exit;
    // hier mit DLG machen was du willst
  filally
    dlg.Free;
  end;
end;
Wenn es so nicht klappt, dann steckt bei dir ein Problem an ganz anderer Stelle. Die hab ich bis jetzt aber noch nicht gesehen.

Gruß oki

Muetze1 28. Sep 2004 14:55

Re: Prozedur einer anderen Form aufrufen
 
Moin!

2 Dinge:

1. Der Code: klappt das wirklich so? Weil ich bin mir jetzt überhaupt nicht sicher, ob bei dem Exit der Finally Block überhaupt noch ausgeführt wird? IMHO nämlich nicht -> Folge: Speicherleck.

2. Man kann sich die lokale Variable auch sparen, mit einem With Do Block (wegen 1. ändere ich auch gleich mit ab)

Delphi-Quellcode:
procedure TMDIvertreterkonto.act_HVSuchenExecute(Sender: TObject);
Begin
  With TDLGsuchergebnissUebernahme.create(self) Do
  Begin
    Try
      If ( Showmodal() = mrOk ) Then
      Begin
        // hier mit DLG machen was du willst
      End;
    Finally
      Free;
    End;
  End;
end;
MfG
Muetze1

oki 28. Sep 2004 15:07

Re: Prozedur einer anderen Form aufrufen
 
Hi,

klappt mit Exit!!!

finally end wird immer ausgeführt.

Natürlich kann man sich so wie du sagst die lokale Variable sparen. Irgentwo nur alte Angewohnheit, und man muß immer höllisch aufpassen dass man die Member nicht immer mit eigenen Sachen durcheinander bringt (hab mir dummerweise mal angewöhnt mit Count local als Zählvariable zu arbeiten und dann kann das bei Listen schon mächtig in die Hose gehen. Außerdem ist die schöne Code-Vervollständigung weg).

Gruß oki

Touchdown 28. Sep 2004 15:37

Re: Prozedur einer anderen Form aufrufen
 
@oki

Die Sache mit dem Exit ist nicht wirklich elegant, aber wenn du dir sicher bist, daß es gibt kein Speicherleck gibt ist das auch egal :mrgreen:

@Muetze1

Ich hasse with xxx do Quellcodes, ausser man muss diese nie debuggen :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 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