Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Form in TabControl darstellen
Bergmann89 - Di 26.04.11 19:53
Titel: Form in TabControl darstellen
Hey,
ich schrieb zur Zeit an einem Editor, bei dem der User mehere Fenster hat, in denen er am Code arbeiten kann. Da das ganze schnell unübersichtlich werden kann wollte ich dem User die Möglichkeit geben die Fenster in ein TabControl abzulegen. Jedoch wird der Inhalt des Fensters nicht richtig gezeichnet. Kleines Bsp.: Der User stellt alle Fenster im TabControl dar. Das aktuelle Fenster wird normal gezeichnet. Wenn man jetzt auf einen anderen Tab switched ist der leer. Wenn man wieder zurück zum alten und nochmal zum neuen switched ist der Inhalt auf einmal drin?!
Hier mal die Methode die ich zum Andocken nehme:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure DockForm(Form: TForm; NewParent: TWinControl; var PosValue: TFormPosValues); begin if Form.Parent = nil then begin SaveFormPos(Form, PosValue); Form.BorderStyle := bsNone; Form.Parent := NewParent; Form.Align := alClient; Form.Visible := True; end; end; |
das TabControl ist zum Zeitpunkt, an dem die Formulare eingebunden werden noch Invisible. Ich habs auch schon andersrum probiert, aber das hat auch nix gebracht. Weiß jmd von euch was ich da falsch mach?
MfG Bergmann.
Bergmann89 - Do 28.04.11 12:31
Hey,
hat keiner ne Idee was da schief läuft? Oder hab ich das Problem nicht ausführlich genug beschrieben?
MfG Bergmann.
bummi - Do 28.04.11 13:21
Hast Du einen Fetzen Code?
Wir arbeiten fast nur mit gedockten Forms, was Du schiefläuft bei Dir ist mir noch nicht ganz klar...
Bergmann89 - Do 28.04.11 13:57
Hey,
hier ist die Methode, die das Fensterverhalten neu festlegt:
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: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110:
| procedure TMainForm.SetEditorView(EditorView: TEditorView);
procedure DockForm(Form: TForm; NewParent: TWinControl; var PosValue: TFormPosValues); begin if Form.Parent = nil then begin SaveFormPos(Form, PosValue); Form.BorderStyle := bsNone; Form.Parent := NewParent; Form.Align := alClient; Form.Visible := True; end; end;
function UndockForm(Form: TForm): Boolean; begin result := Form.Parent <> nil; if result then begin Form.Visible := False; Form.Align := alNone; Form.Parent := nil; Form.BorderStyle := bsSizeable; end; end;
var tmpTop: Integer; begin if EditorView <> fSettings.EditorView then begin fSettings.EditorView := EditorView; case fSettings.EditorView of evEachInOwnForm: begin EachInOwnFormItem.Checked := True; if UndockForm(VertexShaderEditorForm) then LoadFormPos(VertexShaderEditorForm, fSettings.VertexForm); if UndockForm(FragmentShaderEditorForm) then LoadFormPos(FragmentShaderEditorForm, fSettings.FragmentForm); if UndockForm(GeometryShaderEditorForm) then LoadFormPos(GeometryShaderEditorForm, fSettings.GeometryForm);
EditorsForm.Visible := False; EditorsFormPanel.Visible := False;
if fSettings.ActiveMainForm <> mfSmall then begin SaveFormPos(MainForm, fSettings.BigMainForm); LoadFormPos(MainForm, fSettings.SmallMainForm); fSettings.ActiveMainForm := mfSmall; MainForm.Constraints.MinHeight := 99; MainForm.Constraints.MaxHeight := 99; end; end; evAllInOwnForm: begin AllInOwnFormItem.Checked := True; if UndockForm(EditorsForm) then begin LoadFormPos(EditorsForm, fSettings.EditorsForm); EditorsForm.Constraints.MinHeight := 350; EditorsForm.Constraints.MinWidth := 400; end;
DockForm(VertexShaderEditorForm , EditorsForm.PageControl.Pages[0], fSettings.VertexForm); DockForm(FragmentShaderEditorForm, EditorsForm.PageControl.Pages[1], fSettings.FragmentForm); DockForm(GeometryShaderEditorForm, EditorsForm.PageControl.Pages[2], fSettings.GeometryForm);
EditorsForm.Visible := True; EditorsFormPanel.Visible := False;
if fSettings.ActiveMainForm <> mfSmall then begin SaveFormPos(MainForm, fSettings.BigMainForm); LoadFormPos(MainForm, fSettings.SmallMainForm); fSettings.ActiveMainForm := mfSmall; MainForm.Constraints.MinHeight := 99; MainForm.Constraints.MaxHeight := 99; end; end; evAllInMainForm: begin AllInMainFormItem.Checked := True; DockForm(EditorsForm , EditorsFormPanel , fSettings.EditorsForm); DockForm(VertexShaderEditorForm , EditorsForm.PageControl.Pages[0], fSettings.VertexForm); DockForm(FragmentShaderEditorForm, EditorsForm.PageControl.Pages[1], fSettings.FragmentForm); DockForm(GeometryShaderEditorForm, EditorsForm.PageControl.Pages[2], fSettings.GeometryForm);
EditorsForm.Constraints.MinHeight := 0; EditorsForm.Constraints.MinWidth := 0; if fSettings.ActiveMainForm <> mfBig then begin SaveFormPos(MainForm, fSettings.SmallMainForm); MainForm.Constraints.MinHeight := 300; MainForm.Constraints.MaxHeight := 0; LoadFormPos(MainForm, fSettings.BigMainForm); fSettings.ActiveMainForm := mfBig; end;
EditorsFormPanel.Visible := True; tmpTop := EditorsFormPanel.Top; EditorsFormPanel.Align := alClient; EditorsFormPanel.Align := alNone; EditorsFormPanel.Anchors := [akLeft,akTop,akRight,akBottom]; EditorsFormPanel.Top := tmpTop; EditorsFormPanel.Height := EditorsFormPanel.Height - tmpTop;
EditorsForm.Visible := True; end; end; end; end; |
Im Anhang ist mal die Exe, das man sich das Verhalten nochmal genau angucken kann (lässt sich halt doof beschreiben). Einfach über das Menü --> Ansicht --> Verhalten der Editorfenster und dann zwischen "Jeder Editor im eigenen Fester" und einem der anderen beiden hin und her switchen.
Wenn ich die letzte Zeile der Methode auskommentiere (siehe oben), dann wird die EditorsForm, welche auch das TabControl enthält nicht auf dem Panel dargestellt, wenn man "Alle Editoren im Hauptfenster" wählt. Eigentlich ist Visible zu dem Zeitpunkt schon auf True gesetzt. Ich hab nur beim probieren gemerkt, das der Fehler weg ist, wenn ich die Zeile einfüge. Aber das ist auch mehr rumgedoktor an dem Fehler, als die Ursache zu beheben...
MfG Bergmann.
jaenicke - So 01.05.11 11:03
Das Problem wird vermutlich sein, dass beim Einfügen noch etwas unsichtbar ist oder ähnliches.
Was ich mich aber frage: Warum benutzt du nicht einfach echtes Docking? Dann kann der Benutzer die Fenster einfach ziehen, das würde ich sehr viel intuitiver finden. :gruebel:
Das ist auch sehr einfach, du kannst dir einfach das Beispiel von Delphi anschauen, das findest du in den Demos unter ich glaube Delphi\Docking\DockEx.dproj oder sowas.
Bergmann89 - So 01.05.11 20:24
Hey,
danke für den Tipp, das kannte ich bis jetzt nocht nicht. Nachteil an der ganzen Sache ist, das es unter Windows 7 nicht richtig funktioniert. Der Rahmen, der beim verschieben der Fenster angezeigt wird ruckelt. So ähnlich wie wenn man kein Grafiktreiber drauf hat.
MfG Bergmann.
jaenicke - So 01.05.11 20:30
Bergmann89 hat folgendes geschrieben : |
| Der Rahmen, der beim verschieben der Fenster angezeigt wird ruckelt. |
Ich glaube das wird dort selbst gezeichnet, oder?
Und selbst wenn nicht:
Besser überhaupt so als gar nicht, oder? :zwinker:
Bergmann89 - So 01.05.11 23:13
kp wie das gezeichnet wird hat noch keine Ziet mir das genauer anzusehen. Un bei mir gehts ja auch, aber eben nich ganz. Wenn ich jetzt beides nehmen könnte was nur halb geht un zu einem zusammen bau was zu 100% geht, dann bin ich zufrieden :mrgreen:
MfG Bergmann
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!