Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Treeview - Node.Text vor Edit ändern


MaikRutsche - Mi 13.08.03 23:25
Titel: Treeview - Node.Text vor Edit ändern
Hallo,

ich habe folgendes Problem:

Ich habe einen Treeview mit mehreren Einträgen.

Einige der Einträge will ich editieren.

Vor dem Editieren soll aber der Text der Node geändert werden!
Als Beispiel wo das z.B. auftritt ist der Explorer, wenn man seine Festplatten umbenennen will, da wird kurz vorm Edieren der Laufwerksbuchstabe hinter der Bezeichnung entfernt.

Etwas Code:

Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TTest.tvDataEditing(Sender: TObject; Node: TTreeNode;
  var AllowEdit: Boolean);
begin
  Node.Text := 'test';

  AllowEdit := True;
end;


Das dumme aber:
Der Node übernimmt nicht mehr den neuen Text.
Das Edit-Feld enthält noch den alten...

Hat jemand ne Idee wie ich das realisieren kann?

Oder weis einer wie ich direkt an das Edit-Feld herankomme?


MfG

Maik

/e
Aso, verwendet habe ich den Standard TTreeView (Delphi 6)


Delete - Do 14.08.03 09:14

Gibt´s nicht im Objektinspektor die Ereignisse "OnBeginEdit" und "OnEndEdit"? (oder so ähnlich ... :oops:) Sorry, hab kein Delphi da. Schau doch mal, welche Ereignisse der Tree-View bietet. IMHO kann man vor und nach dem Edit die Werte abfragen.


Tpercon - Do 14.08.03 10:44

Bitte wieder löschen


a.C.k - Do 14.08.03 11:05

Die Eigenschafften die Mathias anspricht müssten sein:



Quelltext
1:
TCustomTreeView.OnEdited                    


Quelltext
1:
TCustomTreeView.OnEditing                    


Hoffe das hilft dir weiter :wink:


MaikRutsche - Do 14.08.03 13:59

Hmmm.

Das kleine Codestück ist ja eben schon das Ereingnis TTreeView.OnEditing.

Scheinbar wird das Edit-Feld schon vor OnEditing erstellt und der Text der Node eingefügt, so dass eine neue TextZuweisung für ein Node keine Auswirkung mehr hat...

Aber hier (m)eine Lösung, mit Hilfe von http://www.delphi-groups.de/YaBBSe/index.php?board=5;action=viewprofile;user=Tryer;

Quelltext
1:
2:
3:
4:
5:
var
  EditHWnd: HWnd;
begin
  EditHWnd := TTreeView(Sender).Perform(TVM_GETEDITCONTROL, 0, 0);
  SendMessage(EditHWnd, WM_SETTEXT, 0, Integer(PChar('MyEditText')));

Damit komme ich direkt an das Edit-Feld ran...[/code]


Delete - Do 14.08.03 14:11

"OnEditing" ist IMHO, wenn du gerade änderst. "OnEdited" ist nach dem Ändern. Mir war so, als gäb´s da noch eine "Bevor man was ändert". Zumindest kenne ich vom API-Control die Notification TVN_BEGINLABELEDIT [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/treeview/notifications/tvn_beginlabeledit.asp]:
MSDN hat folgendes geschrieben:
Remarks
When label editing begins, an edit control is created but not positioned or displayed. Before it is displayed, the tree-view control sends its parent window a TVN_BEGINLABELEDIT notification message.

To customize label editing, implement a handler for TVN_BEGINLABELEDIT and have it send a TVM_GETEDITCONTROL message to the tree-view control. If a label is being edited, the return value will be a handle to the edit control. Use this handle to customize the edit control by sending the usual EM_XXX messages.

When the user cancels or completes the editing, the parent window receives a TVN_ENDLABELEDIT notification message.

Es würde mich wundern, wenn´s das nicht auch in der VCL als Ereignis gibt.


Keldorn - Do 14.08.03 14:13

MaikRutsche hat folgendes geschrieben:


Aber hier meine Lösung:

"Deine" Lösung ?
http://www.delphi-groups.de/YaBBSe/index.php?board=5;action=display;threadid=16501

sei fair


MaikRutsche - Do 14.08.03 14:26

Jap die stammt von da...

Hätt ich evtl. dazu schreiben sollen...

Aber darf ich die Lösung meinses Problems denn nicht meine Lösung nennen?