Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi VirtualTreeView Editfelder, ComboBox und andere (https://www.delphipraxis.net/188689-virtualtreeview-editfelder-combobox-und-andere.html)

Jens Hartmann 2. Apr 2016 14:26

AW: VirtualTreeView Editfelder, ComboBox und andere
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo haentschman,

Danke für den Tip. Das ist auch meine aktuelle Lösung. Zwar nicht so hübsch wie bei Dir, aber siehe hierzu auch den Screenshot.

Ich hätte es halt nur gerne anders gelöst, und dachte, dass das VST das können muss.

Trotzdem danke. Ich denke, ich werde mein Formular ein wenig aufhübschen und es dann so realisieren.

Gruß Jens

haentschman 2. Apr 2016 17:17

AW: VirtualTreeView Editfelder, ComboBox und andere
 
Gern geschehen...8-)
Ich denke, das wichtigste an diesem Konstrukt ist die Unabhängigkeit vom "Parent" darunter. Wie man das dann gestaltet ist die Kür. :P

Jens Hartmann 2. Apr 2016 21:19

AW: VirtualTreeView Editfelder, ComboBox und andere
 
Hallo haentschman,

wie Positionierst Du die Form auf dem VST.

Ich habe das ganze wie folgt versucht, die Position passt aber nicht...

Delphi-Quellcode:
var
  CellRect : TRect;
  Node : PVirtualNode;
begin
...
  CellRect := vst.GetDisplayPosition(Node, Column, false);
  fForm2.Top := CellRect.Top;
  fForm2.Left := CellRect.Left;
  fForm2.ShowModal;
end;

haentschman 3. Apr 2016 06:19

AW: VirtualTreeView Editfelder, ComboBox und andere
 
Moin...:P

aktuell habe ich noch eine TAdvListview drunter. Die Umstellung auf VT steht auf der TodoListe. :wink:

Vieleicht können dir die Brocken ein paar Ansätze liefern. :zwinker:

1. Positionierung Form
Delphi-Quellcode:
class procedure TdTools.SetEditorPositions(ParentListView: TAdvListView; Editor: TForm);
var
  I: Integer;
  CurrentPoint: TPoint;
  CurrentTop: Integer;
begin
  CurrentPoint:= ParentListview.ClientToScreen(Point(30,0)); // 30 = um erste Spalte eingerückt
  CurrentTop:= CurrentPoint.Y + ParentListview.Selected.Top; // beim Listview hat der selektierte Eintrag Top... VT ?
  if (CurrentTop + Editor.Height) > Screen.WorkAreaHeight then // klappt den Editor entweder nach unten oder nach oben wenn er nicht mehr auf den Screen paßt
  begin
    CurrentTop:= (CurrentTop + ParentListview.ItemHeight) - Editor.Height + 4;
  end;
  Editor.Top:= CurrentTop;
  Editor.Left:= CurrentPoint.X;
  Editor.Width:= 0;
  for I := 1 to ParentListView.Columns.Count -1 do
  begin
    Editor.Width:= Editor.Width + ParentListView.Column[I].Width;
  end;
  Editor.Width:= Editor.Width + conEditorOffsetWidth; // Offset = Feinjustierung für Liniendicke des Grids
end;
2. Im constructor bekommt der Editor(Form) den Parent mit:
Delphi-Quellcode:
constructor TfoInlineEditorProfiles.Create(Preferences: TdVAPreferences; Database: IdVA_Database; Profile: TProfile; ParentListview: TAdvListView);
begin
  inherited Create(nil);
  FLogic:= TInlineEditorProfile.Create(Preferences, Database, Profile); // die BL zum Form
  FLogic.OnGetProfileGroups:= DoOnGetProfileGroups;
  FLogic.OnGetParameters:= DoOnGetParameters;
  FLogic.GetData;

  pgrProfileProperties.ActivePageIndex:= 0;
  tvDevices.Width:= FLogic.Preferences.PositionsVA.SplitterEditorProfiles;
  TdTools.SetControlPosition(ParentListview, 1, True, edtProfileNameLong, daLeft); // Positionierung der 1. Reihe auf die Spalten
  TdTools.SetControlPosition(ParentListview, 2, True, cbbProfileGroup, daLeft);
  TdTools.SetControlPosition(ParentListview, 3, True, cbbBatchJob, daLeft);
  TdTools.SetControlPosition(ParentListview, 4, True, cbbVisualType, daLeft);
  TdTools.SetControlPosition(ParentListview, 5, True, cbbActive, daLeft);
  if FLogic.Preferences.PositionsVA.SplitterEditorProfiles > pnlDevices.Width then
  begin
    pnlDevices.Width:= FLogic.Preferences.PositionsVA.SplitterEditorProfiles;
  end
  else
  begin
    FLogic.Preferences.PositionsVA.SplitterEditorProfiles:= pnlDevices.Width;
  end;
end;
3. Positionierung auf Spalten
Delphi-Quellcode:
class procedure TdTools.SetControlPosition(ParentListView: TAdvListView; ColumnIndex: Integer; SetWidth: Boolean; Control: TControl; Align: TdAlign);
var
  I: Integer;
begin
  // Todo: Berücksichtigung wenn Control größer als Column
  Control.Left:= 0;

  for I := 1 to ColumnIndex do
  begin
    if I = 1 then
    begin
      Control.Left:= Control.Left;
    end
    else
    begin
      Control.Left:= Control.Left + ParentListView.Column[I - 1].Width;
    end;
    if (I = ColumnIndex) and not (ColumnIndex = 1) then
    begin
      Control.Left:= Control.Left - 1;
    end;
  end;

  if SetWidth then
  begin
    Control.Width:= ParentListView.Column[ColumnIndex].Width + 1;
    if Control is TAdvSmoothComboBox then
    begin
      TAdvSmoothComboBox(Control).DropDownWidth:= Control.Width;
    end;
  end;

  case Align of
    daLeft: Control.Left:= Control.Left;
    daRight: Control.Left:= Control.Left + (ParentListView.Column[ColumnIndex].Width - Control.Width);
    daCenter: Control.Left:= Control.Left + ((ParentListView.Column[ColumnIndex].Width - Control.Width) div 2);
  end;
end;

Aviator 4. Apr 2016 15:44

AW: VirtualTreeView Editfelder, ComboBox und andere
 
Zitat:

Zitat von Jens Hartmann (Beitrag 1334514)
Hallo haentschman,
Danke für den Tip. Das ist auch meine aktuelle Lösung. Zwar nicht so hübsch wie bei Dir, aber siehe hierzu auch den Screenshot.
Ich hätte es halt nur gerne anders gelöst, und dachte, dass das VST das können muss.
Trotzdem danke. Ich denke, ich werde mein Formular ein wenig aufhübschen und es dann so realisieren.

Schade das du so früh schon "aufgibst". Ich hatte bestimmt zwei Wochen benötigt um mal eine halbwegs funktionierende Lösung zu haben. Und da ging dann noch nix mit unterschiedlichen Editoren für unterschiedliche Spalten. Ich bin leider noch nicht dazu gekommen ein Beispiel zusammen zu basteln was evtl. sogar dokumentiert ist im es besser zu verstehen. Des Weiteren meintest du ja, ich soll mir die Arbeit sparen. Aber wenn trotzdem noch Interesse ab der VST Lösung besteht, dann schau ich mir das mal an.

Jens Hartmann 4. Apr 2016 19:30

AW: VirtualTreeView Editfelder, ComboBox und andere
 
Zitat:

*Zitat von*Jens Hartmann:
Hallo haentschman,
Danke für den Tip. Das ist auch meine aktuelle Lösung. Zwar nicht so hübsch wie bei Dir, aber siehe hierzu auch den Screenshot.
Ich hätte es halt nur gerne anders gelöst, und dachte, dass das VST das können muss.
Trotzdem danke. Ich denke, ich werde mein Formular ein wenig aufhübschen und es dann so realisieren.

Zitat:

*Zitat von*Aviator:
Schade das du so früh schon "aufgibst". Ich hatte bestimmt zwei Wochen benötigt um mal eine halbwegs funktionierende Lösung zu haben. Und da ging dann noch nix mit unterschiedlichen Editoren für unterschiedliche Spalten. Ich bin leider noch nicht dazu gekommen ein Beispiel zusammen zu basteln was evtl. sogar dokumentiert ist im es besser zu verstehen. Des Weiteren meintest du ja, ich soll mir die Arbeit sparen. Aber wenn trotzdem noch Interesse ab der VST Lösung besteht, dann schau ich mir das mal an.

Ich hab doch noch gar nicht aufgegeben. Ich hatte nur meine aktuelle Lösung aufgezeigt. Die existiert ja bereits.
Aber leider bin ich was dass TAB und LEFT/RIGHT Thema angeht noch nicht wirklich weiter.

Jens Hartmann 7. Apr 2016 22:08

AW: VirtualTreeView Editfelder, ComboBox und andere
 
Also so richtig weiter gekommen bin ich bislang noch. Noch jemand einen Vorschlag?

Aviator 8. Apr 2016 18:49

AW: VirtualTreeView Editfelder, ComboBox und andere
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Jens Hartmann (Beitrag 1334978)
Also so richtig weiter gekommen bin ich bislang noch. Noch jemand einen Vorschlag?

Also ich habe da jetzt mal was zusammengebastelt und hoffe, dass es dir weiter hilft. Im Prinzip ist das jetzt ein Konstrukt, dass du für alles immer wieder verwenden könntest wenn du willst. Speziell in diesem Programm habe ich die Funktion mit Pfeiltaste hoch, runter, links und rechts implementiert. Auch Enter führt dazu, dass die nächste Node unterhalb der aktuellen ausgewählt und direkt editiert wird. Die Sache mit der Tab-Taste habe ich nur beim ersten Mal beachtet da dies einfach nur ein(e) Haken/Property beim VirtualStringTree ist (WantsTabs). Sobald diese Property auf True steht, wird allerdings nur eine Message abgefangen und entsprechen "modifiziert". Das könnte man dan dementsprechend in den abgeleiteten Editorklassen einbauen. War ich jetzt aber zu faul zu. :stupid:

Das hier ist die Methode die bewirkt, dass beim Drücken der Tab-Taste die Komponente nicht verlassen wird. Das kann man dann ja analog dazu in seiner eigenen Editorklasse auch machen und stattdessen in die nächste Column springen.
Delphi-Quellcode:
interface
[...]
  procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
[...]
implementation
[...]
procedure TBaseVirtualTree.WMGetDlgCode(var Message: TWMGetDlgCode);

begin
  Message.Result := DLGC_WANTCHARS or DLGC_WANTARROWS;
  if FWantTabs then
    Message.Result := Message.Result or DLGC_WANTTAB;
end;

[...]
So, ich hoffe das du damit was anfangen kannst. Solltest du hierzu noch Fragen haben, dann meld dich einfach nochmal.

Jens Hartmann 9. Apr 2016 20:00

AW: VirtualTreeView Editfelder, ComboBox und andere
 
Hallo Aviator,

ich spiele gerade ein wenig meiner Deiner Version. Das meiste davon habe ich ja bereits auch schon so gelöst. Allerdings bekomme ich z.B. wenn ich auf

Delphi-Quellcode:
ActiveControl

//z.B. wie bei Dir
  if (ActiveControl = vstMain) and (Ord(Key) = VK_TAB) then
    Key := #0;
bekomme ich eine Fehlermeldung.

Die
Delphi-Quellcode:
property ActiveControl;
befindet sich ja in der
Delphi-Quellcode:
vcl.Forms
. Doch auf diese habe ich scheinbar aus meiner eigenen Unit kein Zugriff. Ich habe den Editor in eine eigene Unit gelegt und dort die
Delphi-Quellcode:
vcl.Forms
eingebunden.

jaenicke 9. Apr 2016 21:05

AW: VirtualTreeView Editfelder, ComboBox und andere
 
ActiveControl ist eine Eigenschaft von TForm und funktioniert deshalb auch nur im Kontext des jeweiligen Formulars.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:37 Uhr.
Seite 3 von 5     123 45      

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-2025 by Thomas Breitkreuz