AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi XE7: Frame soll Aktion im Hauptformular auslösen
Thema durchsuchen
Ansicht
Themen-Optionen

XE7: Frame soll Aktion im Hauptformular auslösen

Ein Thema von Kralle · begonnen am 16. Mai 2015 · letzter Beitrag vom 16. Mai 2015
Antwort Antwort
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#1

AW: XE7: Frame soll Aktion im Hauptformular auslösen

  Alt 16. Mai 2015, 16:09
Der Frame bekommt ein Event und schon kann man sich da in der Form dranhängen.

Delphi-Quellcode:
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;
Wenn sich was ändert, dann rufst du einfach DoChange auf.

Alternativ kann man auch Events weiterleiten.
Delphi-Quellcode:
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;
Natürlich kann man auch im OnCreate der Form sich manuell an das Event hängen, aber sowas macht man doch nicht.
TheFrame.TheCheckBox.OnChange := DeinEvent;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: XE7: Frame soll Aktion im Hauptformular auslösen

  Alt 16. Mai 2015, 16:16
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#3

AW: XE7: Frame soll Aktion im Hauptformular auslösen

  Alt 16. Mai 2015, 16:28
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.


[edit]
Warte mal, dein D2010 ist älter.

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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (16. Mai 2015 um 16:33 Uhr)
  Mit Zitat antworten Zitat
Kralle

Registriert seit: 31. Okt 2004
Ort: Bremerhaven
355 Beiträge
 
Delphi XE7 Professional
 
#4

AW: XE7: Frame soll Aktion im Hauptformular auslösen

  Alt 16. Mai 2015, 16:53
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
  • FrameAllgemeinchkCB_Activate_Symbol.Checked
  • chkCB_Activate_Symbol.Checked
  • Checked
probiere.

Gruß Heiko
OS: Windows 10 Professional, Delphi XE7 Pro SP1 +(Mobilpack & FireDAC)

Geändert von Kralle (16. Mai 2015 um 17:17 Uhr) Grund: Ergänzung
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: XE7: Frame soll Aktion im Hauptformular auslösen

  Alt 16. Mai 2015, 18:36
Kinder, Kinder, ihr müsst auch mehr OOP denken
Delphi-Quellcode:
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.
Der Frame selber ist ganz dumm und kann quasi nix:
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (16. Mai 2015 um 18:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#6

AW: XE7: Frame soll Aktion im Hauptformular auslösen

  Alt 16. Mai 2015, 19:17
@Sir Rufo: In deinem D2010 funktioniert das so aber?

Würde mich dann dennoch mal interessieren, warum es bei uns nicht zu selektieren geht.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: XE7: Frame soll Aktion im Hauptformular auslösen

  Alt 16. Mai 2015, 19:23
@Sir Rufo: In deinem D2010 funktioniert das so aber?

Würde mich dann dennoch mal interessieren, warum es bei uns nicht zu selektieren geht.
Kann ich dir so jetzt nicht sagen, aktuell habe ich ein XE8 vor mir

Aber selbst wenn nicht, dann würde ich diesen Event einfach zur Runtime zuweisen per SubFrame1.CheckBox1.OnClick := SubFrame1CheckBox1Click;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (16. Mai 2015 um 19:26 Uhr)
  Mit Zitat antworten Zitat
Kralle

Registriert seit: 31. Okt 2004
Ort: Bremerhaven
355 Beiträge
 
Delphi XE7 Professional
 
#8

AW: XE7: Frame soll Aktion im Hauptformular auslösen

  Alt 16. Mai 2015, 20:40
Hallo Sir Rufo,

Du schreibst das Du die Frames selber "dumm" lässt, aber ist es nicht gerade der Vorteil, das man möglichst viel in den jeweiligen Frames erledigt und nur
das nötigste in der Hauptunit erledigt.
Okay, in meinem Fall gibt es jetzt dadurch ein paar Probleme ...

Gruß Heiko
OS: Windows 10 Professional, Delphi XE7 Pro SP1 +(Mobilpack & FireDAC)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: XE7: Frame soll Aktion im Hauptformular auslösen

  Alt 16. Mai 2015, 21:02
Nein ich lasse die Frames nicht dumm, aber dieser Frame war nicht der Kandidat für mehr Intelligenz.

Du möchtest mehr Intelligenz im Frame, na denn:
Delphi-Quellcode:
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;
    Memo1: TMemo;
    TabSheet2: TTabSheet;
    SubFrame1: TSubFrame;
  private
  protected
    procedure DoShow; override;
  public

  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.DoShow;
begin
  inherited;
  SubFrame1.Control := Memo1;
end;

end.
und der Frame:
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;
    procedure CheckBox1Click( Sender: TObject );
  private
    FControl: TControl;
    procedure SetControl( const Value: TControl );
  protected
    procedure Notification( AComponent: TComponent; Operation: TOperation ); override;
  public
    property Control: TControl read FControl write SetControl;
  end;

implementation

{$R *.dfm}
{ TSubFrame }

procedure TSubFrame.CheckBox1Click( Sender: TObject );
begin
  FControl.Enabled := CheckBox1.Checked;
end;

procedure TSubFrame.Notification( AComponent: TComponent; Operation: TOperation );
begin
  inherited;
  if ( Operation = opRemove ) and ( AComponent = FControl ) then
    SetControl( nil );
end;

procedure TSubFrame.SetControl( const Value: TControl );
begin
  if Assigned( FControl ) then
    FControl.RemoveFreeNotification( Self );

  FControl := Value;

  if Assigned( FControl ) then
  begin
    FControl.FreeNotification( Self );
    CheckBox1.Checked := FControl.Enabled;
  end;

  CheckBox1.Enabled := Assigned( FControl );

end;

end.
Ach ja, macht im Übrigen immer noch das Gleiche allerdings mit einer Spezialisierung (Frame für Controls um die Enabled Eigenschaft zu bearbeiten)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Kralle

Registriert seit: 31. Okt 2004
Ort: Bremerhaven
355 Beiträge
 
Delphi XE7 Professional
 
#10

AW: XE7: Frame soll Aktion im Hauptformular auslösen

  Alt 16. Mai 2015, 21:38
Hallo Sir Rufo,

Also auf diesem Weg habei ch jetzt auch hin bekommen.

Kinder, Kinder, ihr müsst auch mehr OOP denken
Danke.

Gruß Heiko
OS: Windows 10 Professional, Delphi XE7 Pro SP1 +(Mobilpack & FireDAC)
  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 11:07 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