AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi SubForms in MainForm - merkwürdiger Effekt
Thema durchsuchen
Ansicht
Themen-Optionen

SubForms in MainForm - merkwürdiger Effekt

Ein Thema von Carsten1234 · begonnen am 3. Aug 2009 · letzter Beitrag vom 3. Aug 2009
Antwort Antwort
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#1

SubForms in MainForm - merkwürdiger Effekt

  Alt 3. Aug 2009, 10:22
Hallo zusammen,

ich habe hier einen Effekt, den ich mir nicht erklären kann:
Auf einem Hauptformular existiert ein TabSheet mit 3 Seiten. Auf jedes TabSheet sollen Subforms kommen, wobei alle SubForms den gleichen Vorfahren haben. Als Quelltext:

Basisformular:
Delphi-Quellcode:
type
  TBaseForm = class(TForm)
  private
    { Private-Deklarationen }
    FSideName : string;
    FPageIdx : integer;
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent; AWinControl: TWinControl;
                       ASideName: string; APageIDX: integer); reintroduce; overload;

    property PageIdx: integer read FPageIdx;
    property SideName: string read FSideName;
  end;

constructor TBaseForm.Create(AOwner: TComponent; AWinControl: TWinControl;
                         ASideName: string; APageIDX: integer);
begin
  inherited Create(AOwner);
  Self.Parent:= AWinControl;
  FSideName:= ASideName;
  FPageIdx:= APageIdx;
end;
Beispiel eines Unterformulars:
Delphi-Quellcode:
  TMySubForm2 = class(TBaseForm)
    Label1: TLabel;
    CheckBox1: TCheckBox;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
    FGridNo : integer;
    FEingangNo: integer;
    CBState : boolean;
    procedure LoadDatas;
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent; AWinControl: TWinControl;
                       ASideName: string; AGridNo: Byte;
                       APageIDX: integer); reintroduce; overload;

    procedure wmSwitchCheckBox(var Msg: TMessage); message wm_SwitchCheckBox;
  end;


constructor TMySubForm2.Create(AOwner: TComponent; AWinControl: TWinControl;
                                  ASideName: string; AGridNo: Byte;
                                  APageIDX: integer);
begin
  inherited Create(AOwner, AWinControl, ASideName, APageIDX);
  FGridNo:= AGridNo;
  FEingangNo:= AGridNo-1;
  CBState:= false;
  outputdebugstring('cbstate set to false');
end;

procedure TMySubForm2.LoadDatas;
begin
  if cbstate then
    outputdebugstring('cbstate = true in loaddatas')
  else
    outputdebugstring('cbstate = false in loaddatas');

  checkbox1.Checked := CBState;
end;

procedure TMySubForm2.wmSwitchCheckBox(var Msg: TMessage);
begin
  if (Msg.Msg = wm_SwitchCheckBox) then
  begin
    Msg.Result:= 1;
    CBState:= Msg.WParam = 1;
    if cbstate then
      outputdebugstring('cbstate = true in message')
    else
      outputdebugstring('cbstate = false in message');
    LoadDatas;
    Edit1.Text:= 'Hallo';
  end;
end;

Hauptformular:
Delphi-Quellcode:
  TForm1 = class(TForm)
  (...)
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MySubForm2:= TMySubForm2.Create(AdvTabSheet2, AdvTabSheet2,
                                 'Seite 2', 2, 0);
  MySubForm2.Show;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(MySubForm2.Handle, wm_SwitchCheckBox, 1, 0);
end;
Das Hauptformular erzeugt also in seiner Create-Methode die Unterformulare und bettet sie auf der entsprechenden Seite des TabSheets ein. Wechsle ich im TabSheet auf die entsprechende Seite, sehe ich das Unterformular und ich kann die dortigen Elemente TCheckBox und TEdit "bearbeiten".
Soweit so gut.
Wie weiter im Hauptformular zu sehen ist, existiert dort ein Button, der beim Klick eine Message an SubForm2 sendet. Diese Message kommt auch definitiv an. ABER: Weder die CheckBox wird gesetzt noch der Text in TEdit.Text, obwohl beide Komponenten definit NICHT nil sind.

Frage: Warum wird da nix gesetzt, wo ist da der Denkfehler?

Dank vorab und Gruß, Carsten
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: SubForms in MainForm - merkwürdiger Effekt

  Alt 3. Aug 2009, 12:11
Wie ist denn WM_SWITCHCHECKBOX deklariert? Möglicherweise gibt es bereits eine WM Botschaft mit der selben ID, die von WndProc verarbeitet wird und somit nicht an deinen Message Handler weitergeleitet wird.

Zitat:
procedure TMySubForm2.wmSwitchCheckBox(var Msg: TMessage);
begin
if (Msg.Msg = wm_SwitchCheckBox) then
Die IF-Anweisung kannst du dir sparen, da bei dem Message Handler sowieso nur die WM_SWITCHCHECKBOX ankommt.


Zitat:
procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(MySubForm2.Handle, wm_SwitchCheckBox, 1, 0);
end;
Könnte man das nicht über Interfaces viel besser lösen?
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#3

Re: SubForms in MainForm - merkwürdiger Effekt

  Alt 3. Aug 2009, 12:49
Zitat von jbg:
Wie ist denn WM_SWITCHCHECKBOX deklariert?
wm_SwitchCheckBox = wm_User +1;
Zitat von jbg:
Könnte man das nicht über Interfaces viel besser lösen?
Es macht keinen Unterschied.

Und das perfide ist:
Mache ich im
Delphi-Quellcode:
procedure TMySubForm2.wmSwitchCheckBox(var Msg: TMessage);
(...)
  Edit1.Text:= 'Hallo';
  outputdebugstring(PAnsiChar('Sendmessage: ' + Edit1.Text));
so kommt tatsächlich 'Hallo' in der Debugausgabe. Nur im Feld steht nix.
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#4

Re: SubForms in MainForm - merkwürdiger Effekt

  Alt 3. Aug 2009, 13:32

MySubForm2 wurde sowohl in MainForm als auch im Projektquelltext erzeugt.

Application.CreateForm(TMySubForm2, MySubForm2);
  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 06:46 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