Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Datenkomponenten verlieren Datasource (https://www.delphipraxis.net/191167-datenkomponenten-verlieren-datasource.html)

hschmid67 15. Dez 2016 09:34

Datenkomponenten verlieren Datasource
 
Hallo zusammen,

da diese meine erste Frage hier ist, zunächst ein großer Dank vorneweg für die vielen engagierten Experten und nützlichen Tipps hier!

Kurz zu meiner Person: Ich programmiere mit Delphi (auch beruflich) seit Version 1, viele Projekte mit Delphi 6 und 2007, dann jetzt wieder intensiv seit XE8. Schwerpunkt sind Datenbankanwendungen im Hochschulbereich, meist mit MySQL.

Nun zu meiner aktuellen Frage: In manchen Projekten, seltsamerweise nicht in allen, verschwinden die Verknüpfungen der Datenkomponenten zu den Datasources nach einem erneuten Öffnen des Projekts. Ich habe oft nur ein einfaches Form mit den Komponenten und ein Datenmodul mit den Datasources (und Datasets). Dann binde ich die Datenmodul-Unit in die uses des Mainforms ein. Also, eigentlich nichts Besonderes.

Gibt es etwas, was das Verschwinden der Zuordnung auslöst, oder ist es rein zufällig, wie es mir gerade erscheint? Worauf könnte ich achten? Warum passiert es nicht bei allen Projekten, die so aufgebaut sind?

Bei den Komponenten scheint es egal zu sein, ob sie direkt von Delphi oder von Drittherstellern kommen.

Ich habe schon ein paar Beiträge dazu gefunden, allerdings waren die alle noch in der alten Delphi-IDE, also sehr alt und mit sehr alten Delphi-Versionen (5, 7). Und eine Lösung habe ich da auch nicht gesehen.

Kennt jemand das Phänomen und gibt es Lösungen?

Hoffentlich bin ich hier in der richtigen Rubrik? In der Datenbankprogrammierung konnte ich es nicht speichern, weil es ja keine spezifisches Datenbankproblem ist und ich daher die zusätzlichen Felder nicht ausfüllen konnte.

Viele Grüße
Harald Schmid

Daniel 15. Dez 2016 09:44

AW: Datenkomponenten verlieren Datasource
 
Ich hatte das mal bei einem Delphi2007-Projekt. Sporadisch waren die Datasources weg.
Ich konnte das Problem umgehen, indem ich das Datenmodul zuerst per Hand geöffnet habe und danach dann die davon abhängigen Formulare. Theoretisch sollte das zwar nicht nötig sein, aber naja ... Theorie und Praxis in Einklang zu bringen ist halt immer so eine Sache für sich für sich - auch jenseits von Delphi. ;-)

hschmid67 15. Dez 2016 10:15

AW: Datenkomponenten verlieren Datasource
 
vielen Dank für die schnelle Antwort. Leider hatte ich das schon probiert - und es funktioniert nicht (immer). Manchmal sind trotzdem wieder die Datasources weg. Ziemlich sicher sind sie weg, wenn ich ein weiteres Datanmodul aus einem anderen Projekt noch als Reiter geöffnet habe...

Sherlock 15. Dez 2016 10:22

AW: Datenkomponenten verlieren Datasource
 
Ja, das kommt vor. Umgehen kann man das eigentlich nur, indem man die Datasource im Quellcode, also zur Laufzeit zuweist.

Ein mir bekannter Grund für das Verschwinden der Verbindung ist, wenn man mehrere Projekte hat und gleiche Namen für die Datenmodule verwendet, zB datenmodul.pas :roll:. Dann kann es ganz schnell passieren, wenn man "zur Ansicht" eine "fremde" Form in einem Projekt öffnet, daß diese ihr Datenmodul "verliert".

Sherlock

Papaschlumpf73 15. Dez 2016 13:30

AW: Datenkomponenten verlieren Datasource
 
Möglicherweise ist es auch besser, im Datenmodul nur die DataSets zu halten. Die DataSources können eigentlich auf die einzelnen Formulare. Das kann auch für die Gesamtperformance nützlich sein, wenn die Formulare nur bei Bedarf und nicht schon beim Start der Anwendung erzeugt werden.

In diesem Falle müsste man nur bei FormCreate oder FormShow der DataSource noch das DataSet aus dem Datenmodul zuordnen (falls es verloren gegangen ist). Das erspart dann die Zuweisung zu vielen einzelnen DB-Komponenten.

mm1256 15. Dez 2016 14:09

AW: Datenkomponenten verlieren Datasource
 
Hallo,

das Phänomen hatte ich auch schon des öfteren. Besonders häufig passierte es in einer MDI-Anwendung bei den MDI-Childs. Abhilfe war bei mir die Projektdatei. Hier habe ich die Reihenfolge der Uses-Liste so abgeändert, dass die Datenmodule vor den Formular-Units stehen. Wenn Fenster/Formulare vererbt werden, dann auch die vererbten Fenster/Formulare in der uses-Liste erst nach der Unit aufführen, von welcher sie vererbt wurden.

Ein weiteres Problem kann der Klassenname sein, der in der Uses-Liste mit angegeben sein muss. Beispiel
Code:
  Dat_Kun in 'Data\Dat_Kun.pas' {KunData: TDataModule},
also der Bereich der in den geschweiften Klammern steht. Manchmal ist es mir schon passiert, dass ich ein Formular/Datenmodul umbenannt habe, und der neue Klassenname dann nicht in der Uses-Liste aktualisiert wird. Oder wenn man selber manuell eine Unit mit einem Form/Datenmodul hinzufügt und den Klassennamen nicht angibt. Auch hier kommt Delphi manchmal etwas durcheinander.

Ist ja auch irgendwie verständlich. Irgendwie muss Delphi im Quellcode (in der Uses-Liste der .dpr) erkennen können, ob mit der Unit ein Objekt/Klasse eingebunden werden soll, oder ob es sich "nur" um eine einfache Unit handelt.

himitsu 15. Dez 2016 15:54

AW: Datenkomponenten verlieren Datasource
 
Welchen Fehler ich mit Datenmodulen oft habe:
* im FormDesigner sieht man die Komponente eines Datenmoduls nicht (das Feld im Objektinspector ist leer)
* ABER, wenn man den Fokus in dieses Property stellt,dann ist das plötzlich doch da
> also der FieldEditor (EditText) findet die Komponente und kann den Namen auflösen, aber der DisplayText schafft das nicht.



Es gibt noch zwei Dinge, die man tun kann.

Das Datenmodul in ein Designtime-Package und das in der IDE installieren, damit das Datenmodul permanent geladen ist.
Eigentlich machen das TDataModule von selber, aber funktioniert nicht immer, bzw. die IDE schafft es manchmal nicht das DataModul zu laden oder findet die PAS nicht, wenn das Modul nötig wäre, weil es in einem Property verlinkt wurde ... darum auch der Vorschlag diese DataModul-Unit vorher selber zu öffnen.
Wenn man mit einer Projektgrupper und mehreren Projekten arbeitet, dann das Datenmodul in jedes Projekt aufnehmen. (wenn man gegen Packages kompiliert, wird das dann beim Kompilieren "hoffentlich" wieder aufgelöst und nur einmal einkompiliert)

Und wenn dass auch noch nicht hilft, dann selber dieses Modul als "globale" Variable registrieren.
Delphi-Quellcode:
...

procedure register;

implementation

{$R *.dfm}

class function TIDEHelperModul.FindGlobalModules(const Name: string): TComponent;
begin
  Result := nil;
  if SameText(Name, 'DM1') then Result := UDM1.DM1;
  if SameText(Name, 'DMSys') then Result := USysModule.DMSys;
end;

procedure register;
begin
  RegisterFindGlobalComponentProc(TIDEHelperModul.FindGlobalModules);
end;

initialization

finalization
  UnregisterFindGlobalComponentProc(TIDEHelperModul.FindGlobalModules);

end.
Das war für die Suche in der IDE/FormDesigner.

Und falls das Problem auch zur Laufzeit auftritt (im DFM-Loader), dann kann man dort ebenfalls ein
Delphi-Quellcode:
RegisterFindGlobalComponentProc(FindGlobalModules);
in den Programmstart einbauen.

mm1256 15. Dez 2016 19:50

AW: Datenkomponenten verlieren Datasource
 
Zitat:

Zitat von himitsu (Beitrag 1356243)
Und falls das Problem auch zur Laufzeit auftritt...

Das habe ich immer mit einem Workarround gelöst: Wenn Delphi läuft
Code:
FindWindow('TAppBuilder', Nil) > 0;
dann habe ich im OnShow bei Bedarf diese procedure aufgerufen

Delphi-Quellcode:
procedure CheckDataSourceProps(const Form : TForm);
var
  PInfo: PPropInfo;
  i, Count : Integer;
  L : Longint;
  s : string;
begin
  s := '';
  Count := 0;
  for i := 0 To Pred(Form.ComponentCount) do begin
    PInfo := GetPropInfo(Form.Components[i].ClassInfo,'datasource');
    if Assigned(PInfo) then if (PInfo^.Proptype^.Kind = tkClass) then
    try
      L := Longint(GetPropValue(TObject(Form.Components[i]),'datasource'));
      if L = 0 then begin
        s := s + Form.Components[i].Name+';';
        inc(Count);
        if Count mod 10 = 0 then s := s + #13#10;
      end;
    except
      on E:Exception do begin
        ShowErrMessage('RUFORMCHECK.$45','Komponente prüfen: '+IntToStr(i)+#13#10+E.Message);
        break;
      end;
    end;
  end;
  if s <> '' then begin
    RuMessage('Komponentenprüfung, Property «DataSource». '
               +'Komponenten ohne DataSource:'+#13#10#13#10 + s);
    ClipBoard.asText := 'Komponenten ohne DataSource:'+#13#10 + s;
  end;
end;

hschmid67 16. Dez 2016 05:36

AW: Datenkomponenten verlieren Datasource
 
vielen Dank für Eure Überlegungen, Erfahrungen, Tipps und Code.

Ich werde mal Verschiedenes probieren. Vielleicht ist es eh keine schlechte Gewohnheit, Datasource und Dataset zu trennen, das eine auf dem Form, das andere auf dem Datamodule?

Mal sehen, ob ich dann diese Connection auch verliere. Aber das lässt sich dann sicher leichter in der FormCreate wieder zuweisen, wie wenn ich das jetzt mit jeder Komponente machen muss.

Viele Grüße
Harald

mm1256 16. Dez 2016 10:29

AW: Datenkomponenten verlieren Datasource
 
Zitat:

Zitat von hschmid67 (Beitrag 1356287)
Vielleicht ist es eh keine schlechte Gewohnheit, Datasource und Dataset zu trennen, das eine auf dem Form, das andere auf dem Datamodule?

JEIN, ich persönlich (man mag mich dafür steinigen) halte das für keine gute Idee. Wenn man ausschließen kann, dass mehrere Datasources in verschiedenen Forms gleichzeitig auf ein Dataset zugreifen, dann mag das vielleicht noch funktionieren. Müsste man mal ausgiebig testen, wie sich das im Netzwerk verhält.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz