Avatar billede slowaterz Nybegynder
01. april 2004 - 11:41 Der er 8 kommentarer og
1 løsning

Nummerering af objekter på en form

Jeg har en TPageControl med syv faneblade. På hvert faneblad er der som minimum et TDBGrid. Jeg kan derfor få fat i den viste DBGrid og dets egenskaber v.h.a. "PageControl1.ActivePage.Controls[0]".

Problemerne starter, når der er flere objekter på et faneblad. Selvom mit DBGrid er oprettet som det første element, er det ikke sikkert, det har nummer 0 i Objects[] listen. Knapper, combobokse og radiogrupper kan jeg godt få til at makke ret, men lige så snart jeg smider en Label på fanebladet, får den index 0.

Kan man virkeligt ikke styre sådan selv ?
Avatar billede borrisholt Novice
01. april 2004 - 11:59 #1
jow da det er ikke så svære :

procedure TFormPony.Hest; //Den procedure hvor du skal bruge dit dbGrid
var
  aGrid : TdbGrid;
  i : Integer;
begin
  aGrid := nil;
  for i := 0 to PageControl1.ActivePage.ControlCount -1 do
  begin
    if (aGrid = nil) and (PageControl1.ActivePage.Controls[i] is TDBGrid) then
    aGrid =  TDBGrid(PageControl1.ActivePage.Controls[i]);   
  end;

  if (aGrid = nil)  then
    showMessage('nogen laver gris !!');
end;

Nok ikke helt fejlfrit, men fruit fra leveren
Jens B
Avatar billede slowaterz Nybegynder
01. april 2004 - 12:30 #2
Det kunne jeg selvfølgeligt godt gøre ...

Jeg vil nu hellere selv styre nummereringen under design forløbet.

Og hvorfor vil en TLabel altid være den første ?
Avatar billede borrisholt Novice
01. april 2004 - 12:38 #3
Nummeringen er den rækkefølge du har sat komponenterne på !

Jens B
Avatar billede slowaterz Nybegynder
01. april 2004 - 12:58 #4
Det troede jeg også - derfor oprettede jeg konsekvent en DBGrid, som det første på hver TabSheet. Men efter jeg puttede en TLabel på en af dem, resulterede et kald til  "TDBGrid(PageControl1.ActivePage.Controls[0]).DataSource"  i en Access Violation fejl.
Ved at bruge  ShowMessage(PageControl1.ActivePage.Controls[0].ClassName);  fandt jeg frem til den TLabel var nummer 0.
Avatar billede borrisholt Novice
01. april 2004 - 13:01 #5
Det er stadig en skodløsning at hardcode nummere !
Avatar billede slowaterz Nybegynder
01. april 2004 - 13:30 #6
Jeg har endda prøvet at lave et "tomt" program til testformål.
Jeg har ikke prøvet med ALLE komponenter, men TLabel vil i hvert fald altid overtage den første plads. Og lige så snart man sletter den, så får TDBGrid sin plads 0 igen ...
Avatar billede borrisholt Novice
01. april 2004 - 13:31 #7
slowaterz>> Det er SLAM programmering du har gang i !! hold straks op med det og lav det rigtigt !

Jens B
Avatar billede hrc Mester
01. april 2004 - 23:17 #8
Lidt de ord jeg også tænkte, borrisholt.

Kom til at tænke på en løsning som jeg bryggede sammen (og jeg håber at du forstår og måske kan drage nytte af det - for det virkede ret godt hos mig). Jeg lavede en TBaseFrame (en nedarving af TFrame) der indeholdt fællesmængden af komponenter, properties og funktioner (en pseudo polymorfisk tilgang...).

Dertil tilføjede jeg de abstrakte procedurer som nedarvingen af TBaseFrame skulle implementere (funktionalitet som basen kun kan antage at nedarvinger skal implementere).

Du kunne sagtens lave en, nu kommer sætningen, "en objektorienteret tilgang", hvor du slipper for at tilgå komponenterne på array-måden.

I øvrigt, bruger du <alt-f12> på en form, så står TLabels rigtignok altid forrest.

Mine nedarvede TFrames placerede jeg på hver sin TabPage og da de hver isæt vidste hvad de kunne, så var der minimal kodning da først objekterne var lavet.
Avatar billede slowaterz Nybegynder
02. april 2004 - 08:46 #9
Jeg tror, vi snakker forbi hinanden. Jeg skulle nok have formuleret spørgsmålet som "Hvordan sorterer Delphi visuelle komponenter: udelukkende efter oprettelses ordenen eller er der nogen regler ?" Svaret er vist : lidt af hvert.

hrc <<<<< Jeg har også lagt mærke til, at TLabel(s) altid kommer til at stå først i formens sourcekode. Jeg har forsøgt at flytte erklæringerne manuelt, men Delphi flytter dem bare tilbage.

Jens B <<<<< Jeg er skam enig med dig i, at det er noget skidt at "hardcode" noget som helst. I starten, da mit program kun indeholdte en DBGrid på hvert faneblad, var det bare den nemmeste løsning at kalde  Controls[0]  direkte. Og jeg bliver nok nødt til at implementere koden fra dit eksempel for at slippe for problemerne i fremtiden. Derfor får du også de udlovede point.
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