![]() |
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. |
Re: Prozedur einer anderen Form aufrufen
... und zusätzlich wird dadurch der Speicher nicht mehr ordentlich freigegeben und das Programm hat ein Speicherleck...
|
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. :? |
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 |
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) |
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:
Wenn es so nicht klappt, dann steckt bei dir ein Problem an ganz anderer Stelle. Die hab ich bis jetzt aber noch nicht gesehen.
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; Gruß oki |
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:
MfG
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; Muetze1 |
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 |
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 22:15 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 by Thomas Breitkreuz