![]() |
Mit TreeView Pages vom PageControl wechseln
Guten Morgen Zusammen,
ich habe in meinem Programm ein TreeView, der mit Daten aus einer Datenbank heraus erstellt wird. Auf dem Form daneben habe ich ein PageControl angeorndet, dem ich beim Starten des Programmes soviele TabSheets mit StringGrids erzeuge, wie ich Werte in meinem TreeView habe. Bis hierhin klappt alles wunderbar. Jetzt möchte ich zwischen den TabSheets wechseln, indem ich einen Wert (Node) in dem Treeview anwähle. Die TabSheets haben den gleichen Name wie die Werte im TreeView (Text vom Node)... Das habe ich versucht:
Delphi-Quellcode:
Maschinen ist das PageControl, auf welchem die TabSheets liegen...
procedure TPlanungMB.FertigungsbereichMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Node : TTreeNode; begin if Maschinen.FindComponent(Node.Text)<>nil then begin Maschinen.ActivePage.Name:=Node.Text; end; end; Das ist das erste Mal, dass ich mich an dynamisch erzeugten Komponenten versuche und ich hoffe, dass Ihr mir helfen könnt... Vielen Dank Ykcim |
AW: Mit TreeView Pages vom PageControl wechseln
Delphi-Quellcode:
Getippt und nicht getestet, Fehler vorbehalten.
procedure TPlanungMB.FertigungsbereichMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Node : TTreeNode; Sheet: TTabSheet; begin Node := (Sender as TTreeview).GetNodeAt(X, Y); if Assigned(Node) then begin Sheet := Maschinen.FindComponent(Node.Text) as TTabSheet; if Assigned(Sheet) then Maschinen.ActivePage := Sheet; end; end; |
AW: Mit TreeView Pages vom PageControl wechseln
Hallo DeddyH,
vielen Dank für die superschnelle Antwort!!! Ich habe es ausprobiert, aber es scheint so, als würde
Delphi-Quellcode:
die Komponente nicht finden.
Sheet := Maschinen.FindComponent(Node.Text) as TTabSheet;
Ich bin dann hingegangen und habe mir in dem StringGrid, welches auf jedem TabSheet erzeugt wird, immer den Namen des TabSheet ausgeben lassen - der stimmt. Ich gehe also davon aus, dass die Komponente mit dem richtigen Namen an der richtigen Stelle ist, aber aus iegendeinem Grund scheint sie nicht gefunden zu werden.
Delphi-Quellcode:
wird mit FALSE ausgegeben. Hast Du da eine Idee?
Assigned(Sheet)
Hier der Code, mit dem die Komponenten erstellt werden...
Delphi-Quellcode:
Vielen Dank
for I := 0 to Length(Rows1[0]) - 1 do
begin tabsheet:= TTabSheet.Create(self); tabsheet.PageControl:=Main.PlanungMB1.Maschinen; TabSheet.Name:=Rows1[0,I]; //TabSheet.TabVisible:=false; Main.PlanungMB1.Maschinen.ActivePageIndex:=I; DatenGrid:=TStringGrid.Create(Main.PlanungMB1.Maschinen.ActivePage); DatenGrid.Parent:=Main.PlanungMB1.Maschinen.ActivePage; DatenGrid.Name:='Daten'+Rows1[0,I]; DatenGrid.Align:=ALClient; DatenGrid.Visible:=true; DatenGrid.ColCount:=5; DatenGrid.RowCount:=5; DatenGrid.FixedCols:=0; DatenGrid.Cells[0,1]:=TabSheet.Name; end; Main.PlanungMB1.Maschinen.ActivePageIndex:=0; PlanungMBUnit.TreeviewRefresh(Main.PlanungMB1.Fertigungsbereich); Ykcim |
AW: Mit TreeView Pages vom PageControl wechseln
Wie ist es, wenn Du FindComponent in FindControl änderst oder bei Maschinen.FindComponent statt Maschinen die Komponente nimmst, die in obigem Code self entspricht?
|
AW: Mit TreeView Pages vom PageControl wechseln
Beides hat nicht funktioniert. Bei FindControls bekam ich es gar nicht kompiliert. Aber ich denke, dass Du schon die Ursache gefunden hast, denn ich fürchte, dass mich gerade meinen riesiegen BASISLÜCKEN einholen.
Ganz kurz eine Info, wie das Programm aufgebaut ist. Ich habe das Projekt mit einem Form (Main). Auf diesem Form befindet sich ein PageControl mit mehreren unsichtbaren TabSheets. (Davon wird nichts zur Laufzeit erstellt). Auf diesen TabSheets befinden sich Frames, die die unterschiedlichen Programmbereiche darstellen... Als ich für ein Frame die TabSheets und StringGrids zur Laufzeit erstellt habe, habe ich diesen "Vorgang" an das OnShow-Ereignis dem Main-Forms des Projektes gehängt. Ich bezweifel, das (self) korrekt war. Ich habe es jetzt jedenfalls wie folgt geändert, aber es klappt immernoch nicht... Komponenten erzeugen: (KLAPPT)
Delphi-Quellcode:
TabSheetwechsel: (KLAPPT NICHT)
for I := 0 to Length(Rows1[0]) - 1 do
begin tabsheet:= TTabSheet.Create(PlanungMB1); tabsheet.PageControl:=Main.PlanungMB1.Maschinen; TabSheet.Name:=Rows1[0,I]; //TabSheet.TabVisible:=false; Main.PlanungMB1.Maschinen.ActivePageIndex:=I; DatenGrid:=TStringGrid.Create(Main.PlanungMB1.Maschinen.ActivePage); DatenGrid.Parent:=Main.PlanungMB1.Maschinen.ActivePage; DatenGrid.Name:='Daten'+Rows1[0,I]; DatenGrid.Align:=ALClient; DatenGrid.Visible:=true; DatenGrid.ColCount:=5; DatenGrid.RowCount:=5; DatenGrid.FixedCols:=0; DatenGrid.Cells[0,1]:=TabSheet.Name; end; Main.PlanungMB1.Maschinen.ActivePageIndex:=0; PlanungMBUnit.TreeviewRefresh(Main.PlanungMB1.Fertigungsbereich);
Delphi-Quellcode:
Ich bin ratlos...
procedure TPlanungMB.FertigungsbereichMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Node : TTreeNode; Sheet:TTabSheet; begin Node := (Sender as TTreeview).GetNodeAt(X, Y); if Assigned(Node) then begin Sheet := Main.PlanungMB1.Maschinen.FindComponent(Node.Text) as TTabSheet; if Assigned(Sheet) then Maschinen.ActivePage := Sheet; end; end; Gruß Ykcim |
AW: Mit TreeView Pages vom PageControl wechseln
ES FUNKTIONIERT!!!
Ich hatte es nicht genauso gemacht, wie Du empfohlen hattest... So klappt es jetzt
Delphi-Quellcode:
Vielen vielen Dank!!!
Sheet := Main.PlanungMB1.FindComponent(Node.Text) as TTabSheet;
Gruß Ykcim P.S.: Wünsche ich jetzt schon schöne Weihanchten, oder habe ich bis dahin noch eine weitere Frage? Sollten wir uns nicht mehr "begegnen" wünsche ich schon mal ein gesegnetes Weihnachtsfest! |
AW: Mit TreeView Pages vom PageControl wechseln
Man muss eben nur wissen, wer der Owner (bei FindComponent) oder der Parent (bei FindControl) ist ;)
[edit] :oops: Sry, ich wünsche Dir natürlich dasselbe, hatte eben das Post Scriptum übersehen. [/edit] |
AW: Mit TreeView Pages vom PageControl wechseln
Ich mache es immer so:
Jeder Knoten, dem ein Tabsheet zugeordnet ist, bekommt im Inspektor im ImageIndex den Tabindex des Tabsheets. Dann habe ich in der Imagelist zwar häufig die gleiche Bitmap, aber egal. Außerdem hat die FindComponent-Variante den entscheidenden Nachteil, wenn ich meinen Knoten z.B. mit "Dies & Das" beschriften möchte. Ich bezweifle, das FindComponent da jemals etwas finden wird. |
AW: Mit TreeView Pages vom PageControl wechseln
Also wenn, dann würde ich das nicht über einen ImageIndex regeln, sondern über die Data-Eigenschaft der TreeNode, dafür ist die ja da.
|
AW: Mit TreeView Pages vom PageControl wechseln
Wenn man Node.Data nicht anderweitig benötigt kann man hier auch direkt das zugehörige Tabsheet zuweisen.
[edit] schon wieder keine rote Box [/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz