Avatar billede hrc Mester
01. august 2006 - 14:03 Der 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.
Avatar billede stoney Nybegynder
01. august 2006 - 15:00 #1
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

Altså

Panel--
      --- Scrollbox
                    ----Timage

  Stoney
Avatar billede martinlind Nybegynder
01. august 2006 - 18:13 #2
Kan du ikke bruge anchors og align ?
Avatar billede hrc Mester
02. august 2006 - 09:52 #3
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester