|
| "selvmord" af dynamiske komponenter Fra : Klaus Petersen |
Dato : 24-04-05 23:17 |
|
Hej.
Jeg er stødt ind i et lille problem i mit delphi program.
Jeg skaber en række visuelle komponenter dynamisk.
Her iblandt er en knap, der på klik skal destroy'e alle de dynamiske
komponenter.
Problemet er, at jeg ikke kan destroy'e knappen selv på onclick
eventhandleren, da det giver en access violation.
Den skal med andre ord være færdig med eventhandleren før den må begynde at
destroy'e.
Jeg har fundet et par løsninger, men jeg håber på nogen kender eller kan
finde på, en mere elegant løsning:
1) Hack: brug en timer til at kalde en funktion, der destroy'er
komponenterne.
2) Pænere løsning: send en brugerdefineret message, der fanges og udløser
destroy.
Det mærkelig er, at man godt kan "begå selvmord" med designtime knapper uden
at få access violation.
mvh.
Klaus.
| |
Khvm (25-04-2005)
| Kommentar Fra : Khvm |
Dato : 25-04-05 08:11 |
|
Hej Klaus,
Det kunne vel være meget pænt at bruge en action og en boolsk værdi på
formen. I din actions OnUpdate event kunne du kigge efter om din
"DestroyAllDynObjs" er sat til eller fra! Hvis den er - fjerner du alle
de dynamiske komponenter.
Mvh Ken
Klaus Petersen wrote:
> Hej.
>
> Jeg er stødt ind i et lille problem i mit delphi program.
>
> Jeg skaber en række visuelle komponenter dynamisk.
> Her iblandt er en knap, der på klik skal destroy'e alle de dynamiske
> komponenter.
>
> Problemet er, at jeg ikke kan destroy'e knappen selv på onclick
> eventhandleren, da det giver en access violation.
>
> Den skal med andre ord være færdig med eventhandleren før den må begynde at
> destroy'e.
>
> Jeg har fundet et par løsninger, men jeg håber på nogen kender eller kan
> finde på, en mere elegant løsning:
>
> 1) Hack: brug en timer til at kalde en funktion, der destroy'er
> komponenterne.
> 2) Pænere løsning: send en brugerdefineret message, der fanges og udløser
> destroy.
>
> Det mærkelig er, at man godt kan "begå selvmord" med designtime knapper uden
> at få access violation.
>
> mvh.
> Klaus.
>
>
| |
Harald (25-04-2005)
| Kommentar Fra : Harald |
Dato : 25-04-05 13:54 |
|
"Khvm" <khvmsnabela@hotmail.com> skrev i en meddelelse
news:426c981e$0$79459$14726298@news.sunsite.dk...
> Hej Klaus,
>
> Det kunne vel være meget pænt at bruge en action og en boolsk værdi på
> formen. I din actions OnUpdate event kunne du kigge efter om din
> "DestroyAllDynObjs" er sat til eller fra! Hvis den er - fjerner du alle de
> dynamiske komponenter.
Men det er da mystisk at man ikke kan free´e knapper lavet at runtime i
knappens OnClick mens knapper lavet at designtime godt kan free´es i
OnClick.
/HK
| |
Klaus Petersen (25-04-2005)
| Kommentar Fra : Klaus Petersen |
Dato : 25-04-05 17:37 |
|
> Men det er da mystisk at man ikke kan free´e knapper lavet at runtime i
> knappens OnClick mens knapper lavet at designtime godt kan free´es i
> OnClick.
Ja det er meget mystisk - jeg kan ikke rigtig forestille mig hvilken
mekanisme der forudsager den adfærd.
| |
Nicolai Hansen (06-05-2005)
| Kommentar Fra : Nicolai Hansen |
Dato : 06-05-05 07:40 |
|
"Klaus Petersen" <spectual2@getTOnet.dk> wrote in message news:<219be.327$h57.161@news.get2net.dk>...
> > Men det er da mystisk at man ikke kan free´e knapper lavet at runtime i
> > knappens OnClick mens knapper lavet at designtime godt kan free´es i
> > OnClick.
>
> Ja det er meget mystisk - jeg kan ikke rigtig forestille mig hvilken
> mekanisme der forudsager den adfærd.
TCustomForm og nedarvede klasser danner komponenterne vha .dfm filen
og InitInheritedComponent() (se forms.pas, TCustomForm.Create). Dette
gør jo tydeligvis en forskel.
Jeg debuggede dette for nogle uger siden da jeg selv havde samme
problem, og det ser ud til at MouseUp bliver kaldt efter Click.
Jeg skal ikke sige hvad forskellen helt nøjagtigt er, men hvis du
flytter din Button.Free til OnMouseUp så virker det også for dynamisk
genererede komponenter ...
| |
Klaus Petersen (08-05-2005)
| Kommentar Fra : Klaus Petersen |
Dato : 08-05-05 19:15 |
|
> TCustomForm og nedarvede klasser danner komponenterne vha .dfm filen
> og InitInheritedComponent() (se forms.pas, TCustomForm.Create). Dette
> gør jo tydeligvis en forskel.
> Jeg debuggede dette for nogle uger siden da jeg selv havde samme
> problem, og det ser ud til at MouseUp bliver kaldt efter Click.
> Jeg skal ikke sige hvad forskellen helt nøjagtigt er, men hvis du
> flytter din Button.Free til OnMouseUp så virker det også for dynamisk
> genererede komponenter ...
Ok .. tak for dit input.
Jeg har løst problemet ved at definere en speciel message, som bliver sendt
til formen. Når den håndterer den message sletter den komponenterne og
dermed er jeg fri for at destroy'e dem i eventhandleren.
| |
Brian Andersen \(www~ (22-05-2007)
| Kommentar Fra : Brian Andersen \(www~ |
Dato : 22-05-07 08:20 |
|
> Jeg debuggede dette for nogle uger siden da jeg selv havde samme
> problem, og det ser ud til at MouseUp bliver kaldt efter Click.
> Jeg skal ikke sige hvad forskellen helt nøjagtigt er, men hvis du
> flytter din Button.Free til OnMouseUp så virker det også for dynamisk
> genererede komponenter ...
Jeg kan ikke lige se, hvad forskellen er? Om komponenterne oprettes via en
*.dfm fil eller via manuel kode, så burde det ikke have nogle indflydelse?
Slutresultatet burde være det samme?!
Men, jeg vil tro, at en forklaring på problemet kunne være, at
Delphi/Windows stadigvæk har behov for at sende Messages til TButton knappen
efter den bliver Free'et i OnClick metoden. Og, det går jo ikke (o; Prøv
følgende komponent i stedet.
I din OnClick metode skal du så kalde Release i stedet for Free. Trikket her
gør, at samtlige Messages i TButton'ens message kø bliver behandlet før
komponenten bliver frigivet.
Vil du være sød at fortælle mig om det virkede....
/Brian
-----
TFreeableButton = class(TButton)
private
procedure CMRelease(var Message: TMessage); message CM_RELEASE;
procedure Release;
end;
implementation
procedure TFreeableButton.Release;
begin
PostMessage(Handle, CM_RELEASE, 0, 0);
end;
procedure TFreeableButton.CMRelease;
begin
Free;
end;
| |
|
|