Page 2 of 2 FirstFirst 1 2
Results 16 to 29 of 29

Thread: Datasource OnDataChange blijft werkloos

  1. #16
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    Hier volg ik je niet, Marcel. Kan aan de Duvels liggen die ik heb mogen houden
    1. Alle forms, frames, en datamodules zonder public methods en properties?
    2. Wat is het verband met een application waarin de project source twee maal de creatie van dezelfde datamodule staat?
    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. #17
    Nee sorry. Niet de publics in de classe, maar de public variabele. Die wordt door Delphi misbruikt om al je forms en datamodules al aan te maken bij het opstarten (als je die instelling fout hebt staan) en het risico is aanwezig dat je er zelf ook gebruikt van maakt.

    Weghalen dus die regel zodat Delphi het niet al bij het opstarten kan gaan aanmaken. En zeker geen twee keer .

    delphi Code:
    1. unit Unit17;
    2.  
    3. interface
    4.  
    5. uses
    6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    7.   Dialogs;
    8.  
    9. type
    10.   TForm17 = class(TForm)
    11.   private
    12.     { Private declarations }
    13.   public
    14.     { Public declarations }
    15.   end;
    16.  
    17. // DEZE DUS:
    18. var
    19.   Form17: TForm17;
    20.  
    21. implementation
    22.  
    23. {$R *.dfm}
    24.  
    25. end.
    Marcel

  3. #18
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    Deze variabelen in de Application declareren dan?
    Want wat is het verschil om deze in het mainform te declareren en creëren, in plaats van in het program?

    Delphi Code:
    1. program Project1;
    2. uses
    3.   Forms,
    4.   Unit1 in 'Unit1.pas' {Form1},
    5.   Unit2 in 'Unit2.pas' {DataModule2: TDataModule};
    6. {$R *.res}
    7. var
    8.   Form1: TForm1 ;
    9.   DataModule2 : TDataModule2 ;
    10. begin
    11.   Application.Initialize;
    12.   Application.CreateForm(TForm1, Form1);
    13.   Application.CreateForm(TDataModule2, DataModule2);
    14.   Application.Run;
    15. end.
    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

  4. #19
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Ik denk dat Marcel bedoelt dat je alleen je form moet declareren in de form waar je deze oproept. In de dpr worden n.l. al de schermen aangemaakt tijdens opstarten van je applicatie. Door alleen je mainform (en e.v.t. je main datasource) te laten declareren, wordt er verder niets met de andere forms gedaan.
    Dan is het een kwestie van

    delphi Code:
    1. procedure mainform.StartForm;
    2. var Form : TEigenForm;
    3. begin
    4.   form := TeigenForm.Create(nil);
    5.   try
    6.     form.showmodal;
    7.   finally
    8.     form.free;
    9.   end;
    10. end;

    Dus zelf bepalen wanneer je form gedeclareerd wordt.
    Delphi is great. Lazarus is more powerfull

  5. #20
    John, ik ben trots op je

    Inderdaad, iedereen maakt wat hij nodig heeft en ruimt dat ook weer op als hij het niet meer nodig heeft.
    Marcel

  6. #21
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Het is ook wat netter qua geheugengebruik.

    Hoe vaak ik geen projecten onder ogen krijg waar alle forms en dialoogvensters automatisch worden
    aangemaakt in de dpr, terwijl ze zelden gebruikt worden, laat staan allemaal tegelijkertijd

    Persoonlijk ben ik meer een liefhebber van een class function als dit voor een dialoogvenster, welke
    modal moet worden getoond:
    Delphi Code:
    1. Class Function TSomeDialog.Execute(Var SomeParameter : TSomeType) : Boolean;
    2. Begin
    3.   With TSomeDialog.Create(Nil) Do
    4.     Try
    5.       // Stel allerlei dinge in, afhankelijk van de parameters...
    6.       Result := ShowModal = mrOk;
    7.       If Result Then
    8.         // Stel nieuwe parameter waarden in...
    9.     Finally
    10.       Free;
    11.     End;
    12. End;
    Op deze manier blijft alles geordend in de eigen unit.

    Het is ook aan te raden om de standaard variabele in het Interface-gedeelte te commenten zodat
    er geen twijfel bestaat over het wel of niet bestaan van deze globale variabele; de compiler komt
    automatisch met een error wanneer hij ergens wordt aangesproken, terwijl hij nergens aangemaakt
    is (of hoort te zijn, zoals in de dpr).

    Ergens anders aanroepen doe je dan met:
    Delphi Code:
    1. Procedure TMainForm.SettingsBtnClick(Sender : TObject);
    2. Begin
    3.   If TSomeDialog.Execute(MyValue) Then
    4.     ShowMessage('De nieuwe waarde is: ' + MyValue)
    5.   Else
    6.     ShowMessage('Alles blijft bij het oude');
    7. End;

    Maar natuurlijk heeft ieder zo'n z'n voorkeuren

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  7. #22
    Jan
    Join Date
    Oct 2007
    Location
    Mijdrecht
    Posts
    906
    Mijn voorkeur is KISS (keep it stupid simple). En dat is dus zoveel als mogelijk de code gebruiken die delphi genereert. En niet proberen aan (sub)optimalisaties te werken. Tenzij je hobbyist bent natuurlijk.

  8. #23
    Dat kan, maar als je een project hebt met een paar honderd forms en datamodules die bij het opstarten van je app allemaal aan worden gemaakt heb je een performance probleem en vind ik het zeker niet KISS meer.
    Marcel

  9. #24
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ik vind het juist niet KISS om de compiler alles te laten regelen.
    Oké, voor de programmeur wellicht makkelijker, maar niet simpeler; daar waar de eerste
    S voor staat.

    Het lokt ook constructies als dit uit (wat ik zelf mega-lelijk/onwenslijk vind):
    Delphi Code:
    1. Procedure TForm1.EenMethod;
    2. Begin
    3.   If (Form28.Label12.Caption = 'NLDelphi') Then
    4.     Form42.ComboBox11.Items.Add('Beschikbaar');
    5. End;
    Wat nu als Form28 en/of Form42 (nog) niet bestaan, bijvoorbeeld wanneer TForm1
    de main-form is en EenMethod OnFormCreate()?
    (Dit alles afgezien van het feit dat de componentnamen niets zeggen natuurlijk)

    Onder KISS versta ik: "Schrijf met vlag en wimpel, maar hou het simpel".
    En dus niet: "Maak jezelf er met een Jantje van Leiden van af en doe zo min mogelijk"

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  10. #25
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    Mensen, dit is wel MIJN topic hé!

    Het probleem was dat een datasource niet reageerde op de wijzigingen in een dataset, omdat de datamodule twee maal gecreëerd werd door de dpr (programma, project).
    De fout is gevonden, het programma verbeterd, en het resultaat is een dubbel zo snelle opstart

    Concrete tips over het beheren van de creatie van datamodules mogen hier gepost worden.
    Ik zie geen verschil tussen de creatie van datamodules in de het programma (project) en de creatie van datamodules in de mainform.
    Iemand?
    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

  11. #26
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Je hebt helemaal gelijk, Sam

    *In theorie* zou een form of datamodule maar één keer aangemaakt moeten
    worden wanneer deze in de DPR staat.
    Delphi Code:
    1. begin
    2.   Application.Initialize;
    3.   Application.CreateForm(TMainForm, MainForm);
    4.   Application.CreateForm(TSomeModule, SomeModule);
    5.   Application.Run;
    6. end.
    Waarom hij dan een extra kopie maakt is mij geheel niet duidelijk.

    Ligt het misschien aan de gebruikte Delphi-versie, is het een bekende bug?
    TMemoryLeak.Create(Nil);

  12. #27
    Quote Originally Posted by VideoRipper View Post
    *In theorie* zou een form of datamodule maar één keer aangemaakt moeten
    worden wanneer deze in de DPR staat.
    Niet als de CreateForm tweemaal in de dpr staat.
    Quote Originally Posted by SamWitse View Post
    In de project source stond om een onverklaarbare en *@#?º& (gecensureerd) reden TWEE maal
    Delphi Code:
    1. Application.CreateForm(TSongDM, SongDM);

  13. #28
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    De vraag is dus nu: hoe komt de tweede entry daar dan?
    Vanzelf?

    Ik kan me haast niet voorstellen dat, welke Delphi versie dan ook, per ongeluk neerzet:
    Delphi Code:
    1. begin
    2.   Application.Initialize;
    3.   Application.CreateForm(TSongDM, SongDM);
    4.   Application.CreateForm(TSongDM, _SongDM);
    5.   Application.Run;
    6. end;

    TMemoryLeak.Create(Nil);

  14. #29
    Die _SongDM zou ook nog gewoon SongDM kunnen zijn natuurlijk. Dan wordt dezelfde datamodule 2x aangemaakt, alleen de laatste staat daadwerkelijk in de variabele. En die krijgt dan ook automatisch de .Name SongDM_1.
    Marcel

Page 2 of 2 FirstFirst 1 2

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
  •