Avatar billede dakine Nybegynder
14. oktober 2003 - 14:02 Der er 11 kommentarer og
1 løsning

Accessvialation ved TWinControl.Controls

Hej.

Jeg har fået lavet en ændring, der resulterer i en AccessVialation, når man åbner et faneblad og dermed eksekvere følgende linie:

DBNavigatorORS.DataSource := TDBGrid(PageControlData.ActivePage.Controls[0]).DataSource;

Før har Controls[0] været en TDataSource, som DBNavigatoren sættes til at kører på.
Nu har jeg så tilføjet noget mere til det pågældende faneblad. Åbenbart således at min DataSource ikke længere har index 0!

Hvordan styrer man det? Eller sagt på en anden måde.-
Hvordan sætter jeg min TDataSource til igen at være Controls[0], så jeg ikke får en AccessViolation?

Håber en kan give et hint.
Avatar billede doc404 Novice
14. oktober 2003 - 19:57 #1
Det virker som en noget  besynderlig måde at gøre tingene på. Man benytter praktisk taget aldrig Controls til at få fat i tingene med (ja ja.. i nogle tilfælde).

Din DBGrid's datasource må da være sat til et eller andet på et tidspunkt? Og det er den du skal have fat i?
Avatar billede dakine Nybegynder
15. oktober 2003 - 07:30 #2
Jamen hvis det kan gøres på en smartere måde, er jeg bestemt lydhør!

Jeg har en række faneblade, med hver deres DBGrid. Det jeg vil er, at når et faneblad gøres aktivt, skal DBNavigator.DataSource sættes til den DataSource som den pågældende DBGrid på fanebladet kører på.
Med Controls[] kan dette gøres med en linie, men det er måske ikke så hensigtsmæssigt!

Kan man i stedet gøre DataSourcen til child af fanebladet og dermed få sat den DBNavigator? Eller hvordan vil du gøre det?

På forhånd tak.
Avatar billede doc404 Novice
15. oktober 2003 - 08:26 #3
Tja, det er nok den korteste måde at gøre det på - men som du har set, styrter det hvis du ændre på en tabsheet ;-)

Jeg ville nok bruge PageControl OnChange eventet og så lave en case på ActivePageIndex.

procedure TForm1.PageControl1Change(Sender: TObject);
begin
  case PageControl1.ActivePageIndex of
    0 : DBNavigatorORS.DataSource := bla bla 1
    1 : DBNavigatorORS.DataSource := bla bla 2
end;

Du skal dog også sætte den f.eks. i FormCreate, da du ikke får eventet 'første gang'.
Avatar billede dakine Nybegynder
15. oktober 2003 - 08:31 #4
Ja det virker faktisk som en mere solid løsning.

Du har fuldstændig ret i, at korthuset falder sammen, hvis man laver den mindste ændring. Bare jeg tilføjer en simpel Label bryder opstår der Accessviolation.

Jeg laver det om. Tak for hjælpen.

(Hvis du vil have dine velfortjente point skal du lige oprette et svar i stedet for en kommentar).
Avatar billede doc404 Novice
15. oktober 2003 - 09:45 #5
:-;
Avatar billede doc404 Novice
15. oktober 2003 - 09:48 #6
Du kan selvfølgelig også benytte de enkelte TabSheets OnShow event.
Avatar billede dakine Nybegynder
15. oktober 2003 - 12:19 #7
Du får dine point. :o)
Tak for hjælpen.
Avatar billede dakine Nybegynder
15. oktober 2003 - 12:28 #8
Måske du kan hjælpe med næste skridt!

Når det nu ikke er hensigtsmæssig at tilgå komponenter med følgende linie:
with PageControlData.ActivePage.Controls[0] as TDBGrid do

Ved du så hvordan jeg i stedet kan få fat på min TDBGrid på det aktive faneblad?
Avatar billede doc404 Novice
15. oktober 2003 - 20:29 #9
Hvis du blot har tilføjet dine grids ved at placerer dem på tabben, så kan du blot skrive navnet - f.eks. DBGrid1.bla bla eller hvad dine grids nu hedder
Avatar billede dakine Nybegynder
16. oktober 2003 - 08:28 #10
Ja det er jeg klar over. Jeg tænker mere på, hvis jeg nu har f.eks 8 faneblade, der hver har en grid.
Så må man kunne tilgå denne Grid med en linie kode!

Man kan se hvilket faneblad, der er aktivt, og man ved der befinder sig en DBGrid på fanebladet, som child. Den må man kunne tilgå på en smart måde.

Ellers skal jeg skrive den samme linie kode 8 gange. En gang for hver faneblad. Det er det jeg undgå med at benytte Controls[0].
Avatar billede doc404 Novice
16. oktober 2003 - 08:45 #11
Det nemmeste er vel at lave en funktion, der returnere griden.

function GetTabGrid : TDBGrid;
begin
  case PageControl.ActivePageIndex of
    0 : Result := DBGrid1;
    ...
  end;
end;
Avatar billede dakine Nybegynder
16. oktober 2003 - 08:47 #12
Det kunne man gøre!... Smart.

Nu skal jeg nok lade være med at plage dig mere. :o)
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