Kirjoitetaan ensin apuluokka cKentat, joka hoitelee kontrollien lisäämisen:
unit dynkent; { Purpose: Dynaamisesti lisätä taulun kenttiä paneelin sisälle Author: Vesa Lappalainen Date: 21.08.1996 Usage: Alustus: olion varaus: kentat.cKentat kentat := cKentat.Create(MyPanel); Täyttö: kentat.LisaaKaikki(MyDataSource); Poisto: kentat.Free } interface uses DB, Classes, StdCtrls, DBCtrls, Controls; const MAX_KENTTIA = 20; C_KENTAN_KORKEUS = 0; C_NIMEN_LEVEYS = 60; C_EDIT_LEVEYS = 200; type {----------------------------------------------------------------------------} cKentta = object { Pari: otsikko - tietueen kenttä } nimi : TLabel; edit : TDBEdit; index : integer; end; {----------------------------------------------------------------------------} cKentat = class { Luokka, joka tallettaa monta tieueen kentää esim. Paneliin } private kentat : array [0..MAX_KENTTIA] of cKentta; { Taulukko kentistä } panel : TWinControl; { Panelin, johon kentät luod. } n : integer; { Kenttien lukumäärä } kentan_korkeus, nimen_leveys, edit_leveys:integer; procedure Paikka(var kentta:cKentta); { Vaihtaa kentän paikan ja koon} procedure MuutaKoko; { Vaihtaa kaikk kenttien koot } public constructor Create(p:TWinControl); destructor Destroy; override; procedure Siivoa; { Poistaa kaikki kentät } procedure Lisaa(s:string;data:TDataSource); { Lisää yhden kentän } procedure LisaaKaikki(data:TDataSource); { Lisää kaikki kentät } procedure SetEditLeveys(l:integer); procedure SetNimenLeveys(l:integer); procedure SetKentanKorkeus(h:integer); end; implementation {------------------------------------------------------------------------------} constructor cKentat.Create(p:TWinControl); begin inherited Create; n := 0; kentan_korkeus := C_KENTAN_KORKEUS; nimen_leveys := C_NIMEN_LEVEYS; edit_leveys := C_EDIT_LEVEYS; panel := p; end; {------------------------------------------------------------------------------} procedure cKentat.Siivoa; var i:integer; begin for i:=0 to n-1 do begin kentat[i].nimi.Free; kentat[i].nimi := NIL; kentat[i].edit.Free; kentat[i].edit := NIL; end; n := 0; end; {------------------------------------------------------------------------------} destructor cKentat.Destroy; begin Siivoa; inherited Destroy; end; {------------------------------------------------------------------------------} procedure cKentat.Paikka(var kentta:cKentta); var korkeus:integer; begin korkeus := kentan_korkeus; if ( korkeus <= 0 ) then korkeus := kentta.Edit.Height+1; with ( kentta.nimi ) do begin Left := 10; Width := nimen_leveys; Top := 10 + kentta.index*korkeus; end; with ( kentta.edit ) do begin Left := 10 + kentta.nimi.Left + nimen_leveys; Width := edit_leveys; Top := kentta.nimi.Top; end; end; {------------------------------------------------------------------------------} procedure cKentat.MuutaKoko; var i:integer; begin for i:=0 to n-1 do Paikka(kentat[i]); end; {------------------------------------------------------------------------------} procedure cKentat.Lisaa(s:string;data:TDataSource); begin if ( n >= MAX_KENTTIA ) then exit; kentat[n].nimi := TLabel.Create(panel); with ( kentat[n].nimi ) do begin Caption := s; Parent := panel; end; kentat[n].edit := TDBEdit.Create(panel); with ( kentat[n].edit ) do begin DataSource := data; DataField := s; Parent := panel; end; kentat[n].index := n; Paikka(kentat[n]); inc(n); end; {------------------------------------------------------------------------------} procedure cKentat.LisaaKaikki(data:TDataSource); var i:integer; begin Siivoa; for i:=0 to data.DataSet.FieldCount-1 do Lisaa(data.DataSet.Fields[i].FieldName,data); end; {------------------------------------------------------------------------------} procedure cKentat.SetEditLeveys(l:integer); begin edit_leveys := l; MuutaKoko; end; {------------------------------------------------------------------------------} procedure cKentat.SetNimenLeveys(l:integer); begin nimen_leveys := l; MuutaKoko; end; {------------------------------------------------------------------------------} procedure cKentat.SetKentanKorkeus(h:integer); begin kentan_korkeus := h; MuutaKoko; end; end.