Autor |
Beitrag |
Quake User
      
Beiträge: 159
|
Verfasst: Di 22.06.10 00:39
Ich muss bei öffnen einer Form (Form.Show) darauf reagieren, von wo der Aufruf kommt. Wie kann ich das ermitteln.
Bspw.: Ich öffne per Mausklick vo nverschiedenen anderen Formularen eine Form (Form.Show) und möchte eine Auswahlliste anzeigen. Diese Auswahllsiet hängt davon ab, von welchem anderen Formular aus die Form geöffnet wurde.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 22.06.10 00:50
Mach eine neue Methode mit einem Parameter von dem du dann Form.Show aufrufst:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TFormX.ShowWithCases(aForm: TForm); begin if (aForm is Form1) then begin Showmessage('Form1 hat aufgerufen'); FormX.Show; end else begin showmessage('Andere Form hat aufgerufen'); FormX.Show; end; end; |
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Quake User 
      
Beiträge: 159
|
Verfasst: Di 22.06.10 01:03
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Das verstehe ich nicht. Ich schreibe bspw. in Form1 bei einem Button Klick: "Form2.Show". Im OnShow Event der Form2 müsste ich dann abfragen, wer das Ereignis Show ausgelöst hat, (Form1 oder Form3), damit ich in Form2 eine angepasste Auswahllsite erstellen kann.
Wo soll ich nun die o.g. Funktion einbauen?
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 22.06.10 05:11
Quake User hat folgendes geschrieben : | Ich schreibe bspw. in Form1 bei einem Button Klick: "Form2.Show". |
Nein, du schreibst in dem Beispiel Form2.ShowWithCases(Self), denn du musst deine neue Prozedur aufrufen. In dieser Prozedur machst du dann die Unterscheidung anhand des übergebenen Formulars.
Ein Fehler ist noch drin, schreib das besser so: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TFormX.ShowWithCases(aForm: TForm); begin if (aForm is Form1) then begin Showmessage('Form1 hat aufgerufen'); Self.Show; end else begin showmessage('Andere Form hat aufgerufen'); Self.Show; end; end; | Denn mit explizit FormX statt des aktuellen Formulars kann es Probleme bei dynamisch erstellten Formularen z.B. geben.
|
|
Quake User 
      
Beiträge: 159
|
Verfasst: Do 09.12.10 03:01
Ich bin nicht sicher, ob ich das Problem genau beschrieben habe:
ich habe eine MainForm und eine KalenderForm. Nun rufe ich aus der MainForm an unterschiedlichen Stellen den Kalender auf. Der Kalender soll dann das gewälte Datum an die MainForm zurückgeben bzw. in die DBEdit Felder der MainForm eintragen.
Dazu müsste doch die KalenderForm "wissen", welche Form und welcher Button sie mit Form.Show aufgerufen hat.
Oder ist das der falsche Ansatz?
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Do 09.12.10 04:42
Ja, weil das eigentlich Verantwortung von der MainForm ist. Am besten ist es du rufst dann eine Methode namens "ShowKalender" auf (siehe unten), die dir dann das ausgewählte Datum zurückliefert. Das Zeug was in der MainForm passiert, schreibst du auch in der MainForm. Die KalenderForm darf nicht mal der MainForm da reinpfuschen, weil es nicht in deren Verantwortung liegt die Daten der MainForm zu ändern.
Delphi-Quelltext 1: 2: 3: 4: 5:
| function KalenderForm.ShowKalender(Sender: TObject): TDate; begin KalenderForm.Show; Result := AusgewaehltesDatum; end; |
und im MainForm
Delphi-Quelltext 1: 2: 3:
| DBEdit1.Text := DateToString(KalenderForm.ShowKalender(Self)); |
Ich hoffe die Funktionsweise ist klar geworden.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Tankard
      

Beiträge: 217
Erhaltene Danke: 96
|
Verfasst: Do 09.12.10 04:49
Ein Datum als String in einer DB zu speichern, ist aber böse und sollte nicht gemacht werden. Gibt nur Probleme wenn man nach Datum sortieren und suchen will.
Für diesen Beitrag haben gedankt: elundril
|
|
Quake User 
      
Beiträge: 159
|
Verfasst: Sa 11.12.10 03:55
Der Ansatz von elundril war das, was ich gesucht habe. So habe ich das jetzt auch implementiert.
Danke an Alle.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Sa 11.12.10 12:01
Für diesen Beitrag haben gedankt: Kha
|
|
Quake User 
      
Beiträge: 159
|
Verfasst: Mo 13.12.10 04:44
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 13.12.10 07:43
Mit Show funktioniert das doch ohnehin nicht, da der Aufruf sofort zurückkehrt.
ShowModal dagegen wartet. Und hat auch einen Rückgabewert, der dir sagt was passiert ist. (Wenn du ihn im Kalender setzt, d.h. z.B. ModalResult des Ok-Buttons setzt.) Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| function TKalenderForm.ShowKalender(Sender: TObject; var SelectedDate: TDate): Boolean; begin Result := Self.ShowModal = mrOk; if Result then SelectedDate := ... end; | Oder du machst es wie die Delphi-Dialoge: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| function TKalenderForm.Execute(Sender: TObject): Boolean; begin Result := Self.ShowModal = mrOk; end;
if MyKalender.Execute(Self) then ...Mykalender.SelectedDate... |
|
|
Quake User 
      
Beiträge: 159
|
Verfasst: Mo 13.12.10 16:22
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 13.12.10 23:47
|
|
Quake User 
      
Beiträge: 159
|
Verfasst: So 02.01.11 15:14
Ich steh bei dem Problem irgendwo auf dem Schlauch. (Das neue Jahr fängt ja gut an)
Ich habe die Datumsselektion jetzt so gebaut: Ich habe im Hauptformular eine Funktion "ShowKalender". Diese Ruft eine Form auf, auf der ein MonthCalendar liegt.
Delphi-Quelltext 1: 2: 3: 4: 5:
| function TFormR.ShowKalender(Sender: TObject): TDate; begin FormKalender.ShowModal; Result:= FormKalender.MonthCalendar1.Date; end; |
Diese rufe ich so auf:
Delphi-Quelltext 1:
| Datum := ShowKalender(Self); |
Im MonthCalendar1 ist immer ein Datum selektiert, sodass dieser auch immer ein Datum zurückliefert auch wenn der Benutzer KEIN Datum auswählt und das Fenster schließt. In diesem Fall möchte ich aber auch KEINE Änderung im Hauptformular.
Wie erfahre ich nun, ob eine Datum selektiert wurde oder nicht? Die Fnuktion ShowKalender sollte doch besser ein True/False zurückgeben. Aber wo lese ich dann das Datum aus?
Dann könnte ich schreiben:
Delphi-Quelltext 1:
| if ShowKalender then Datum := ???; |
|
|
SvenAbeln
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: So 02.01.11 18:22
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function TFormR.ShowKalender(out Date: TDate): boolean; begin Result := FormKalender.ShowModal = mrOk; if Result then Date := FormKalender.MonthCalendar1.Date; end;
if ShowKalender(Datum) then |
|
|
Quake User 
      
Beiträge: 159
|
Verfasst: So 02.01.11 18:41
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 02.01.11 23:02
|
|