Announcement

Collapse
No announcement yet.

TreeView und EditText

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TreeView und EditText

    Hallo,

    ich möchte in meinem TreeView im Ereigenis OnEdited eine Abfrage starten, ob der Knotennamen bereits schonmal irgendwo vorkommt. Das ist auch nicht weiter das Problem, wenn der Event ausgelöst wird, prüfe ich einfach nach ob er bereits existiert.

    Wenn er bereits existiert möchte ich eine Meldung ausgeben und den gerade geänderten Knoten nochmals auf EditText schalten, damit man dan Namen ändern muss (so wie auch beim Explorer ist). Doch leider kann ich nicht verhindern das der Knoten den Eingabefocus immer verliert auch wenn ich ihn mit EditText im OnEdited Event nochmal setze.

    Hat hierzu jemand eine Idee.

    Vielen Dank,
    Martin

  • #2
    Hallo Martin,<br>wie wäre es mit TTreeView.Selected.EditText

    Comment


    • #3
      Hi Jens,

      den Knoten weiß ich ja. Das Problem ist nur, wenn der Event OnEdited auftritt, wo ich ja erst entscheiden kann, ob die Eingabe richtig ist oder nicht. Bringt das erneute setzen mit EditText nichts.

      Also hier nochmal die Abfolge. Ich weiss meine Erklärungen sind nicht immer so besonders:

      1. Eingabe eines neuen Namens für einen Knoten.

      2. Drücken der Enter-taste

      3. OnEdited tritt ein

      4. Checken ob die eingabe korrekt

      5. Wenn nein, im OnEdited den Knoten mit EditText nochmal aktivieren (aber genau das geht eben nicht, zumindest bei mir nicht ;-)).

      Danke,
      Marti

      Comment


      • #4
        Hallo Martin,<br>
        der folgende Code funktioniert bei mir (D5 Pro SP1 und Win2k SP2)<br>
        <pre>
        unit Unit1;

        interface

        uses
        Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
        ComCtrls, StdCtrls;

        const
        PM_SETEDITMODE = WM_APP+1000;

        type
        TForm1 = class(TForm)
        TV: TTreeView;
        Button1: TButton;
        procedure TVEdited(Sender: TObject; Node: TTreeNode; var S: String);
        procedure Button1Click(Sender: TObject);
        private
        { Private-Deklarationen }
        function ValidText(TV : TTreeview;const S : String) : Boolean;
        procedure PMSETEDITMODE(var Msg : TMessage); message PM_SETEDITMODE;
        public
        { Public-Deklarationen }
        end;

        var
        Form1: TForm1;

        implementation

        {$R *.DFM}

        function TForm1.ValidText(TV: TTreeview; const S: String): Boolean;
        var
        iCnt : Integer;
        begin
        Result:=True;
        For iCnt:=0 to TV.Items.Count-1 do
        begin
        If TV.Items[iCnt].Text=S then
        begin
        Result:=False;
        Exit;
        end;
        end;
        end;

        procedure TForm1.TVEdited(Sender: TObject; Node: TTreeNode; var S: String);
        begin
        If Not ValidText(TTreeView(Sender),S) then
        begin
        ShowMessage('Knotenname schon vorhanden');
        S:=Node.Text; // zurücksetzen auf den alten Wert
        PostMessage(Handle,PM_SETEDITMODE,0,0);
        end;
        end;

        procedure TForm1.Button1Click(Sender: TObject);
        begin
        TV.Selected.EditText;
        end;

        procedure TForm1.PMSETEDITMODE(var Msg: TMessage);
        begin
        TV.Selected.EditText;
        end;

        end.</pre>
        Der Trick ist PostMessage. PMSETEDITMODE wird erst dann aufgerufen, wenn alle Botschaften für den TTreeView abgearbeitet sind.<br>
        Wenn Du SendMessage verwendest funktioniert es nicht mehr. SendMessage "drängelt" sich vor.<br>
        &#10

        Comment


        • #5
          Hi Jens,

          danke für des Code-Snippet ich werd's probieren.

          Gruß,
          Marti

          Comment

          Working...
          X