| Autor |
Beitrag |
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Di 26.04.11 19:53
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.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
Zuletzt bearbeitet von Bergmann89 am Do 28.04.11 14:13, insgesamt 2-mal bearbeitet
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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...
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Do 28.04.11 13:57
Hey,
hier ist die Methode, die das Fensterverhalten neu festlegt:
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.
Einloggen, um Attachments anzusehen!
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
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 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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? 
|
|
Bergmann89 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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
MfG Bergmann
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 02.05.11 05:49
Naja, das liegt an deiner Delphiversion... in XE ruckelt da nix und es sieht auch gut aus.
Dort gibt es TTransparentDragDockObject, mit dessen Hilfe die Darstellung passiert. Da kannst du auch Bildchen beim Ziehen anzeigen usw.
Hier findest du die aktuelle Demo, ein kurzer Blick zeigte mir jetzt nichts was dagegen spricht, dass diese Demo auch unter Delphi 7 funktioniert:
radstudiodemos.svn.s.../Delphi/VCL/Docking/
|
|
|