BroadCast
-
hah... wenn ich in der TMessage-Struktur vor dem Broadcast noch
Msg.Result = 0;
setze, kommen die messages an...
bleibt nur das problem mit dem broadcast und dem fall, dass die komponente auf nem panel liegt, da hilft wahrscheinlich nur, das broadcast selber zu machen und an jede windowproc() aller komponenten der form die message zu schicken...
-
Hi,
@Jansen: das stand irgendwo in der Hilfe oder in der newsgroup...
Erklär mir mal, warum Brodcast auf einmal funktioniert, wenn man Label vom Panel entfernt. Die Objekte empfangen dann die Message. Nimmt man ein Label auf den Parent wieder drauf gehts nicht mehr. Da kann doch was nicht stimmen.
Der Sinn von Brodcast ist, nachrichten an alle Komponenten auf den Objekt zu senden. Das macht er aber nur, wenn kein Label drauf ist. Das kann doch nicht richtig sein.@Sunday: Hast du diese Phänomen auch ?
-
also bei mir machen die labels keine probleme. probiere es mal mit dem Msg.Result = 0;
-
ok, probier ich Montag. Hab gerad Stress...
-
Hi,
bin jetzt erst dazu gekommen, dass zu überprüfen
Brodcast von TWinControl ist so definiert:
procedure TWinControl.Broadcast(var Message); var I: Integer; begin for I := 0 to ControlCount - 1 do begin Controls[I].WindowProc(TMessage(Message)); if TMessage(Message).Result <> 0 then Exit; end; end;
das erklärt einiges.
Wenn man nicht explizit Result auf 0 setzt ist Rsult undefiniert und damit <>0.
-
ja, genau... hab mir daher ne eigene broadcast-funktion geschrieben, bei der auch die komponenten erreicht werden, wenn sie auf einem panel oder in einer groupbox liegen.
//--------------------------------------------------------------------------- // Funktion sendet eine Message an alle, der ParentForm des übergebenen // Steuerelementes, untergeordneten Steuerelemente // -> wenn Message.Result != 0 ist, wird das Versenden abgebrochen //--------------------------------------------------------------------------- void ComponentBroadcast(TControl *Source, TMessage &Message) { TCustomForm *Form = GetParentForm(Source); if (Form && Source) { for (int i = 0; i < Form->ComponentCount; i++) { TControl *Control = dynamic_cast <TControl*> (Form->Components[i]); if (Control) { Control->WindowProc(Message); if (Message.Result != 0) return; } } } }
-
Funktioniert das auch, wenn, wie oben beschrieben, ein Control explizit mit abweichendem Owner erzeugt wird?
TLabel *label = new TLabel(Panel1);
Im ComponentCount von Form1 taucht dieses Label jedenfalls nicht mit auf.
-
hm dafür bräuchte man sicher noch ne zweite schleife über ControlCount der einzelnen Komponenten. hab jeze aber keine zeit zum probieren, denn ich fahre 2 wochen in urlaub...
-
hm, vielleicht besser so, wenn du schon die harte Tour gehst:
void ComponentBroadcast(TWinControl *Source, TMessage &Message) { if (Source) { Source->Broadcast(Message); if (Message.Result != 0) return; for (int i = 0; i < Source->ComponentCount; i++) { TWinControl *WinControl = dynamic_cast <TWinControl*> (Form->Components[i]); if (WinControl) { ComponentBroadcast(WinControl,Message)); if (Message.Result != 0) return; } } } }
Es ist allerding nicht immer erwünscht, die Komponeten auf allen Ebenen (wie Panels GroupBox usw.) anzusprechen .
-
Nachtrag:
...sonst würdest du nur die erste Ebene abdecken, was unter Umständen zu Verwirrung führen kann...