Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Mit TreeView Pages vom PageControl wechseln (https://www.delphipraxis.net/164993-mit-treeview-pages-vom-pagecontrol-wechseln.html)

Ykcim 9. Dez 2011 08:53

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:
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;
Maschinen ist das PageControl, auf welchem die TabSheets liegen...
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

DeddyH 9. Dez 2011 08:57

AW: Mit TreeView Pages vom PageControl wechseln
 
Delphi-Quellcode:
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;
Getippt und nicht getestet, Fehler vorbehalten.

Ykcim 9. Dez 2011 09:22

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:
Sheet := Maschinen.FindComponent(Node.Text) as TTabSheet;
die Komponente nicht finden.

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:
Assigned(Sheet)
wird mit FALSE ausgegeben. Hast Du da eine Idee?

Hier der Code, mit dem die Komponenten erstellt werden...
Delphi-Quellcode:
  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);
Vielen Dank

Ykcim

DeddyH 9. Dez 2011 09:26

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?

Ykcim 9. Dez 2011 09:59

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:
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);
TabSheetwechsel: (KLAPPT NICHT)
Delphi-Quellcode:
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;
Ich bin ratlos...

Gruß
Ykcim

Ykcim 9. Dez 2011 10:03

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:
Sheet := Main.PlanungMB1.FindComponent(Node.Text) as TTabSheet;
Vielen vielen Dank!!!

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!

DeddyH 9. Dez 2011 10:05

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]

Furtbichler 9. Dez 2011 10:30

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.

DeddyH 9. Dez 2011 10:40

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.

Bummi 9. Dez 2011 10:44

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 01:10 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz