14. maj 2004 - 17:22Der er
4 kommentarer og 2 løsninger
At fange dobbeltklik eventet fra en TTreeView
Jeg har to forme i mit program. På den ene af dem kan man søge. Resultaterne bliver vist i en TTreeView. Når man dobbeltklikker på en af de fundne elementer, skal programmet hoppe over på hovedformen og markere det samme element der.
Jeg kan aflæse musens position i OnDblClick eventet og bruge GetNodeAt til at finde, hvilket element brugeren har dobbeltklikket på. Hvis det valgte element ikke er i det nederste niveau, vil min TTreeView automatisk "lukke" eller "åbne" den node (lissom når man klikker på '-' eller '+'). Det kan så bevirke at listen bliver trukket sammen eller udvidet.
Mit problem er, at jeg først får musens X og Y koordinater, efter listen har håndteret det dobbeltklik. Hvis listen har skubbet sig på grund af det, får jeg koordinaterne på det forkerte element.
Hvordan fanger jeg det event og får listen til at lade være med at "lukke" eller "åbne" ?
Kommunerne har digitaliseret indgangen for borgerne. Men bag skærmen håndteres mange arbejdsgange stadig manuelt mellem systemer, mails og organisatoriske siloer.
Bemærk, at hver TTreeNode har en .Data tingest hvorpå du kan koble information. I nedenstående eksempel har jeg lavet en TSearchItemClass (som man naturligvis skal huske at fjerne igen) der indeholder SelStart og SelLength -> som direkte kan bruges i en TMemo.
Desuden har jeg en fOtherFormMemo der er en pointer til en TMemo-instans i den anden form. Grunden til jeg ikke har frmOtherForm.Memo1... er at det er en usik at de to forme kender hinanden respektivt. Synes altid det giver problemer, så jeg ændrer altid constructoren på, her søgeformen, så den kan få oplysningerne derfra:
procedure TSearchForm.TreeView1Change(Sender: TObject; Node: TTreeNode); var SearchItem : TSearchItemClass; // Hjemmelavet klasse der fortæller hvor det søgte er begin if assigned(Node) then begin SearchItem := TSearchItemClass(Node.Data); fMemo.SelStart := SearchItem.SelStart; // Memo i anden form fMemo.SelLength := SearchItem.SelLength; end; end;
På den måde så er det kun TTekstForm (eller hvad man skal kalde den), der kender TSearchForm - og det har jeg generelt fundet det bedste løsning.
Jeg har læst spørgsmålet en gang til og undrer mig list (over mit forrige svar og om du ikke kender en TTreeView's Selected property). Jeg kører videre med mit eksempel hvor jeg har koblet et objekt på hver TTreeNode's .Data property:
procedure TfrmMain.TreeView1DblClick(Sender: TObject); SearchItem : TSearchItemClass; begin SearchItem := nil; with (Sender as TTreeView) do begin if assigned(Selected) and assigned(Selected.Data) then // bruger Short boolean evaluation SearchItem := Selected.Data;
if assigned(SearchItem) then begin // Kald den anden form med de informationer der er i SearchItem-objektet. end; end;
// For at illustrere hvordan man let kan sørge for at der ryddes op igen procedure TfrmMain.TreeView1Deletion(Sender: TObject; Node: TTreeNode); begin if assigned(Node.Data) then TSearchItemClass(Node.Data).Free; Node.Data := nil; // Egentlig ikke nødvendig end;
hrc <<< Tak for hjælpen med Selected - den er meget nemmere at bruge end koordinaterne af musemarkøren, men jeg tager halvdelen af point'ene selv for AllowCollapse :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.