![]() |
Modales Form ohne Benutzereingriff schließen
Hi @all!
Ich hoffe es kann jemand bei folgendem Problem helfen ??? :oops: Mein Programm besteht aus zwei Formularen. Der Benutzer gibt in Form1 einen Suchtext ein, der an Form2 übergeben wird. Findet Form2 mit diesem Suchtext einen Eintrag in einer Tabelle, soll das Ergebnis an Form1 zurückgegeben und Form2 geschlossen werden. Mein Problem besteht darin, dass die Suche zwar einwandfrei ausgeführt wird, aber das Form2 weder über Close noch über ModalResult=1 geschlossen werden kann. :gruebel: Vielen Dank schon im Voraus für Eure Hilfe !!! |
Re: Modales Form ohne Benutzereingriff schließen
Moin!
MfG Muetze1 |
Re: Modales Form ohne Benutzereingriff schließen
Hi!
Vielen Dank für die schnelle Antwort! - CanClose war nicht FALSE; explizit auf TRUE setzen bringt aber auch keine Abhilfe! - Den Tipp mit ModalResult=1 habe ich irgendwo beim Suchen gelesen, hat aber nix gebracht - deshalb auch schon wieder gelöscht. Versuche das Fenster immer mit Close bzw. Self.Close zu schliessen. Darf ich in FormActivate den Close-Befehl überhaupt verwenden? Derzeit macht mein Programm folgendes: Form1 schreibt in ein Edit-Feld in Form2 den Suchtext dann Aufruf von Form2.ShowModal FormActivate von Form2 startet mit dem Suchtext im Edit-Feld die Suche in einer ListBox Wenn nur ein Eintrag in der ListBox gefunden wird, sollen die Werte zurück in Edit-Felder in Form1 geschrieben und das Form2 über Close geschlossen werden. MfG Novy |
Re: Modales Form ohne Benutzereingriff schließen
Moin!
Zitat:
Pseudocode:
Delphi-Quellcode:
Dieser Pseudocode will im ShowModal() Aufruf den Suchbegriff und gibt nach der Selektion (wenn mehr als 1 Begriff gefunden wurde der ausgewählte vom Nutzer - ansonsten der einzige gefundene) in der gleichen Variable den ausgewählten Begriff zurück.
Type
... Public Function ShowModal(Var SuchWort: String): TModalResult; Override; End; .... Function ShowModal(Var SuchWort : String): TModalResult; Begin SucheNachWort(SuchWort); If ( ListBox1.Items.Count = 1 ) Then Begin SuchWort := ListBox1.Items[0]; ModalResult := mrOk; End Else Begin Result := Inherited ShowModal; If ( ListBox1.ItemIndex > -1) Then SuchWort := ListBox1.Items[ Listbox1.ItemIndex ]; End; End; Vor allem ist das sauberer als irgendwelche direkten Zugriffe auf Form1 oder Form2 von der jeweils anderen Form aus.... *grusel* MfG Muetze1 |
Re: Modales Form ohne Benutzereingriff schließen
..ich weiss, dass meine Lösung nicht sonderlich elegant ist, aber ich habe das Programmieren nie über den Informatik-Leistungskurs in der Schule hinaus gelernt - lang ist's her (mehr als einfache, "geradeaus programmierte" Projekte sind deshalb leider nicht drin)!
Deshalb habe ich mit Deiner Lösung auch leichte Verständigungsprobleme: Wenn ich Deinen Code in den Quelltext zu meinem Form2 kopiere, erhalte ich die Fehlermeldung "Deklaration von ShowModal unterscheidet sich von der vorherigen Deklaration". Hast Du eine Idee was ich noch anpassen muss? Vielen Dank für Deine Mühe! |
Re: Modales Form ohne Benutzereingriff schließen
Moin!
Zitat:
Zitat:
MfG Muetze1 |
Re: Modales Form ohne Benutzereingriff schließen
Zitat:
Grundsätzlich hat Muetze1 recht, wenn er dir das direkte Manipulieren von Form2 durch Form1 madig macht. Deine Forms sind Objekte und Objekte kommunizieren über Methoden. Wenn du also eine Zeichenkette an Form2 übergeben musst und Form2 als Ergebnis einer Suche mehrere Zeichenketten zurückliefern soll, dann erstellst du im public Abschnitt deiner Form2 eine Funktion. ShowModal() würde ich dazu allerdings nicht überschreiben, weil es semantisch nicht sehr sauber ist. Die Methode sollte etwas über ihren Zweck aussagen und der ist nicht "mach ein Fenster auf und blockiere meine sonstige Arbeit" sondern "sag mir, was du zu diesem Suchwort findest".
Delphi-Quellcode:
An einer geeigneten Stelle deklarierst du noch TInfoRec:
TForm2 = class(TForm)
public function GetInfo(search: string; var info: TInfoRec): boolean; end;
Delphi-Quellcode:
Und im implementation Abschnitt deiner Form2 codierst du die Methode GetInfo():
type
TInfoRec = record Info1: string; Info2: string; end;
Delphi-Quellcode:
Irgendwann, wenn du alles hinbekommen hast, wirst du vielleicht merken, dass dein Ansatz total falsch ist. Forms sind zur Gestaltung der Benutzeroberfläche da. Deine Suchfunktion und deine Daten gehören in eine normale Unit. Die Suche wird ja nur in deiner Form angestossen.
function GetInfo(search: string; var info: TInfoRec): boolean;
begin Result := InfoExists(search); if Result then begin info.Info1 := ''; info.Info2 := ''; end; end; Je besser deine Problembeschreibung, desto bessere Hilfe kannst du erwarten. Grüße vom marabu |
Re: Modales Form ohne Benutzereingriff schließen
Moin!
Zitat:
Ausserdem habe ich es so verstanden, das es nur modal angezeigt werden soll, wenn mehr als 1 Ergebnis gefunden worden ist und somit der Nutzer die Auswahl tätigen soll. Wenn es zu dem Suchbegriff nur einen Treffer gibt, dann diesen Treffer automatisch übernehmen ohne Anzeige des Formulars. Und das mit deiner extra Methode zu lösen würde einen recht grossen Aufwand bedeuten meine ich. Aber du hast natürlich Recht, dass ich die eigentliche Funktion hinter ShowModal erweitere und sie deshalb nicht mehr dem eigentlichen definierten Zweck dient. MfG Muetze1 |
Re: Modales Form ohne Benutzereingriff schließen
Zitat:
novy benutzt Form2 zum Suchen, obwohl Form2 eigentlich nur benötigt wird, wenn das Suchergebnis nicht eindeutig ist. Die Suchfunktion gehört in eine eigene Unit. Liefert die Suche kein eindeutiges Ergebnis, dann kann der Auswahldialog (Form2) modal geöffnet und vom Benutzer wieder geschlossen werden. Oder ist mir da noch was entgangen? marabu |
Re: Modales Form ohne Benutzereingriff schließen
Moin!
Zitat:
MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 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