windows - Delphi-trævisning med afkrydsningsfelter: Sommetider er afkrydsningsfelterne usynlige

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et problem. Jeg har en TTreeview-efterkommer, der viser afkrydsningsfelter fint på min egen computer og alle andre, jeg har testet mig selv.


TVS\_CHECKBOXES sættes ved hjælp af SetWindowLong. I Loaded -metoden indstiller/opretholder jeg kontrollerede tilstande med StateIndex := 2;, Item.State := TVIS\_CHECKED osv.


Så langt så godt. Men nu har en person kontaktet mig, hvor afkrydsningsfelterne til træningspunkter ikke viser overhovedet på sin WindowsXP SP3. (Han gav mig endda et skærmbillede.) Fra programadfærden kan jeg sige, at standard-checkede noder fungerer siden programmet ellers fra kundebeskrivelsen opfører sig som forventet.


Jeg har ikke været i stand til at finde lignende symptomer beskrevet overalt. Alle computere jeg har testet på, fungerer godt. Men skærmbilledet fra kunden viser, at der er et problem :(


Mit bedste gæt er, at det er nogle RecreateWnd, der i nogle systemer nulstiller tjeklås-tilstanden?


Mine muligheder for test er begrænset, da jeg ikke kan reproducere problem på mine egne computere, så vil gerne vide, om andre har andre forslag, jeg kan prøve, før jeg sender ny betacode til den person, hvis system ser ud til at skjule treeview-afkrydsningsfelterne ?

Bedste reference


Indstilling af denne stil i overstyring CreateWnd kan være for sent i henhold til dokumentationen: [12]



  Hvis du vil bruge denne stil, skal du indstille TVS\_CHECKBOXES-stilen med SetWindowLong efter du opretter træbeskyttelseskontrollen, og før du fylder træet. Ellers kan afkrydsningsfelterne virke ukontrolleret, afhængigt af timingproblemer.



Nu virker dette som et lille æg-og-kylling dilemma, fordi VCL ikke giver en reel løsning for dette præcise øjeblik. Indstilling af denne stil inden det arvede CreateWnd-opkald er ikke muligt, fordi der ikke er noget håndtag endnu. Men efter det arvelige kald kan træet allerede være befolket på grund af rekreation. (VCL streamer noderne tilbage i TCustomTreeView.CreateWnd).


Men da dette bare ligner en simpel stilmodifikation, kan du også forsøge at tilsidesætte CreateParams og føje dette flag til Params.Style, som fungerer lige så fint her. [13]


procedure TMyTreeView.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or TVS\_CHECKBOXES;
end;


Selv om jeg heller ikke kan reproducere problemet. Og noder, der vises ukontrolleret, stemmer ikke overens med at være usynlige overhovedet, så jeg undrer mig virkelig, at det ville rette op på det.