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
hschmid67

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

AW: Datenkomponenten verlieren Datasource

  Alt 15. Dez 2016, 09: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.811 Beiträge
 
Delphi 12 Athens
 
#2

AW: Datenkomponenten verlieren Datasource

  Alt 15. Dez 2016, 09: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
459 Beiträge
 
Delphi 12 Athens
 
#3

AW: Datenkomponenten verlieren Datasource

  Alt 15. Dez 2016, 12: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
 
#4

AW: Datenkomponenten verlieren Datasource

  Alt 15. Dez 2016, 13: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 13:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Datenkomponenten verlieren Datasource

  Alt 15. Dez 2016, 14: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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (15. Dez 2016 um 15:05 Uhr)
  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, 18: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.
75 Beiträge
 
Delphi 12 Athens
 
#7

AW: Datenkomponenten verlieren Datasource

  Alt 16. Dez 2016, 04: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
Benutzerbild von himitsu
himitsu

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

AW: Datenkomponenten verlieren Datasource

  Alt 17. Dez 2016, 22:11
Zitat von mm1256;1356271Wenn Delphi läuft [CODE:
FindWindow('TAppBuilder', Nil) > 0;[/CODE] dann habe ich im OnShow bei Bedarf diese procedure aufgerufen
MSDN-Library durchsuchenIsDebuggerPresent = läuft das Programm grade im Debugger?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz