24. september 2001 - 12:18Der er
43 kommentarer og 3 løsninger
Undgå selvmord ?
Jeg har en form hvorpå der under runtime placeres nogle speedbutton, når der trykkes på en af SpeedButtons (OnClick), skal de slettes.
Mit problem er at jeg af og til får en Exceptionfejl, formentlig fordi at alt koden i \"den slettede\" knap endnu ikke er afviklet, måske OnMouseUp event osv.
Jeg har prøvet at slette kanppen på OnMouseUp istedet for OnClick, det gør ingen forskel
pelleli> Kunne godt lade sig gøre, men jeg fylder jo min arrray op igen med nye kanpper... så skal man over i noget pointer noget, og på et tidspunkt skal de jo slettes....
morten_s> Nu kender jeg ikke dit program, men kunne du ikke blot beholde anvende de samme knapper så blot deler samme OnClick, og så lade denne holde styr på hvad de enkelte knapper skal \"betyde\" - så slipper du for at \"spilde tid\" med at create/dispose knapper hele tiden
morten_s >> Du bliver nok nød til at sure i det bide æble og sende koden enten til ham der pjækkede fra eksperten eventet (lead os ikke nævne navne Martin) eller undertegnede (jens@Borrisholt.com)
procedure TFrameOnline.LinkClick(Sender: TObject); var ClickBut : TLinkButton; OldIdSelectedInt : Integer; begin if EditMode then exit; If not (Sender is TLinkButton) then exit; OldIdSelectedInt := IdSelectedInt; ClickBut := (Sender as TLinkButton); IdSelectedInt := ClickBut.LnkToID; // ShowMessage(IntToStr(IdSelectedInt)); if DM.DataSourceInt.DataSet.Locate(\'Id\', IdSelectedInt, []) then begin // OkToDelete := False; // OnShow(Sender); // OkToDelete := True; PostMessage(Handle, UM_REMOVEBUTTONS, 0, 0); OnShow(Sender); . . . end;
procedure TFrameOnline.SletObjekter; var i : Integer; begin for i := 0 to MaxNoLinks-1 do if (Links[i] <> nil) then begin FreeAndNil(Links[i]); end; NoLinks := 0; end;
procedure TFrameOnline.Um_RemoveButtons(var Message: TMessage); begin SletObjekter; end;
unclebug> det var JB\'s forslag at det skulle gøres i omvendt rækkefølge......
Den forstår jeg ikke helt. Hvem er JB, og hvor? Er jeg bare blind? Men ja, FreeAndNil giver også exception, for du kan ikke free en komponent i en af dens events (efter eventen returnerer den nemlig til komponentens kode, der ikke længere eksisterer). Men det kan PostMessage så løse.
Prøv lige at skrive windows.PostMessage(....). Den fejl (not enough parameters) må skyldes at der er en funktion i en anden unit der også hedder PostMessage.
Jeg har lige prøvet at lave et eksempel hvor jeg laver 10 TSpeedButton\'s, og sletter dem på den angivne måde, og det virkede. Jeg kan jo ikke se hele din kode, men måske creater du dem igen efter de er slettet? Jeg har ikke flere forslag lige p.t., men det kode jeg kan se er korrekt og virker.
Har jeg ret i at din kode \"udsætte\" sletningen ?
For jeg gentegner jo samtidigt billedet med de nye kanpper og allokkere til den samme variabel Links[i], det betyder vel at hvis knapperne endnu ikke er slettet har jeg ikke længere fat i dem ??
Ja, metoden udsætter lige præcis sletningen. Den smider en message i messagekøen, og sletningen bliver så udført når den message når frem til programmet. Du må først allokere de nye knapper efter at du har kaldt Destroy. Jeg kan ikke rigtig se ud fra det du skriver, om det er det du gør. Men hvis du ikke gør det, så vil det forklare hvorfor de ikke forsvinder, for du har pludselig to sæt knapper, og får kun slettet dem Links[i] refererer til. De andre er ganske rigtigt tabt (selv om du kan finde dem ved hjælp af formens ControlCount og Controls (hvis du har angivet formen i constructoren da du createde)).
>RemoveComponent(Links[i]) Det tror jeg ikke. Den bruger ikke PostMessage, og der returneres derfor stadig til en destroyed komponent efter eventen. Jeg lavede lige en test hvor en TButton removede sig selv i OnClick. Knappen forsvandt ikke, og ved andet click fik jeg en AV (fordi det første click destroyede den).
Hov de røg vist til Martin allesammen, det var et uheld ;-(((((((
Havde tænkt mig 40 til UncelB 10 til Martin og 10 til JB
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.