Avatar billede slowaterz Nybegynder
14. maj 2004 - 17:22 Der 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" ?
Avatar billede hrc Mester
14. maj 2004 - 23:02 #1
Hvorfor bruger du ikke bare TTreeViewets OnChange event?
Avatar billede hrc Mester
14. maj 2004 - 23:14 #2
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:

TSearchForm = class
  TreeView1 : TTreeView;
  procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
private
  fMemo : TMemo;
public
  constructor Create(aSender : TComponent; aMemo : TMemo); reintroduce;
end;

constructor TSearchForm.Create(aSender : TComponent; aMemo : TMemo);
begin
  inherited Create(aSender);
  aMemo := fMemo;
end;

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.
Avatar billede hrc Mester
14. maj 2004 - 23:15 #3
Skal lige bytte disse to rundt (som her):
  fMemo := aMemo
Avatar billede hrc Mester
15. maj 2004 - 23:08 #4
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;
Avatar billede slowaterz Nybegynder
17. maj 2004 - 14:22 #5
Jeg har fundet det : i OnCollapsing eventet skal AllowCollapse sættes til False.
Avatar billede slowaterz Nybegynder
17. maj 2004 - 14:25 #6
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 :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester