Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - FindComponent geht nicht über das gesamte Formular?


Dennys - Do 23.02.12 10:37
Titel: FindComponent geht nicht über das gesamte Formular?
Hallo zusammen,
ich habe ein kleines Problem und hoffe es kann mir jemand von euch helfen.
Auf einer Form habe ich CategoryPanelGroup.
Dort lege ich dynamisch Panels an. Auf diese Panels kommen noch andere Komponenten (Panel, checkbox und eine OrgChart).

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
var
  P: TCategoryPanel;
  mypanel : tspskinpanel;
  mycheckbox : TspSkinCheckRadioBox;
  neworgchart : TdxOrgChart;
for I := 0 to max - 1 do
    begin
//      Suche die EDV-Systeme
      P := TCategoryPanel.Create(CategoryPanelGroup1);
      P.Parent := CategoryPanelGroup1;
      P.PanelGroup := CategoryPanelGroup1;
      p.Caption := q_software.FieldByName('EDV_System').AsString;
      p.Height := 400;
      p.Name := 'CategoryPanel' + IntToStr(i);
      mypanel := TspSkinPanel.Create(P);
      mypanel.Parent := P;
      mypanel.Width := 230;
      mypanel.Align := alLeft;
      mypanel.SkinData := MainForm.spSkinData1;
      mypanel.Name := 'panel'+ IntToStr(I);

      mycheckbox := TspSkinCheckRadioBox.Create(mypanel);
      mycheckbox.Parent := mypanel;
      mycheckbox.SkinData := MainForm.spSkinData1;
      mycheckbox.Caption := 'Rotate Chart';
      mycheckbox.Visible := TRUE;
      mycheckbox.Show;
      mycheckbox.Name := 'cb' + IntToStr(i);
      mycheckbox.OnClick := checkboxClick;

      neworgchart:= TdxOrgChart.Create(P);
      neworgchart.parent := P;
      neworgchart.Align := alClient;
      neworgchart.Visible := TRUE;
      neworgchart.Name := 'organigramm'+ IntToStr(I);
      neworgchart.OnClick := organigrammClick;
    end;


Jetzt möchte ich über den Namen in CategoryPanelGroup das Organigramm finden.
Meine Idee war das über den Namen zu machen...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
  selectedcheckbox := (Sender as TspSkinCheckRadioBox);
  if selectedcheckbox.Checked = TRUE then
  begin
    test := '';
    test := 'organigramm'+ COPY(selectedcheckbox.Name, 35);
    showmessage(test);
    compo := TComponent(f_test.FindComponent(test));
    if compo <> nil then
    begin
      i := compo.ComponentIndex;
      if Components[i] is TLabel then TLabel(Components[i]).Font.Color := clRed;
      if Components[i] is TEdit then TEdit(Components[i]).Font.Color := clRed;
      if Components[i] is TCheckbox then TCheckbox(Components[i]).Font.Color := clRed;
      if Components[i] is TRadioButton then TRadioButton(Components[i]).Font.Color := clRed
    end
    else
      MessageBeep(0);
  end;


compo ist aber immer nil und ich verstehe nicht warum :-(
Hat jemand von euch eine Idee?
Gruß aus Münster
Dennys


mandras - Do 23.02.12 11:02

Wo kommt denn das f_test her?


Dennys - Do 23.02.12 11:05

f_test ist der Name des Formulars (ist halt ein Testformular :-) )


bummi - Do 23.02.12 11:06

Du erzeugst m,it dem Owner CategoryPanelGroup1, also entweder Owner umstellen oder CategoryPanelGroup1.FindComponent


mandras - Do 23.02.12 11:13

user profile iconDennys hat folgendes geschrieben Zum zitierten Posting springen:
f_test ist der Name des Formulars (ist halt ein Testformular :-) )


Hätt ich wegen des f_ selber drauf kommen können.

Ich denke ich weiß woher die Verwirrung stammt (siehe posting von bummi):

Die Checkboxes die per Code erstellt werden haben als Parent die Panels, also klappt form.findcomponent NICHT.

Erzeugt man in der IDE sowas ist das Formular der Owner, also klappt form.findcomponent


Dennys - Do 23.02.12 11:19

den Owner kann ich doch nicht umstellen weil sonst die Komponenten nicht auf dem CategoryPanel liegen, oder?
Ich hab auch schon das hier versucht...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
    for i := 0 to ControlCount - 1 do
    begin
     if Components[i] is TLabel then
      begin
       Showmessage('TLabel');
      end;
    end;

Bringt aber auch nix :-(
ich finde das irgendwie unlogisch....


mandras - Do 23.02.12 11:27

versuch es mal so:

Delphi-Quelltext
1:
2:
 mycheckbox := TspSkinCheckRadioBox.Create(my_form);
 mycheckbox.parent := my_panel


Dann wird die checkbox Teil der Components der Form, läßt sich dort mittels FindComponent finden.
Angezeigt wird es jedoch im betreffenden Panel.

Edit: das mit den Farben im Quellcode klappte nicht.
Also: Im Constructor der Checkbox das Form angeben, als Parent jedoch das Panel.


Dennys - Do 23.02.12 11:27

sorry mandras, hab dein posting nicht gesehen...
es bringt aber leider weder ein

Delphi-Quelltext
1:
2:
 compo := TComponent(mypanel.FindComponent(test));
 //myPanel ist das Panel auf dem die checkbox platziert ist

noch ein


Delphi-Quelltext
1:
2:
 compo := TComponent(P.FindComponent(test));
 //P ist das CategoryPanel auf alle Komponneten der Kategorie platziert sind


Moderiert von user profile iconNarses: Beiträge zusammengefasst

Oh man
ich bin echt zu langsam für euch :-)
das mit dem color versteh ich nicht...

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Hi @all
das war es:
mycheckbox := TspSkinCheckRadioBox.Create(my_form);

Finde ich zwar immer noch komisch aber es funktioniert :-)
Danke an euch allen
Das ist ein echt gutes Forum hier....
Gruß aus Münster


mandras - Do 23.02.12 11:54

Um die Hierarchie der Komponenten anzeigen zu lassen kannst Du folgendes verwenden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.ShowComponents (C:TComponent);
var i:integer;
begin
 memo1.lines.add (C.Name+' hat folgende Unterkomponenten:');
 for i:=0 to C.componentcount-1 do
  memo1.lines.add (C.components[i].Name);
 for i:=0 to C.componentcount-1 do if C.Components[i].ComponentCount > 0 then
  ShowComponents(C.components[i]);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 Memo1.lines.clear;
 ShowComponents (self);
end;

(ShowComponents noch im Type-Bereich der Form definieren, Memo1 und Button 4 zu Testzwecken aufs Formula packen).

Das mit den Farben in meinem Posting vorher bezog sich darauf daß ich im Quelltext etwas farblich markieren wollte, was aber innerhalb der delphi-Tags nicht ging, daher hab ichs editiert.

Zur Logik von Owner und Parent - warum erhalten Komponenten von der IDE als Parent immer das Formular?
Das Formular mit allen Komponenten wird über das Streaming-System gespeichert.
Soll es aufgebaut werden müssen alle Komponenten in ein vorhandenes Parent gepackt werden. Und davon gibt es während des Einlesens aus dem Stream eben nur das Formular selbst da die Reihenfolge der Unterkomponenten nicht festliegt (eine Checkbox in einem Panel kann auftauchen bevor das Panel eingelesen wurde)
Evtl. gibt es noch mehr Gründe.


Dennys - Do 23.02.12 12:06

Ok,
verstanden und wieder was dazugelernt :-) :beer: :dance2: