Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Custom control Access violation

[es] :: Pascal / Delphi / Kylix :: Custom control Access violation

[ Pregleda: 1889 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

franjo_tahi2
Franjo Tahi
Zagreb

Član broj: 289851
Poruke: 43
*.adsl.net.t-com.hr.



Profil

icon Custom control Access violation27.03.2014. u 11:15 - pre 121 meseci
Napravio sam kontrolu od TEdit controle.
Kreirano sam klasu UsrProperti koja ima više toga.
Kreirao sam ju kao TPersistent kako bih u property editoru vidio svoje dodane property-e na jednom mjestu

između ostalog postoji:

property NextControl: TWinControl

to je bilo koja kontrola koja može dobiti fokus.

Izmjenio sam OnKeyPress na način:
Code:

....
if Key = #13 then
   MyProperty.NextControl.SetFoxus;
...



Problem je sljedeći:
1. property-u kontrole: NextContol (odabere se bilo koja kontrola s forme, npr edKonto)
2. obriše se s forme dodjeljena kontrola (u ovoj slučaju edKonto)


Delphi javlja Access violation.

Ako kontrolu edKonto obrišem u RunTime-u, ništa se ne događa i kontrola ne javi grešku.

Predpostavljam da je riječ o pokušaju pristupa objektu (fokusiranje) koji ne postoji.
Pokušaop sam prije upotrebe NextControl provjeravati da li ispravna.
Ovo je funkcija (našao na net-u) koja radi kontrolu i koju pozivam svaki put prije uprabe NextCotnrol (možad će kome trebati):
Code:

function tKnEdit.IsValidClass(Cls: TClass): Boolean;
var
    i: Integer;
begin
    for i := 0 to 99 do begin
        Result := ( Cls = TObject ); // note that other modules may have a different root TObject!
        if Result then Exit;
        if IsBadReadPtr( Cls, sizeof( Pointer ) ) then Break;
        if IsBadReadPtr( Pointer( Integer( Cls ) + vmtParent ), sizeof( Pointer ) ) then Break;
        Cls := Cls.ClassParent;
    end;
    Result := False;
end;

function tKnEdit.IsValidObject(Obj: TObject): Boolean;
begin
   Result := not IsBadReadPtr( Obj, sizeof( Pointer ) ) and IsValidClass( Obj.ClassType ) and not IsBadReadPtr( Obj, Obj.InstanceSize );
end;


Pozivam je:
Code:

if IsValiedObject(NextControl) then ...


Nadam se da ste imali živaca čitati post....
 
Odgovor na temu

franjo_tahi2
Franjo Tahi
Zagreb

Član broj: 289851
Poruke: 43
*.adsl.net.t-com.hr.



Profil

icon Re: Custom control Access violation27.03.2014. u 13:52 - pre 121 meseci
Mislim da sam riješio problem...
u klasi gdje su mi definirani moji property-i sam napisao property:
Code:

...
  private
      fNextControl: tWinControl;

...
  published
    property NextControl: TWinControl read fNextControl write fNextControl;
...


to sam izmjenio:
Code:

...
    property NextControl: TWinControl read getNextControl write fNextControl;
...

function tMyClass.getNextControl: TWinControl;
begin
  if IsValidObject(fNextControl) then Result := fNextControl
  else result := nil;
end;
...


gdje je funkcija IsValidObject opisana u ranijem postu.

Ako mislite da treba drugačije, molim komentar.

 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
..ppoe.dyn.broadband.blic.net.



+62 Profil

icon Re: Custom control Access violation27.03.2014. u 20:18 - pre 121 meseci
Vidi, nema sumnje da ce taj pristup 'grubom' metodom za proveru dealociranog objekta/propertija raditi.

Medjutim, u Delphi-ju postoji vec elegantan mehanizam napravljen za tako nesto. Pretpostavljam da imas Delphi 7 (da ne gledam sad neki noviji Delphi). Ukucaj u help/index "Creating properties for subcomponents", i naci ces primer kako iskoristiti (pomenuti) mehanizam notifikacije (radi se o metodama FreeNotification i Notification).
Ako nemas D7 (ili help), kazi i ja cu paste-ovati ovde celu stranicu/page (nije preveliko).

Pozz
 
Odgovor na temu

franjo_tahi2
Franjo Tahi
Zagreb

Član broj: 289851
Poruke: 43
*.dsl.iskon.hr.



Profil

icon Re: Custom control Access violation30.03.2014. u 09:13 - pre 121 meseci
Hvala na odgovoru. Imam D2007, nema tog u njegovom helpu, ali ima na net-u.
Pokušao sam ugraditi, javlja mi grešku, a nemam se vremena igrati s tim jer mi ovo moje radi. Kad riješim projekt pokušat ću ovo ugraditi.

 
Odgovor na temu

komplikator
Programer / sys. inženjering
CRO

Član broj: 29755
Poruke: 158
*.adsl.net.t-com.hr.

ICQ: 13387003


+8 Profil

icon Re: Custom control Access violation01.04.2014. u 11:11 - pre 121 meseci
Kako ti je Rajko napisao, radi se o tome da nisi ubio veze te kontrole prema objektima koje si u njoj povezao. Također, kao što ti je već napisao, Delphi ima ugrađeni Notiffication mehanizam koji kontroli govori nalazi li se u kreiranju, destrukciji, dodavanju ili uklanjanju s forme i sl.

Nešto na brzinu dosta vezano uz svoj problem možeš vidjeti na: http://delphi.about.com/library/bluc/text/uc083101a.htm , a ako uhvatiš vremena potraži dokumentaciju iz doba D7 gdje je bio developers manual for creating delphi controls. Ako ne nađeš javi pa ću ti poslati svoj, negdje mi je valjda još na disku.

Kod fokusa očekuj probleme koje ćeš vjerojatno riješiti preko RTTI-a. i GetPropValue i sl. Bar sam ih ja imao (radio sam mehanizam koji sam fokusira zadnju fokusiranu kontrolu kod MTI interfejsa koji su mutavi po pitanju fokusa, presretanja poruka, shortcuta, promjena na formi i sl. i pozicioniranja odabrane prve kontrole) i ako ništa drugo pokušaj kod povezivanja kontrole kontrolu prvo castati kao wincontrol ili još bolje preko RTTI-a. provjeriti ima li canfocus svojstvo i je li je True da ne povezuješ sve i svašta i kasnije hvataš duhove.
God is real unless is declared as integer.
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Custom control Access violation02.04.2014. u 12:39 - pre 121 meseci
Nisam proučavao da li je to baš ono šta ti treba, ali mislim da je:

Advanced editing
F
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Custom control Access violation

[ Pregleda: 1889 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.