![]() |
XE7: Frame soll Aktion im Hauptformular auslösen
Hallo,
ich bin mal wieder total überfordert. Wenn in einem Frame eine CheckBox aktiviert wird, brauche ich auch eine Reaktion im Hauptformular. Einfach eine Variable vom Frame in einem Datenmodul setzten und im OnShow das Haupformulars abfragen klappt nicht. Wie macht man so etwas? Ziel ist es ein Memo sichtbar/unsichtbar zu schalten. Gruß Heiko |
AW: XE7: Frame soll Aktion im Hauptformular auslösen
Man kann über die Parenteigenschaft auf das übergeordnete Formular zugreifen
|
AW: XE7: Frame soll Aktion im Hauptformular auslösen
Du kannst auf die Komponente im Frame oder im Formular reagiern. Einfach im Hauptformular ins Frame gehen, dort die Checkbox und das Ereignis wählen. Es wird dann im Hauptformular behandelt.
Das könnte in etwas so aussehen: als Beispiel Frame2 mit einem Button in Form1 eingebettet. Button1 angeklickt und im Frame2 eine Aktion ausgeführt. Dann in Form1 noch mal auf den Button geklickt und noch mal eine Aktion ausgeführt. In dem Fall werden zwei Aktionen ausgeführt. Wobei man in OnClick der Form1 entscheiden kann ob das OnClick des Frame ebenfalls ausgeführt wird. Frame2:
Delphi-Quellcode:
Form1:
procedure TFrame2.Button1Click(Sender: TObject);
begin ShowMessage('Hallo aus dem Frame'); end;
Delphi-Quellcode:
procedure TForm1.Frame21Button1Click(Sender: TObject);
begin Frame21.Button1Click(Sender); ShowMessage('Hallo aus dem Formular'); end; |
AW: XE7: Frame soll Aktion im Hauptformular auslösen
Der Frame bekommt ein Event und schon kann man sich da in der Form dranhängen. :roll:
Delphi-Quellcode:
Wenn sich was ändert, dann rufst du einfach DoChange auf.
type
TMyFrame = class(TFrame) private //FOnChange: procedure(Sender: TObject) of object; FOnChange: TNotifyEvent; procedure DoChange; published property OnChange: TNotifyEvent read FOnChange write FOnChange; end; procedure TMyFrame.DoChange; begin if Assigned(FOnChange) then FOnChange(Self); end; Alternativ kann man auch Events weiterleiten.
Delphi-Quellcode:
Natürlich kann man auch im OnCreate der Form sich manuell an das Event hängen, aber sowas macht man doch nicht. :roll:
type
TMyFrame = class(TFrame) TheCheckBox: TCheckBox; private function GetOnChange: TNotifyEvent; procedure SetOnChange(Value: TNotifyEvent); published property OnChange: TNotifyEvent read GetOnChange write SetOnChange; end; function TMyFrame.GetOnChange: TNotifyEvent; begin Result := TheCheckBox.OnChange; end; procedure TMyFrame.SetOnChange(Value: TNotifyEvent); begin TheCheckBox.OnChange := Value; end;
Delphi-Quellcode:
TheFrame.TheCheckBox.OnChange := DeinEvent;
|
AW: XE7: Frame soll Aktion im Hauptformular auslösen
Das kann man sich doch komplett im OI zusammenklicken:
Form nehmen, Frame drauf, jetzt ein Doppelklick auf die Checkbox im Frame und den Eventhandler bestücken, fertig. |
AW: XE7: Frame soll Aktion im Hauptformular auslösen
Ich muß nächste Woche mal auf Arbeit ... War mal eben virtuell auf Arbeit.
Hmmmm, seit wann geht das denn? Wir haben im Programm mehrere Frames und die verhalten sich wie eine große Komponente ... nix drinnen ist anklickbar. (XE) Hab auch schnell nochmal nachgesehn, es sind wirklich TFrame-Nachfahren und da ist nichts anklickbar. Aber grade mal schnell im XE8 ausprobiert und es geht wirklich. :gruebel: [edit] Warte mal, dein D2010 ist älter. :shock: Die Frames liegen in Packages, aber ich hätte da jetzt nicht soeine Verhaltensänderung erwartet. [edit2] Es liegt auch nicht an der Formvererbung. In der GrundForm, wo der Frame draufgekommen ist, lässt sich auch nichts selektieren. |
AW: XE7: Frame soll Aktion im Hauptformular auslösen
Moin,
erstmal Danke, für die rege Anteilnahme an meinem Problem. Wenn ich die Antworten so durch lese habe ich den Verdacht, das ich mal wieder irgendwas wichtiges nicht auf geführt habe. Also, ich habe ein Hauptformular auf dem ein PageControl liegt. In dem PageControl liegt das TFrame (jedes Frame ist eine eigene .pas) und auf diesem liegt die Checkbox deren Status ich weiter reichen will. Das Memo das dessen Eigentschaft "visible" ich verändern will liegt auch auf dem Hauptformular. Das heißt ich muß nicht das Ereignis "ButtonClick" weiterreichen, sondern den Status von "Checked". An himitsu: Deine Lösung muß ich erstmal versuchen zu verstehen. An Sir Rufo: Wenn ich das so mache und an den Status von Checked kommen will, meckert die IDE mit roten Wellen egal ob ich
Gruß Heiko |
AW: XE7: Frame soll Aktion im Hauptformular auslösen
Kinder, Kinder, ihr müsst auch mehr OOP denken ;)
Delphi-Quellcode:
Der Frame selber ist ganz dumm und kann quasi nix:
unit Form.Main;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls, Frame.Sub; type TMainForm = class( TForm ) PageControl1: TPageControl; TabSheet1: TTabSheet; // Memo auf den Tab klatschen Memo1: TMemo; TabSheet2: TTabSheet; // SubFrame auf den Tab klatschen SubFrame1: TSubFrame; // Doppelklick auf SubFrame1.CheckBox1 procedure SubFrame1CheckBox1Click( Sender: TObject ); private protected procedure DoShow; override; public end; var MainForm: TMainForm; implementation {$R *.dfm} procedure TMainForm.DoShow; begin inherited; // nur damit der Startwert für die CheckBox passt SubFrame1.CheckBox1.Checked := Memo1.Enabled; end; procedure TMainForm.SubFrame1CheckBox1Click( Sender: TObject ); begin Memo1.Enabled := SubFrame1.CheckBox1.Checked; end; end.
Delphi-Quellcode:
unit Frame.Sub;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TSubFrame = class(TFrame) CheckBox1: TCheckBox; private { Private-Deklarationen } public { Public-Deklarationen } end; implementation {$R *.dfm} end. |
AW: XE7: Frame soll Aktion im Hauptformular auslösen
@Sir Rufo: In deinem D2010 funktioniert das so aber?
Würde mich dann dennoch mal interessieren, warum es bei uns nicht zu selektieren geht. :shock: |
AW: XE7: Frame soll Aktion im Hauptformular auslösen
Zitat:
Aber selbst wenn nicht, dann würde ich diesen Event einfach zur Runtime zuweisen per
Delphi-Quellcode:
SubFrame1.CheckBox1.OnClick := SubFrame1CheckBox1Click;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:08 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