AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prozedur einer anderen Form aufrufen

Ein Thema von Delphimagnet · begonnen am 28. Sep 2004 · letzter Beitrag vom 28. Sep 2004
Antwort Antwort
Seite 2 von 2     12   
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: Prozedur einer anderen Form aufrufen

  Alt 28. Sep 2004, 13:50
@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.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#12

Re: Prozedur einer anderen Form aufrufen

  Alt 28. Sep 2004, 13:53
... und zusätzlich wird dadurch der Speicher nicht mehr ordentlich freigegeben und das Programm hat ein Speicherleck...
  Mit Zitat antworten Zitat
Delphimagnet

Registriert seit: 16. Sep 2004
16 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Prozedur einer anderen Form aufrufen

  Alt 28. Sep 2004, 14:05
@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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#14

Re: Prozedur einer anderen Form aufrufen

  Alt 28. Sep 2004, 14:12
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
  Mit Zitat antworten Zitat
Delphimagnet

Registriert seit: 16. Sep 2004
16 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: Prozedur einer anderen Form aufrufen

  Alt 28. Sep 2004, 14:21
@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)
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#16

Re: Prozedur einer anderen Form aufrufen

  Alt 28. Sep 2004, 14:49
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#17

Re: Prozedur einer anderen Form aufrufen

  Alt 28. Sep 2004, 14:55
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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#18

Re: Prozedur einer anderen Form aufrufen

  Alt 28. Sep 2004, 15:07
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
  Mit Zitat antworten Zitat
Touchdown

Registriert seit: 17. Feb 2003
227 Beiträge
 
#19

Re: Prozedur einer anderen Form aufrufen

  Alt 28. Sep 2004, 15:37
@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

@Muetze1

Ich hasse with xxx do Quellcodes, ausser man muss diese nie debuggen
function getallfornothing: TGoldesel;
begin
result := TGoldesel.create;
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz