Einzelnen Beitrag anzeigen

Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#48

AW: VirtualTreeView Editfelder, ComboBox und andere

  Alt 1. Nov 2016, 14:28
So....geschafft Nicht schön oder einfach, aber es tut

Wie schon im Post davor, das gewünschte Control erzeugen.

Zusätzlich brauchen wir noch eine Callback-Funktion, die wir beim erzeugen des EditLinks übergeben:

Delphi-Quellcode:
INTERFACE
  :
  Type
     TonBackDirekt = Procedure (sender:TObject;var Key:word;Shift:TShiftState;node:PVirtualNode;Column:TColumnindex) of Object;

      TRepStringEditLink = Class(TInterfacedObject,IVTEditLink)
      PRIVATE
           :
           :
           fCall : TOnBackDirekt;

           procedure EditDoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
      PUBLIC
           :
           :
           Constructor Create(editType:TdbRepType;CallBack:TonBackDirekt);
      END;

IMPLEMENTATION
        :
        :
      procedure TRepStringEditLink.EditDoKeyDown(Sender:TObject; var key: word; shift: TShiftState);
      begin
        if (fcall <> nil) AND (key = VK_TAB) then
          fcall(sender,key,shift,fnode,fCol);
      end;

      Constructor TRepStringEditLink.Create(editType:TDbRepType;CallBack:TOnBackDirekt);
      begin
        inherited Create;
        fType := editType;
        fcall := CallBack;
      end;
ftype/edittype sind hier nur die Kennungen für verschiedene Eingaben/Controls; Der Rest sollte hoffe ich soweit Klar sein.

Und hier nun die CallBack-Routine, die den Tab nun eigentlich erst behandelt:

Delphi-Quellcode:
procedure TfrmDataBases.HandleBack(sender: TObject; var Key: word;
  Shift: TShiftState; node: PVirtualNode; Column: TColumnindex);
begin
  //Prüfung ob der Sender und Key auch wirklich zulässig sind
  if ((sender.ClassName = 'TMyEdit') and (key = VK_TAB)) then
  begin
    //aktuellen Edit beenden und ggf. Werte speichern;
    //WICHTIG: Immer über EndEditNode beenden. EndEdit vom Editor aufrufen funktioniert nicht !
    vst.EndEditNode;
    //Nächste zulässige Spalte ermitteln
    inc(column);
    //Wenn die Spalte gültig ist, in den Editor-Modus springen
    if (column >= 0) and (column < vst.Header.Columns.Count) then
      vst.EditNode(node,Column);
  end;
end;
Das ganze Vorgehen sollte auch mit den Pfeil-Tasten u.ä. funktionieren.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat