Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Sender soll den Titel des Formulars bestimmen (https://www.delphipraxis.net/128711-sender-soll-den-titel-des-formulars-bestimmen.html)

Thomas F 4. Feb 2009 14:32


Sender soll den Titel des Formulars bestimmen
 
Ich wollte die Caption eines Formulars vom Sender abhängig machen
Ich weiss nicht, warum dieser Code nicht funktioniert

Delphi-Quellcode:
procedure TForm4.FormShow(Sender: TObject);
begin
if Sender = Unit1.Form1.speedbutton9
then Form4.Caption := ' Eintrag ändern';//Unit4

if Sender = Unit1.Form1.Speedbutton11
then Form4.Caption :='Neuer Eintrag';//Unit4
end;
end;
Wenn man den Speedbutton9 drückt, soll das Formular den Titel "Eintrag ändern"haben,
bei Speedbutton11 den Tiel "Neuer Eintrag" haben.
Liegst vielleicht daran, dass die Speedbuttons in einer anderen Unit sind ???

Sherlock 4. Feb 2009 14:35

Re: Sender soll den Titel des Formulars bestimmen
 
Kommt eine Fehlermeldung oder geht er einfach kommentarlos darüber hinweg?

Hast Du Breakpunkte an die stellen gesetzt und das mal schrittweise durchlaufen?

Sherlock

Thomas F 4. Feb 2009 14:42

Re: Sender soll den Titel des Formulars bestimmen
 
Zitat:

Zitat von Sherlock
Kommt eine Fehlermeldung oder geht er einfach kommentarlos darüber hinweg?

Hast Du Breakpunkte an die stellen gesetzt und das mal schrittweise durchlaufen?

Sherlock

Fehlermeldung kommt keine , der geht einfach darüber hinweg,ohne dass er die Caption übernimmt.

Ist da was falsch am Code ????

Ich habs auch schon bei Form4.Create reingeschrieben, ist aber dasselbe

mirage228 4. Feb 2009 14:43

Re: Sender soll den Titel des Formulars bestimmen
 
Wie zeigst Du denn das Formular an?

Evtl. wäre es besser, im OnClick der Speedbuttons den Titel zu setzen:
Delphi-Quellcode:
procedure TForm1.SpeedButton9Click;
begin
  with Form4 do
  begin
    Caption := 'Eintrag ändern';
    Show;
  end;
end;

Thomas F 4. Feb 2009 14:48

Re: Sender soll den Titel des Formulars bestimmen
 
Zitat:

Zitat von mirage228
Wie zeigst Du denn das Formular an?

Evtl. wäre es besser, im OnClick der Speedbuttons den Titel zu setzen:
Delphi-Quellcode:
procedure TForm1.SpeedButton9Click;
begin
  with Form4 do
  begin
    Caption := 'Eintrag ändern';
    Show;
  end;
end;

so.........

Delphi-Quellcode:
procedure TForm1.SpeedButton9Click(Sender: TObject);
begin
Unit4.Form4.Show;
 
end;

nuclearping 4. Feb 2009 14:55

Re: Sender soll den Titel des Formulars bestimmen
 
Und woher weiß Unit4.Form4, dass Form1.SpeedButton9 der "Sender" ist? Den müßtest du schon noch irgendwie übergeben - oder nach dem Unit4.Form4.Show noch Unit4.Form4.FormShow(SpeedButton9) aufrufen.

DeddyH 4. Feb 2009 14:57

Re: Sender soll den Titel des Formulars bestimmen
 
Oder eine Property definieren und vor dem Show setzen.

nahpets 4. Feb 2009 14:58

Re: Sender soll den Titel des Formulars bestimmen
 
Hallo,

Delphi-Quellcode:
procedure TForm4.FormShow(Sender: TObject);
begin
if Sender = Unit1.Form1.speedbutton9 
then Form4.Caption := ' Eintrag ändern';//Unit4 

if Sender = Unit1.Form1.Speedbutton11 
then Form4.Caption :='Neuer Eintrag';//Unit4 
end;
end;

...
  // sieht das in etwa so aus?
  // dann sollte es funktionieren
  Unit4.Form4.FormShow(Unit1.Form1.speedbutton9);

  // Hier tippe ich mal darauf, dass Sender nicht SpeedButton9 ist, sondern eventuell Form1.
procedure TForm1.SpeedButton9Click(Sender: TObject);
begin
  Unit4.Form4.Show;
end;
Was kommt dabei heraus, wenn Du mal ein
Delphi-Quellcode:
ShowMessage(Sender.ClassName);
in Dein FormShow einbaust?

jaenicke 4. Feb 2009 15:02

Re: Sender soll den Titel des Formulars bestimmen
 
Delphi-Quellcode:
procedure TForm4.FormShow(Sender: TObject);
begin
if Sender = Unit1.Form1.speedbutton9 
then Form4.Caption := ' Eintrag ändern';//Unit4 

if Sender = Unit1.Form1.Speedbutton11 
then Form4.Caption :='Neuer Eintrag';//Unit4 
end;
end;
Hier ist Sender immer Form4, es sei denn die Prozedur FormShow wurde manuell mit einem anderen Parameter aufgerufen. Wenn aber beim Anzeigen OnShow ausgelöst wurde, dann ist Sender das Formular selbst.

Wenn du mit dem Button das Formular anzeigst, dann ändere dort doch einfach vorher die Caption.

Thomas F 4. Feb 2009 15:14

Re: Sender soll den Titel des Formulars bestimmen
 
Zitat:

Zitat von nahpets
Hallo,

Delphi-Quellcode:
procedure TForm4.FormShow(Sender: TObject);
begin
if Sender = Unit1.Form1.speedbutton9 
then Form4.Caption := ' Eintrag ändern';//Unit4 

if Sender = Unit1.Form1.Speedbutton11 
then Form4.Caption :='Neuer Eintrag';//Unit4 
end;
end;

...
  // sieht das in etwa so aus?
  // dann sollte es funktionieren
  Unit4.Form4.FormShow(Unit1.Form1.speedbutton9);

  // Hier tippe ich mal darauf, dass Sender nicht SpeedButton9 ist, sondern eventuell Form1.
procedure TForm1.SpeedButton9Click(Sender: TObject);
begin
  Unit4.Form4.Show;
end;
Was kommt dabei heraus, wenn Du mal ein
Delphi-Quellcode:
ShowMessage(Sender.ClassName);
in Dein FormShow einbaust?

Hab ich gemacht

ShowMessage(Sender.ClassName) := TForm4

Delphi-Quellcode:
Unit4.Form4.FormShow(Unit1.Form1.speedbutton9);
Das funktioniert nicht Fehler : zuviele Parameter

taaktaak 4. Feb 2009 15:17

Re: Sender soll den Titel des Formulars bestimmen
 
Sorry, verstehe die ganze weitere Diskussion nicht. Die Lösung wurde mit
Zitat:

wäre es besser, im OnClick der Speedbuttons den Titel zu setzen
doch schon gegeben - oder?!

DeddyH 4. Feb 2009 15:20

Re: Sender soll den Titel des Formulars bestimmen
 
Da man davon ausgehen darf, dass es ja nicht nur um die Caption geht, bin ich nach wie vor der Meinung, eine Property ist hier zielführend (Trennung von Logik und Darstellung).

taaktaak 4. Feb 2009 15:22

Re: Sender soll den Titel des Formulars bestimmen
 
Ja, vermutlich richtig!
Aber der Versuch, den Sender des OnShow() auszuwerten, sollte doch nun "vom Tisch sein"

Thomas F 4. Feb 2009 15:27

Re: Sender soll den Titel des Formulars bestimmen
 
Zitat:

Zitat von taaktaak
Ja, vermutlich richtig!
Aber der Versuch, den Sender des OnShow() auszuwerten, sollte doch nun "vom Tisch sein"

Der Code enthält noch mehr, daher wollte ich das Ganze nicht in das Speedbutton9click oder Speedbutton11click
reinschreiben.
Es gäbe noch die Möglichkeit
Delphi-Quellcode:
procedure TForm1.SpeedButton9Click(Sender: TObject);
begin
Unit4.Form4.Caption:='Eintrag ändern';
  Unit4.Form4.Show;
end;
procedure TForm4.FormShow(Sender: TObject);
begin
if Form4.Caption = 'Eintrag ändern' then ......

if Form4.Caption = 'Neuer Eintrag' then ......
end;

DeddyH 4. Feb 2009 15:28

Re: Sender soll den Titel des Formulars bestimmen
 
Und genau das habe ich in #12 gemeint/befürchtet.

taaktaak 4. Feb 2009 15:29

Re: Sender soll den Titel des Formulars bestimmen
 
Autsch, ja das ist wirklich nicht gut :shock:

//edit: Auch wenn ich gesteinigt werde: MINDESTENS für die Texte Konstanten verwenden!

mirage228 4. Feb 2009 15:32

Re: Sender soll den Titel des Formulars bestimmen
 
Wenn es wirklich mehrere Dinge zu tun gibt, wäre der Weg über Properties oder eine eigene Show-Routine (als "CustomShow(...)") ggf. besser.
Da bietet sich auch eine Enumeration an:

Delphi-Quellcode:
type
  TFormMode = (fmAdd, fmEdit); // oder noch mehr

type
  TForm4 = class(TForm)
// Komponenten
private
  FFormMode: TFormMode;
  procedure SetFormMode(Mode: TFormMode);
public
  property Mode: TFormMode read FFormMode write SetFormMode;
end;
Und dann einfach parametrisiert aufrufen:
Delphi-Quellcode:
  Form4.Mode := fmAdd; // In SetFormMode wird dann die Initialisierung erledigt
  Form4.Show;
  // oder auch mit eigener Show-Routine in Form4:
  Form4.ShowWithMode(fmAdd);
Nur so als Anregung...

Viele Grüße

taaktaak 4. Feb 2009 15:37

Re: Sender soll den Titel des Formulars bestimmen
 
Die zweite Möglichkeit erscheint mir eleganter!

DeddyH 4. Feb 2009 15:40

Re: Sender soll den Titel des Formulars bestimmen
 
Jetzt sind wir da, wo ich hinwollte :zwinker:

nahpets 4. Feb 2009 15:45

Re: Sender soll den Titel des Formulars bestimmen
 
Hallo,

schonmal mit 'ner ActionList gearbeitet?
Eine Action kann man mehreren Buttons, Menüeinträgen... zuordnen und dort im ActionExecute(Sender: TObject) kann man wunderbar in der gewünschten Form den Sender abfragen. Sender ist hier immer das Control, dass die Action ausgelöst hat.
Delphi-Quellcode:
// procedure TForm4.FormShow(Sender: TObject);
procedure TForm4.Action1Execute(Sender: TObject);
begin
  if Sender = Unit1.Form1.speedbutton9 
  then Form4.Caption := ' Eintrag ändern';//Unit4 

  if Sender = Unit1.Form1.Speedbutton11 
  then Form4.Caption :='Neuer Eintrag';//Unit4 

  Form4.Show;
end;

DeddyH 4. Feb 2009 15:46

Re: Sender soll den Titel des Formulars bestimmen
 
Dann hat er aber wieder das Problem, dass er später die Caption abfragt/abfragen muss. Ich bleibe dabei: Property einführen und gut is.

nahpets 4. Feb 2009 15:58

Re: Sender soll den Titel des Formulars bestimmen
 
Hallo DeddyH,
Zitat:

Zitat von DeddyH
Dann hat er aber wieder das Problem, dass er später die Caption abfragt/abfragen muss. Ich bleibe dabei: Property einführen und gut is.

Wieso Caption abfragen?
FormShow wird nicht mehr benötigt, die gesamte für dort geplante Logik, liegt in der Action und die ruft Form4.Show auf.
Und damit ist Sender genau der Schalter, den Du noch zusätzlich einführen möchtest.

DeddyH 4. Feb 2009 16:00

Re: Sender soll den Titel des Formulars bestimmen
 
Ich denke mal einfach, dass der Status (oder wie man das auch nennen möchte) nicht nur im OnShow ausgewertet wird.

Thomas F 4. Feb 2009 16:03

Re: Sender soll den Titel des Formulars bestimmen
 
Zitat:

Zitat von nahpets
Hallo,

schonmal mit 'ner ActionList gearbeitet?
Eine Action kann man mehreren Buttons, Menüeinträgen... zuordnen und dort im ActionExecute(Sender: TObject) kann man wunderbar in der gewünschten Form den Sender abfragen. Sender ist hier immer das Control, dass die Action ausgelöst hat.
Delphi-Quellcode:
// procedure TForm4.FormShow(Sender: TObject);
procedure TForm4.Action1Execute(Sender: TObject);
begin
  if Sender = Unit1.Form1.speedbutton9 
  then Form4.Caption := ' Eintrag ändern';//Unit4 

  if Sender = Unit1.Form1.Speedbutton11 
  then Form4.Caption :='Neuer Eintrag';//Unit4 

  Form4.Show;
end;

Der Code geht nicht, habs ausprobiert
Form4.show muß in Form1.speedbutton9click aufgerufen werden, sonst erscheint nix

wie wärs mit

Delphi-Quellcode:
const Konstante1: string= 'Neuer Eintrag' ;
Konstante2 :string='Eintrag ändern';

procedure TForm1.SpeedButton9Click(Sender: TObject);
begin
Unit4.Form4.Caption:=Konstante2;
  Unit4.Form4.Show;
end;
procedure TForm1.SpeedButton11Click(Sender: TObject);
begin
Unit4.Form4.Caption:=Konstante1;
  Unit4.Form4.Show;
end;

procedure TForm4.FormShow(Sender: TObject);
begin
if Form4.Caption = Konstante1 then ......

if Form4.Caption = Konstante2 then ......
end;

DeddyH 4. Feb 2009 16:05

Re: Sender soll den Titel des Formulars bestimmen
 
Nein :!: Siehe hier: http://www.delphipraxis.net/internal...=997645#997645

Thomas F 4. Feb 2009 16:07

Re: Sender soll den Titel des Formulars bestimmen
 
Funktioniert aber :-D

taaktaak 4. Feb 2009 16:09

Re: Sender soll den Titel des Formulars bestimmen
 
Schon, ist aber wirklich eine schlechte Lösung!

mirage228 4. Feb 2009 16:20

Re: Sender soll den Titel des Formulars bestimmen
 
Zitat:

Zitat von nahpets
Hallo,
Delphi-Quellcode:
// procedure TForm4.FormShow(Sender: TObject);
procedure TForm4.Action1Execute(Sender: TObject);
begin
  if Sender = Unit1.Form1.speedbutton9 
  then Form4.Caption := ' Eintrag ändern';//Unit4 

  if Sender = Unit1.Form1.Speedbutton11 
  then Form4.Caption :='Neuer Eintrag';//Unit4 

  Form4.Show;
end;

Das kann auch nicht gehen, weil der Sender in meisten Fällen die Action selbst ist. Da musst man erst nach TAction() casten und kann dann über die ActionComponent an die gewünschte Komponente (und man müsste auch noch Fälle abfangen, wo die Action von "wo anders" aufgerufen wird...), aber ich würde nichtsdesto trotz die Lösung mit der Property vorziehen.

DeddyH 4. Feb 2009 16:24

Re: Sender soll den Titel des Formulars bestimmen
 
Wenigstens einer, der mich versteht :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 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