Autor Beitrag
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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:
ausblenden 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); //speichert die Position des Fensters um es später wiederherstellen zu können
      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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: Do 28.04.11 13:57 
Hey,

hier ist die Methode, die das Fensterverhalten neu festlegt:
ausblenden volle Höhe 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:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//legt das neue Fensterverhalten fest
//@EditorView: neuer Wert für fEditorView;
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
      //alle Editoren in je einem eigenen Fenster
      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;
      //alle Editoren in einem gemeinsamen Fenster
      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;
      //alle Editoren im Hauptfenster
      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; //EditorsForm ist nicht auf EditorsFormPanel sichtbar, wenn diese Zeile fehlt
      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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 01.05.11 20:30 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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/