AGB  ·  Datenschutz  ·  Impressum  







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

Modales Form ohne Benutzereingriff schließen

Offene Frage von "novy"
Ein Thema von novy · begonnen am 16. Mai 2005 · letzter Beitrag vom 17. Mai 2005
Antwort Antwort
novy

Registriert seit: 16. Mai 2005
3 Beiträge
 
#1

Modales Form ohne Benutzereingriff schließen

  Alt 16. Mai 2005, 21:28
Hi @all!

Ich hoffe es kann jemand bei folgendem Problem helfen ???

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.

Vielen Dank schon im Voraus für Eure Hilfe !!!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Modales Form ohne Benutzereingriff schließen

  Alt 16. Mai 2005, 21:45
Moin!
  • Im CloseQuery beim CanClose vielleicht ein False angegeben?
  • Weisst du vielleicht ausversehen einem ModalResult einer Komponente diese 1 zu? (Und warum nicht eine besser lesbare Konstante wie mrOk ??)

MfG
Muetze1
  Mit Zitat antworten Zitat
novy

Registriert seit: 16. Mai 2005
3 Beiträge
 
#3

Re: Modales Form ohne Benutzereingriff schließen

  Alt 16. Mai 2005, 21:59
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Modales Form ohne Benutzereingriff schließen

  Alt 16. Mai 2005, 22:35
Moin!

Zitat von novy:
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.
Wieso überschreibst du nicht einfach ShowModal und machst deine Suche vor dem Inherited ShowModal. Wenn du nur einen Treffer hast und somit nix ausgewählt werden muss vom Nutzer, dann sagste direkt, dass ModelResult := MrOk ist - ansonsten rufst du das ShowModal auf.

Pseudocode:
Delphi-Quellcode:
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;
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.

Vor allem ist das sauberer als irgendwelche direkten Zugriffe auf Form1 oder Form2 von der jeweils anderen Form aus.... *grusel*

MfG
Muetze1
  Mit Zitat antworten Zitat
novy

Registriert seit: 16. Mai 2005
3 Beiträge
 
#5

Re: Modales Form ohne Benutzereingriff schließen

  Alt 16. Mai 2005, 23:16
..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!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Modales Form ohne Benutzereingriff schließen

  Alt 17. Mai 2005, 00:03
Moin!

Zitat von novy:
..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)!
Ich hatte noch nichtmal einen LK Informatik!

Zitat von novy:
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?
Ja, habe ich: Das Problem ist, das ich meinen ersten Gedanken doch noch abgeändert hatte bei dem Pseudocode - daher müsste oben das "Override;" noch durch ein "ReIntroduce;" abgeändert werden. Danach musst du in Form1 nur noch beim ShowModal Aufruf eine Variable mit dem Suchbegriff angeben und hast in Form1 nach dem ShowModal den ausgewählten Begriff in dieser Variablen.

MfG
Muetze1
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Modales Form ohne Benutzereingriff schließen

  Alt 17. Mai 2005, 08:40
Zitat von novy:
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.
Ist mir völlig unbegreiflich, warum du zur Ausführung einer Suchfunktion überhaupt Form2 anzeigen musst - und dann noch modal. Oft werden in diesem Forum Fragen zu solchen technischen Problemen gestellt, die nur durch einen falschen Lösungsansatz auftreten können.

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:
  TForm2 = class(TForm)
  public
    function GetInfo(search: string; var info: TInfoRec): boolean;
  end;
An einer geeigneten Stelle deklarierst du noch TInfoRec:

Delphi-Quellcode:
type
  TInfoRec = record
    Info1: string;
    Info2: string;
  end;
Und im implementation Abschnitt deiner Form2 codierst du die Methode GetInfo():

Delphi-Quellcode:
function GetInfo(search: string; var info: TInfoRec): boolean;
begin
  Result := InfoExists(search);
  if Result then begin
    info.Info1 := '';
    info.Info2 := '';
  end;
end;
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.

Je besser deine Problembeschreibung, desto bessere Hilfe kannst du erwarten.

Grüße vom marabu
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Modales Form ohne Benutzereingriff schließen

  Alt 17. Mai 2005, 10:19
Moin!

Zitat von marabu:
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".
Aber gerade der Punkt scheint mir der beste zu sein, um zu unterscheiden: Modal anzeigen oder nicht. Weil wenn nicht, dann hat man sonst wieder Probleme. Deine Funktion müsste dabei dann auch erstmal prüfen ob das Fenster modal angezeigt wird, um es dann zu schliessen.

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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Modales Form ohne Benutzereingriff schließen

  Alt 17. Mai 2005, 10:37
Zitat von Muetze1:
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.
Danke für diesen Hinweis - da habe ich wohl etwas ungenau gelesen - damit ist doch alles glasklar, oder?

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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: Modales Form ohne Benutzereingriff schließen

  Alt 17. Mai 2005, 11:26
Moin!

Zitat von marabu:
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?
Nein, so sollte die Programmierung dem Falle aussehen.

MfG
Muetze1
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:24 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