01. april 2004 - 11:41Der 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.
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
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.
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 ...
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.
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.
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.