[delphi] pagecontrol runtime updaten

Pagina: 1
Acties:

  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
Ik heb een form gecreëerd dat runtime (bij oncreate) een procedure aanroept
Die procedure creëert vervolgens een pagecontrol en dat wordt gevuld met labels en velden door middel van gegevens die uit een SQL Server worden gehaald.

Op het moment dat ik iets wil toevoegen binnen een Tabsheet van dat pagecontrol, roep ik een form aan met F7 en kan de gebruiker kiezen in welke tabsheet de gegevens moeten komen te staan.

Echter het lukt mij niet om runtime de wijzigingen naar het Pagecontrol form door te voeren. Ik heb geprobeerd het pagecontrol component te destroyen en daarna de procedure opnieuw uit te voeren om de nieuwe velden in de pagecontrol te kunnen laten zien zonder dat je het form opnieuw moet laden.

Dit werkt echter niet; Ik krijg een access violation.

Heeft iemand enig idee? Kan iemand me op weg helpen?

Alvast bedankt

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 23:27

Creepy

Tactical Espionage Splatterer

Hoe voeg je de controls @ runtime toe?
Heb je wat code om te laten zien?
Op welke regel in die code crasht het?
Heb je erop gelet dat je de parent property van het @runtime aangemaakte object moet zetten? (de parent is het object waar het net aangemaakte object op wordt getoond. De owner property is niet hetzelfde)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
Het runtime creëeren is het probleem niet. Dit lukt zonder fouten.
Het probleem is echter dat ik het niet voor elkaar krijg om op het moment dat ik op een button klik om een wijziging door te voeren, het ook daadwerkelijk gebeurd runtime.

Ik wil dus mijn form updaten en dat lukt niet. Ik dacht eerst aan repaint. maar dat werkt ook niet. Zodra ik mijn applicatie dan opnieuw start zijn de wijzigingen wel doorgevoerd

Verwijderd

Bestudeer ondestaande simpele stukje code eens:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm1.CreatePageControl
begin
  Self.InsertControl(TPageControl.Create(Self));
end;

procedure TForm1.CreateTabSheet
var
  I: Integer;
begin
  for I:=0 to Self.ControlCount-1 do
    if Self.Controls[I] is TPageControl then
      TPageControl(Self.Controls[I]).InsertControl(TTabSheet.Create(Self));
end;

procedure TForm1.CreateButton
var
  I: Integer;
begin
  for I:=0 to Self.ControlCount-1 do
    if Self.Controls[I] is TPageControl then
      TPageControl(Self.Controls[I]).ActivePage.InsertControl(TButton.Create(Self));
end;

Misschien steek je er iets van op.

  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
Aan hvdberg: Thnx voor je advies maar het probleem is niet de het creëeren van de controls.

ik heb immers al een draaiende app, die de controls runtime creëert, misschien leg ik het zelf verkeerd uit.

Ik wil dat die controls en de waarden daarin geupdate worden

Screenshot:

Afbeeldingslocatie: http://people.zeelandnet.nl/pdewitte/frmVBruntime.jpg

Je ziet links het form dat runtime zijn controls creëerd bij de procedure FormCreate

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
For tabteller := 1 to adoquery1.recordcount do
   begin
       with TTabSheet.Create(Self) do
       begin
        //creëren pagecontrol
        j:=tabteller-1;
        PageControl := pgcontrol;
        //Caption := adoquery1.fieldbyname('TabNaam').AsString;
        PageControl.Pages[j].Caption:=trim(adoquery1.fieldbyname('TabNaam').AsString);
        //einde creëren pagecontrol


        //scrollbox maken
        scBox := TScrollBox.Create(PageControl.Pages[j]);
        scBox.Name := 'scBox'+ trim(adoquery1.fieldbyname('TabID').AsString);
        scBox.Parent := PageControl.Pages[j];
        scBox.Align := alClient;
        scBox.BorderStyle := bsNone;
       //lus maken om tabs te vullen

       //vullen van juiste tab met de juiste gegevens
      algemaakt:=true;
      x:= 0;
      zz:=0;
      offsetx := 175;
      offsety := 0;
      t:=false;
      //opvragen gegevens uit de juiste tabel
      frmVoorblad.ADOQuery2.Close;
      frmVoorblad.ADOQuery2.SQL.Clear;
      frmVoorblad.ADOQuery2.SQL.Add('select * from '+trimright(ADOQuery1.fieldbyname('TABID').AsString)+' ORDER BY groep_id');
      frmVoorblad.ADOQuery2.Open;

      veldoffset := 5;
      veldteller := 0;
      grBoxHoogte := 0;
        while not ADOQuery2.Eof do
          begin

            //group box maken


            grBox := TGroupBox.Create(scbox);
            grBox.Name := 'grBox'+ trim(adoquery1.fieldbyname('TabID').AsString)+ IntToStr(ADOQuery2.fieldbyname('Groep_id').asinteger);
            grBox.Parent := ScBox;
            grbox.Caption := 'Groep ' + IntToStr(ADOQuery2.fieldbyname('Groep_id').asinteger);

            grBox.Top := zz +offsety +  grBoxHoogte + 15;
            zz:=grbox.top;
            grBox.Height := 0;
            grBox.Left := 25;
            grBox.PopupMenu := PopupMenu1;
            //einde group box maken

            //group box vullen
            groep := ADOQuery2.fieldbyname('Groep_id').asinteger;
            i := 0;
            while (ADOQuery2.fieldbyname('Groep_id').asinteger = groep) and (not ADOQuery2.Eof) do
              begin
                grBox.Width := 400;
                veld := TEdit.create(grBox);
                labelnaam := TLabel.create(grBox);
                grBox.caption := ' ' + ADOQuery2.fieldbyname('Groep_naam').asstring;
                veld.Name:='veld'+inttostr(veldteller);
                labelnaam.Name:='labelnaam'+inttostr(veldteller);
                veld.Parent := grBox;
                labelnaam.Parent := grBox;
                veld.Top := veldoffset + (i * veld.Height) + 15;
                labelnaam.Top := veldoffset + (i * veld.Height) + 15;
                veld.Left := 60 + 175;
                labelnaam.Left := 40;
                grBox.Height := grBox.Height + veld.Height;

                veld.text := ADOQuery2.Fieldbyname('Inhoud').asstring;
                labelnaam.caption := ADOQuery2.Fieldbyname('Naam').asstring + ' ' + ADOQuery2.Fieldbyname('Memo').asstring;

                  adoquery2.Next;

                inc(veldteller);
                inc(i);

              end;

            grBox.Height := grBox.Height + veld.Height + 10;
            grBoxHoogte := grBox.Height;
            //einde group box vullen


dit is maar een stukje dus...
De code is nog niet optimaal ik ben een beginner dus kraak me niet af op mijn eventuele chaotische werkwijze

Ok nu kun je in het rechterform
een keuze uit de juiste tab + groep maken
en er een nieuw label + veld op toevoegen

ik wil alleen dat deze wijzigingen meteen runtime doorgevoerd worden naar m'n hoofdform en dat krijg ik dus niet voor elkaar
Ik hoop dat het nu een stuk duidelijker is.

Alvast bedankt

Verwijderd

OK, maar wat doe je bij het updaten van het control, als je op de knop toevoegen duwt?
Want dat lijkt de code hierboven niet te doen.
Sla je de waarden in de database op en wil je dan de form opnieuw laden OF wil je de bestaande bijwerken? Als je wilt bijwerken moet je daarvoor de code nog schrijven, als je opnieuw wilt laden is het waarschijnlijk het makkelijkste om eerst de pagecontrol te verwijderen (.free) en dan bovenstaande functie opnieuw aanroepen.

  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
Meer staat er nog niet onder de button voegtoe :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   Adoquery1.Close;
   Adoquery1.sql.clear;
   adoquery1.SQL.add('select Groep_ID as groepid from '+combobox1.text+' where Groep_Naam = '''+combobox2.Text+ ''';');
   adoquery1.Open;

   AdoTable1.Close;
   AdoTable1.TableName := Combobox1.Text;
   ADOTable1.Active:=true;
   adOTable1.Insert;

   AdoTable1.FieldValues['Groep_ID'] := adoquery1.fieldbyname('groepid').asstring;
   AdoTable1.FieldValues['Groep_naam'] := combobox2.text;
   AdoTable1.FieldValues['Naam'] := edNaam.Text;
   AdoTable1.FieldValues['Inhoud'] := edInhoud.Text;
   AdoTable1.Post;



Hij update het dus wel al naar de DB, alleen moet ik het programma opnieuw starten om de wijzigingen in het form te zien. En dat is vrij irritant.

Ik krijg het echt niet voor elkaar om runtime dat form te wijzigen.

Met .free haal ik dat pagecontrol wel weg. Maar als ik mijn procedure maakveld opnieuw aanroep krijg ik een access violation

[ Voor 19% gewijzigd door whitecom op 12-03-2004 09:46 ]


Verwijderd

Had niet veel zin om al die code door te gaan spitten maar heb je al een .requery gedaan?

Verwijderd

Ik zie niet precies wat je doet, maar je moet alle objecten die je in de create functie aanmaakt verwijderen (.free), en niets meer. En daarna kan je de create functie opnieuw aanroepen. (evt met een requery?)

  • whitecom
  • Registratie: Februari 2004
  • Laatst online: 06-08-2005
Ik heb dus een procedure maakveld.
Die creëert runtime groupboxes, met daarin inhoud die uit een db gehaald wordt.
als je nu iets wilt toevoegen wordt er een 2e form geopend. (Het kleine gele form rechts op het bovenstaande plaatje).

Het kleine stukje code wat ik gepost heb was van de Button voegtoe, dat had ik wellicht iets duidelijker moeten vermelden

ik heb .free functie wel voor elkaar alleen kan ik dan de procedure maakveld niet opnieuw aanroepen omdat de compiler zegt dat de groupboxes e.d. al bestaan.

Als ik die pagecontrol free, haalt ie toch alles weg? dan moet ik toch gewoon maakveld aan kunnen roepen om de gegevens runtime te updaten?

Verwijderd

whitecom schreef op 12 maart 2004 @ 12:14:
Ik heb dus een procedure maakveld.
Die creëert runtime groupboxes, met daarin inhoud die uit een db gehaald wordt.
als je nu iets wilt toevoegen wordt er een 2e form geopend. (Het kleine gele form rechts op het bovenstaande plaatje).

Het kleine stukje code wat ik gepost heb was van de Button voegtoe, dat had ik wellicht iets duidelijker moeten vermelden

ik heb .free functie wel voor elkaar alleen kan ik dan de procedure maakveld niet opnieuw aanroepen omdat de compiler zegt dat de groupboxes e.d. al bestaan.

Als ik die pagecontrol free, haalt ie toch alles weg? dan moet ik toch gewoon maakveld aan kunnen roepen om de gegevens runtime te updaten?
Nee, want hoewel je pagecontrol de parent is van de controls, is deze niet de owner. Heb je al naar .requery gekeken?
Pagina: 1