Page 1 of 2 1 2 LastLast
Results 1 to 15 of 29

Thread: Datasource OnDataChange blijft werkloos

  1. #1
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833

    Question Datasource OnDataChange blijft werkloos

    Nu ben ik al dagen aan het wroeten om te ontdekken dat de OnDataChange van mijn DataSource niet afgevuurd wordt.

    Ik wijzig programmatorisch de waarde van een veld in mijn CDS. Je zou verwachten dat de OnDataChange van de Datasource die de CDS als DataSet gebruikt, afgevuurd wordt. Niet dus.

    Het vervelende is dat bij een testprojectje alles wél goed verloopt.

    Wat kan ervoor zorgen dat de DataSource NIET verwittigd wordt dat data gewijzigd is?
    De Datasource.DataSet blijft mooi gekend, dus het is niet dat de DataSource de DataSet plots niet meer kent.

    Ik vind niet direct een property TClientDataSet.VergeetDatasources...

    Iemand een idee?
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  2. #2
    Ik weet het niet zeker, maar misschien gebruik je een DisableControls?
    Marcel

  3. #3
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Wat Marcel zegt klopt; wanneer je iets gebruikt als:
    Delphi Code:
    1. procedure TMyForm.MyBtnClick(Sender: TObject);
    2. begin
    3.   DataSet.DisableControls;
    4.   Try
    5.     DataSet.Append;
    6.     DataSet.FieldByName('ZomaarEenVeld').AsString := 'NLDelphi';
    7.     DataSet.Post;
    8.   Finally
    9.     DataSet.EnableControls;
    10.   End;
    11. end;
    ...dan kun je wachten op enig event tot je een ons weegt...

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  4. #4
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    Driewerf helaas, het is geen DisableControls.
    Ik heb alle DisableControls in commentaar gezet. En toch wordt de DataSource niet verwittigd.

    Kan de toekenning van een waarde door
    delphi Code:
    1. .FieldByName('Veld').Asstring := ...
    fout lopen zonder error?

    Ik gok maar wat, want mijn inspiratie is opgebruikt. (zucht)
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  5. #5
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Hmmm, om te testen kun je natuurlijk dit tussen je code zetten:
    Delphi Code:
    1. Begin
    2.   // Wat code
    3.   If MyDataSet.ControlsDisabled Then
    4.     ShowMessage('De controls zijn disabled');
    5.   // Evt. nog meer van je code
    6. End;
    Misschien dat iets anders DisableControls heeft aangeroepen (buiten je schuld om)?

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  6. #6
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833

    Nu nog gekker...

    Ik stop niet met testen tot ik een ons weeg (hoewel ik sinds mijn geboorte een ons weeg, en zelfs veel meer, maar dit geheel terzijde).

    Hier wordt het veld gewijzigd:
    delphi Code:
    1. procedure TSongForm.ToonNieuweArcDes(NieuweCode: string);
    2. begin
    3.   if SongDM.NlDelphiSet.State in [dsEdit, dsInsert] then
    4.     begin
    5.       Datasource1.DataSet.FieldByName('MPC_ArcCod').AsString := NieuweCode ;  <-- hier gaat het fout

    waarbij SongDM de datamodule is waar de DataSet "NlDelphiSet" staat.
    Nu blijkt de toekenning een fout te geven (zie bijlage). ["NLDelphiSet dataset not in editmode"]

    Delphi vindt dus dat NlDelphiSet niet in Editmode staat, terwijl ik er nét op getest heb. En er is heus maar één set in heel mijn applicatie die NlDelphiSet heet. Ik heb die set om te testen speciaal een ietwat 'aparte' naam gegeven.

    Het 'lijkt' alsof DataSource.DataSet een andere dataset is (een copie?) met krak dezelfde naam als SongDM.NlDelphiSet.
    Dat zou verklaren waarom een wijziging in SongDM.NlDelphi de OnDataChange van DataSource.Dataset niet triggert, omdat het een andere set is?!!

    Maar hoe kan dat nu? Er is echtig techtig maar één NlDelphiSet op heel mijn computer!!
    Attached Thumbnails Attached Thumbnails Click image for larger version. 

Name:	Delphi.jpg 
Views:	150 
Size:	15.7 KB 
ID:	5696  
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  7. #7
    Is SongDM.NlDelphiSet wel de NlDelphiSet? Als je die in designmodus aanmaakt, en later overschrijft met NlDelphiSet := TMijnDataSet.Create(Self);, blijft de oorspronkelijke dataset degene die gebruikt wordt voor designtime-gekoppelde datasources. Een andere mogelijkheid is dat je meerdere instanties van je datamodule hebt aangemaakt.

    SongDM.NlDelphiSet.Name en Datasource1.DataSet.Name zouden beide 'NlDelphiSet' moeten zijn, als een dat niet is dat fout. Evenzo zouden SongDM.NlDelphiSet.Owner en Datasource1.DataSet.Owner beide SongDM moeten zijn, als een dat niet is is dat ook fout.

  8. #8
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ah... je krijgt een foutmelding?
    Je oorspronkelijk vraag was waarom een event niet werd afgevuurd...

    Wat mij verbaasd is: waarom roep je in regel 3 hierboven de dataset direct aan en in de regel
    eronder adresseer je hem via de datasource.
    Is daar een bepaalde reden voor?

    Op deze manier weet je zeker dat je fouten in de hand werkt.

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  9. #9
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    Harald, een bak Duvel is onderweg (*)

    De watch list zegt mij:
    SongDM.NlDelphiSet.Owner.Name: 'SongDM_1'
    Datasource1.DataSet.Owner.Name: 'SongDM'

    Nu uitzoeken wie waar waarom in hemelsnaam SongDM_1 maakt?!
    Enig idee waar zoeken?

    Nu kan ik begrijpen waarom de opstart zo lang duurt, als Delphi alles dubbel aanmaakt!

    (*) Stuur me een privé-bericht met je adres en ik bezorg het je, ik meen het!
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  10. #10
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Hé... Harald was maar enkele seconden sneller dan ik!!!



    Top dat je het gevonden heb
    TMemoryLeak.Create(Nil);

  11. #11
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    Quote Originally Posted by VideoRipper View Post
    Ah... je krijgt een foutmelding?
    Je oorspronkelijk vraag was waarom een event niet werd afgevuurd...

    Wat mij verbaasd is: waarom roep je in regel 3 hierboven de dataset direct aan en in de regel
    eronder adresseer je hem via de datasource.
    Is daar een bepaalde reden voor?

    Op deze manier weet je zeker dat je fouten in de hand werkt.

    Greetz,

    Peter.
    Peter, ik pas mijn code aan om uit te vlooien waar wat verkeerd gaat.
    Oorspronkelijk zag ik inderdaad dat het event OnDataChange niet opgeroepen werd. Ik bleef echter niet gewoon bij de gebakken peren (of op mijn krent) zitten. Ik zocht verder.

    Ondertussen trachtte ik te zoeken of de dataset die de datasource gebruikt wel dezelfde is als deze die in de datamodule staat.

    Harald heeft mij doen aantonen dat het mogelijks toch twee verschillende datasets zijn.
    Dat dit gebeurt gaat mijn petje en mijn verstand te boven.

    Sorry voor de verwarring: het is nog steeds hetzelfde probleem, maar door verdere testen komen meer specifieke problemen aan de oppervlakte.
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  12. #12
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    Quote Originally Posted by VideoRipper View Post
    Top dat je het gevonden heb
    Het heb ik nog niet gevonden.
    Nu nog trachten te vinden welke snoodaard SongDM_1 aanmaakt.
    Tuurlijk dat ik geen twee instanties wil van een datamodule.
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  13. #13
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    HOER
    A!

    In de project source stond om een onverklaarbare en *@#?º& (gecensureerd) reden TWEE maal
    Delphi Code:
    1. Application.CreateForm(TSongDM, SongDM);

    Ik had nooit gedacht het oorspronkelijk probleem in een ander melkwegstelsel te gaan zoeken.

    Ik overweeg een klacht neer te leggen bij Embarcadero om op z'n minst de kosten van de bak Duvel te kunnen recupereren.
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  14. #14
    Die mag je houden hoor, maar fijn dat het werkt

  15. #15
    Les 1 Delphi (OK, misschien iets verder ). Altijd de publics verwijderen uit je forms, frames en datamodules. Er mag maar één unit zijn die de automatisch aangemaakte public heeft en dat is je mainform. Voor de rest moet je zelf controle houden over wat wanneer wordt aangemaakt en door wie.
    Marcel

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •