Autor Beitrag
Wolff68
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: Di 11.03.03 21:51 
Folgendes breitet mir gerade Kopfzerbrechen.

Ich habe ein TreeView dessen Nodes.Data einen Zeiger auf einen record hat.
Beim auswählen eines Knotens setze ich ActNode:=TreeView.Selected und lese dann den Inhalt des Records in TEdits bzw TMemos.
Wenn ich nun im Edit oder Memo was ändere, möchte ich das natürlich ganz gerne wieder im Record speichern.

Nur: Im OnExit des Memos, ist Memo1.Text (noch) LEER !
Das gleiche gilt für das Edit ! :shock:
ausblenden Quelltext
1:
2:
3:
4:
procedure TfrmMain.mText1Exit(Sender: TObject);
begin
  IF mText1.Text <> PNodeData(ActNode.Data)^.Text1 then NodeDataChanged;
end;


Achja, nochwas: Ich 'Erzeuge' ja mit New(NodeData) irgendwo Speicher für den Record. Muss ich den selber wieder freigeben, oder macht das Delphi, wenn der Knoten gelöscht wird? :?!?:

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Di 11.03.03 22:19 
Hallo

Zitat:

Nur: Im OnExit des Memos, ist Memo1.Text (noch) LEER !
Das gleiche gilt für das Edit ! icon_eek.gif

glaub ich dir nicht, wenn du die key??? etc ereignisse verwendest, hast du den Text ja auch schon zur verfügung

ausblenden Quelltext
1:
2:
3:
4:
procedure TForm1.Memo2Exit(Sender: TObject);
begin
  memo3.text:=memo2.text;
end;

steht bei mir schön der Text vom memo2 im memo3 drin.

Zitat:

PNodeData(ActNode.Data)^.Text1

darin war ich noch nie gut - das ist das gleiche wie PNodeData(ActNode.Data).Text1 , weil das Delphi selbst erledigt, oder ?? :oops: :oops:

ähmm, mit Recors arbeite ich seltener, ich bau mir immer objekte. das wird mit deinen records aber auch nicht anders aussehen
hab folgendes mit einer Listbox, Memo und Button kurz gestestet:
ausblenden volle Höhe 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:
procedure TForm1.Button1Click(Sender: TObject);
//einträge hinzufügen
Var SL:Tstrings;
begin
  sl:=TStringlist.create;
  sl.add('Test text');
  listbox1.items.addobject('Test',sl);
end;

procedure TForm1.ListBox1Click(Sender: TObject);
//hinterlegten Text des Listboxeintrages im Memo anzeigen
Var sl:Tstrings;
begin
  if listbox1.itemindex<>-1 then
    begin
      sl:=Tstrings(listbox1.items.objects[ListBox1.itemindex]);
      memo1.lines.assign(sl );
    end;
end;

procedure TForm1.Memo1Exit(Sender: TObject);
//memotext in listboxitem übertragen
Var sl:Tstrings;
begin
  if listbox1.itemindex<>-1 then
    begin
      sl:=Tstrings(listbox1.items.objects[ListBox1.itemindex]);
      sl.assign(memo1.lines);
    end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
//belegten speicher freigeben
Var i:integer;
    sl:tstrings;
begin
  for i:=0 to listbox1.items.count-1 do
    begin
      sl:=Tstrings(listbox1.items.objects[i]);
      sl.free;
    end;
end;


was passiert denn bei dir bei Nodechanged?

Zitat:

Achja, nochwas: Ich 'Erzeuge' ja mit New(NodeData) irgendwo Speicher für den Record. Muss ich den selber wieder freigeben, oder macht das Delphi, wenn der Knoten gelöscht wird? icon_confused2.gif

ja. nur eine Objectlist gibt (auf Wunsch) ihre objekte auch selbst frei.

Wenn du dir nicht sicher bist, ob du allen belegten Speicher freigibst, google nach memproof damit findest du alles Speicherlecks, das Prog ist echt spitze! hab den code oben aber nicht mit memproof getest, weil ich hier nur D3 hab.

Zitat:

PNodeData(ActNode.Data)

hier würd ich vorher auch noch prüfen, ob actnode nicht nil ist.was ist, wenn der user zuerst das memo anklickt ohne eine Node ausgewählt zu haben?

mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Wolff68 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: Di 11.03.03 22:31 
Im NodeChanged schreib ich nur die Felder in den Record.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TfrmMain.NodeDataChanged;
begin
  Case ActNode.Level of
  1  : begin // Unterebene1 gewählt
         PnodeData(ActNode.Data)^.Name  := ed1stName.Text;
         PnodeData(ActNode.Data)^.Text1 := '';
         PnodeData(ActNode.Data)^.Text2 := '';
       end;
  2  : begin // Unterebene gewählt
         PnodeData(ActNode.Data)^.Name  := ed2ndName.Text;
         PnodeData(ActNode.Data)^.Text1 := mText1.Text;
         PnodeData(ActNode.Data)^.Text2 := mText2.Text;
       end;
  else begin // Anderes gewählt (Root gewählt)
         PnodeData(ActNode.Data)^.Name  := '';
         PnodeData(ActNode.Data)^.Text1 := '';
         PnodeData(ActNode.Data)^.Text2 := '';
       end;
  end;
end;


Aber ist wirklich so. wenn ich mir einen Breakpoint setze ist der .Text = '' und die IF-Abfrage erkennt den geänderten Text nicht.
Ich denke aber auch, daß der Inhalt von .Text im OnExit bereits fertig geändert sein müsste. Kapier grad echt nicht, was los ist :(

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Di 11.03.03 22:39 
Zitat:

Aber ist wirklich so. wenn ich mir einen Breakpoint setze ist der .Text = '' und die IF-Abfrage erkennt den geänderten Text nicht.
Ich denke aber auch, daß der Inhalt von .Text im OnExit bereits fertig geändert sein müsste. Kapier grad echt nicht, was los ist icon_sad.gif

kann ich nicht nachvollziehen, ist bei mir nicht so.
um halb 11 ist mein Gehirn aber auch nicht mehr auf hochtouren :? , seh jetzt keinen Fehler mehr.

hast du mal meinen code probiert?

Bis morgen Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Di 11.03.03 22:42 
du erstellst aber auch für jenen node einen record?

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Wolff68 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: Di 11.03.03 22:46 
Ogott. Ich glaub ich habs.
Das Problem tritt nur auf, wenn ich nach dem schreiben ein neues Element im Baum anwähle.

Dann wird TreeViewChange noch VOR MemoExit ausgeführt. Und in TreeViewChange setz ich natürlich mein ActNode neu, und fülle (bzw leere) meine Felder... :oops:

Edit: Jepp, das wars. Wenn ich bei TreeViewChange zuerst ein TreeView.SetFocus mache, dann arbeitet er zuerst die OnExits durch und alles klappt wunderbar :D

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."