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 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, 3, 5); 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
Dennys hat folgendes geschrieben : |
| 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)); |
noch ein
Delphi-Quelltext
1: 2:
| compo := TComponent(P.FindComponent(test)); |
Moderiert von
Narses: Beiträge zusammengefasstOh man
ich bin echt zu langsam für euch :-)
das mit dem color versteh ich nicht...
Moderiert von
Narses: Beiträge zusammengefasstHi @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:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!