01. august 2006 - 14:03Der er
2 kommentarer og 1 løsning
Global yarp - messages
Jeg har en funktion der fjerner/viser et panel. Nedenunder har jeg en TNotebook med et vilkårligt antal sider. Når panelet fjernes/vises skal alle komponenter have besked så de kan tilpasse sig skærmens nye størrelse.
Jeg antager at den rigtigste måde er at lave en message: CM_PANELTOGGLE = $WM_USER + 1;
I de nødvendige TForm- og TFrame-objekter har jeg lavet: procedure AdjustForSpace(var aMessage : TMessage); message CM_PANELTOGGLE;
Når der "toggles" så sender jeg følgende msg:=CM_PANELTOGGLE, WParam:=integer(Mypanel.Visible);
Sådan lige ud ad landevejen, ikke?
Problemet er at alle komponenter skal have chancen for at lytte på CM_PANELTOGGLE. Hvis jeg bruger SendMessage, PostMessage, Perform så retter det sig mod én komponent. Så er der tilsyneladende NotifyControls og (= Broadcast) tilbage, men de går kun ét niveau ned i hierarkiet. da de itererer <form>.Controls listen og når' kun de komponenter der umiddelbart ejes af komponenten.
Hvordan laver jeg det pænt således, at jeg ikke behøver bruge <komponent_x>.Perform(CM_PANELTOGGLE,integer(Mypanel.Visible),0); til alle de komponenter der behøver ændre sig?
Jeg kan selvfølgelig lave en rekursiv procedure der høvler igennem alle komponenter lister, men det føles ikke rigtigt.
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Det er muligt jeg misforstår spørgsmålet,men nedenstående lister da alle componenter i hierarkiet
procedure TForm1.Button1Click(Sender: TObject); var i : integer; begin for i := 0 to form1.ComponentCount - 1 do begin memo1.Lines.Add(form1.Components[i].Name ); end;
end;
Jeg har testet med et Tpanel med en Tscrollbox og i scrollboxen en timage
martinlind: Jeg bruger allerede align og ankre, men når panelet "togles" skal den vilkårlige frame i min TNotebook MÅSKE gøre et andet panel synligt.
stoney: Når jeg prøver følgende kode på mit program:
procedure TFormMain.tmpButtonClick(Sender: TObject); var i : integer; begin tmpListBox.Items.BeginUpdate; try tmpListBox.Items.Clear; tmpListBox.Items.Add('Controls: ' + IntToStr(ControlCount)); for i := 0 to ControlCount - 1 do with Controls[i] do tmpListBox.Items.Add(ClassName + ': ' + Name);
tmpListBox.Items.Add(''); tmpListBox.Items.Add('Components: ' + IntToStr(ComponentCount)); for i := 0 to ComponentCount - 1 do with Components[i] do tmpListBox.Items.Add(ClassName + ': ' + Name); finally tmpListBox.Items.EndUpdate; end; end;
.. så får jeg listet hhv 9 og 1600 komponenter (en grim mainform på +18000 linier). Kører jeg controls/components på TNotebook-komponenten så viser de begge de ti TPage der er på TNotebooken. Det vil sige at de pages der er på en TNotebook ikke er ejet af den, men af mainformen. De kommer altså ikke videre ned i hierarkiet.
Min løsning bliver at lave en løkke der går gennem mainformens Components, fanger TPages og fodrer dem en Broadcast som forhåbentlig kommer til de frames der ligger derpå.
Lukker spørgsmålet
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.