AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Datenkomponenten verlieren Datasource
Thema durchsuchen
Ansicht
Themen-Optionen

Datenkomponenten verlieren Datasource

Ein Thema von hschmid67 · begonnen am 15. Dez 2016 · letzter Beitrag vom 18. Dez 2016
Antwort Antwort
Seite 1 von 2  1 2      
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
73 Beiträge
 
Delphi 12 Athens
 
#1

Datenkomponenten verlieren Datasource

  Alt 15. Dez 2016, 09:34
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
Harald Schmid
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Datenkomponenten verlieren Datasource

  Alt 15. Dez 2016, 09:44
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
73 Beiträge
 
Delphi 12 Athens
 
#3

AW: Datenkomponenten verlieren Datasource

  Alt 15. Dez 2016, 10:15
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...
Harald Schmid
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#4

AW: Datenkomponenten verlieren Datasource

  Alt 15. Dez 2016, 10:22
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 . Dann kann es ganz schnell passieren, wenn man "zur Ansicht" eine "fremde" Form in einem Projekt öffnet, daß diese ihr Datenmodul "verliert".

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
442 Beiträge
 
Delphi 12 Athens
 
#5

AW: Datenkomponenten verlieren Datasource

  Alt 15. Dez 2016, 13:30
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.
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: Datenkomponenten verlieren Datasource

  Alt 15. Dez 2016, 14:09
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.
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen

Geändert von mm1256 (15. Dez 2016 um 14:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Datenkomponenten verlieren Datasource

  Alt 15. Dez 2016, 15:54
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 RegisterFindGlobalComponentProc(FindGlobalModules); in den Programmstart einbauen.
$2B or not $2B

Geändert von himitsu (15. Dez 2016 um 16:05 Uhr)
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

AW: Datenkomponenten verlieren Datasource

  Alt 15. Dez 2016, 19:50
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;
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
73 Beiträge
 
Delphi 12 Athens
 
#9

AW: Datenkomponenten verlieren Datasource

  Alt 16. Dez 2016, 05:36
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
Harald Schmid
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#10

AW: Datenkomponenten verlieren Datasource

  Alt 16. Dez 2016, 10:29
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.
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr.
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