![]() |
Datenbank: SQL Server • Version: 2005 STD • Zugriff über: ADO
Datamodule richtig Frei geben
Hallo,
Ich habe ein kleines Problem. Ich habe mehrere Datamodules in meinem Project und erzeuge die zur Laufzeit mit:
Delphi-Quellcode:
Nun will ich diese beim Beenden der Application wieder freigeben udn auch zwischendrin weil ich untershciedliche Datamoduls für einzelne Bereiche verwende.
DMStart:= TDataModule8.Create(nil);
DMStart.ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Password=yxyxyxyx;Persist Security Info=true;User ID='+Databasename+';Initial Catalog='+Databasename+';Data Source='+Server; DMStart.ADOConnection1.connected:=true; Deshalb will ich nicht so viel offen lassen. Das ganze mache ihc mit :
Delphi-Quellcode:
Nun ist es so das wenn ich das Datamodule erzeugt habe und es im laufe der anwendung free mache ,kracht es am Schluss weil er in die Routine reinrennt.
if DMLagerKA <> Nil then
begin DMLagerKA.ADOConnection1.Connected:=false; DMLagerKA.Free; end; Kann mir da jemand nen Tip geben wie ich das sauber ,elegant Lösen kann ? mfg |
Re: Datamodule richtig Frei geben
Hi,
wenn du an mehreren Stellen deines Programmes das Datamodul freigibst dann solltest du nicht mit
Delphi-Quellcode:
arbeiten.
Free
Objekt.Free prüft intern schon ob das Objekt noch eine Referenz hat (aber nicht ob diese auch gültig ist) angenommen du mach das:
Delphi-Quellcode:
Programm Beenden:
MeinObjekt.Free; // Objekt freigeben
.... ... ..
Delphi-Quellcode:
MeinObjekt.Free; // hier knallst (MeinObjekt hat jetzt noch eine Referenz auf einen Speicherplatz, aber das Objekt ist schon
//freigegeben. Du solltest besser folgendes machen:
Delphi-Quellcode:
Solltest du noch fragen haben, helfe ich dir gerne
FreeAndNil ( MeinObjekt ); // Objekt wird zerstört und Objektreferenz wird auf NIL gesetzt
.. .. .. MeinObjekt.Free; // hier knallst jetzt nicht, da intern auf <>NIL geprüft wird, d.h. das Objekt ist NIL und es wird //kein Destruktor aufgerufen Gruß DelphiManiac |
Re: Datamodule richtig Frei geben
Hi,
Vielen Dank. nun gehts ohne Fehler. Kannst du mir ev. noch nen kleienr Tip pgeben. Wenn nich bei mir nachdem ich alles free and nill am Schluss beim onclose event gemacht habe hängt das Tool manchmal einige Sekunden ab und zu a länger fast bei 100 % CPU und i kan nden PC nicht mehr bedienen sogar die Maus ruckelt nur noch. danke. |
Re: Datamodule richtig Frei geben
Hallo,
das ist ein bisschen schwer so aus der Ferne :hi: zeig doch mal dein OnClose Event, dann können wir uns das mal angucken. |
Re: Datamodule richtig Frei geben
Hi,
also das is net einfach !*G*G Ich habe 1 Splashscreen,dieser wird beim start als art info + Ladefortschritt gezeigt dann visible false und wenn man in der Hauptform close macht dann kommt er wieder hoch. In der Splashform ist ein Timer der folgendes macht.
Delphi-Quellcode:
In den Disconnect_Connections prüfe ich ob die datamodule auf sind und dann freeandnil.procedure TForm14.CloseMekm; begin try LEDMeter(15); LEDMeter(20); DMStart:= TDataModule8.Create(nil); DMStart.ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Password=xyxyxy;Persist Security Info=true;User ID='+Databasename+';Initial Catalog='+Databasename+';Data Source='+Server; DMStart.ADOConnection1.connected:=true; LEDMeter(15); DMStart.ADOQuery2.Active:=false; DMStart.ADOQuery2.sql.text:='select * from '+Tool_Name+' where (Novelluser='+QuotedStr(GetUserName)+') and (Computername='+QuotedStr(ComputerName)+')'; DMStart.ADOQuery2.Active:=true; LEDMeter(20); except end; try application.ProcessMessages; DMStart.ADOCommand1.CommandText:='update '+Tool_Name+' set login = '+QuotedStr('0')+' where (ID ='+QuotedStr(DMStart.ADOQuery2.FieldValues['ID'])+')'; DMStart.ADOCommand1.Execute; LEDMeter(20); if LoginUser<> ''then begin if eingeloggt = false then // Weil der Wert False vor dem Einloggen abgefragt wird, wenn er schu trrue ist is jemand eingeloggt begin DMStart.ADOCommand1.CommandText :='update Personaldaten set Eingeloggt='+QuotedStr('0')+' ,Workstation='+QuotedStr('')+' where (Personalnummer ='+QuotedStr(Personalnummer)+')' ; DMStart.ADOCommand1.Execute; end; end; //Delay(500); except end; try // ani.Terminate; LEDMeter(25); DMStart.ADOConnection1.connected:=false; DMStart.Free; Disconnect_Connections; close; except end; end; Ich habe den gesamten source auch schon ausgeklammert aber es hängt immer noch. Zudem hab i noch das Thema wenn ich in einer Form ein Datamodule generiere ,das ich dann zb.: wenn ich eine andere Form auf mache nicht auf das Module zugreifen kann,deswegen muss i es erst nochmal erzeugen. Danke. |
Re: Datamodule richtig Frei geben
Ich hab mal ne Frage zu
folgendem Codestück: Zitat:
richtig? Aber was macht dann deine Funktion Discconnect_Connections? Könntest du die auch posten? Denn wenn die auf eine Connection im Datenmodul zugreifen will könnte es hier auch krachen! Gruß DelphiManiac |
Re: Datamodule richtig Frei geben
grundsätzliche Frage : warum wird das Datamodul überhaupt zur Laufzeit erzeugt ? :shock:
|
Re: Datamodule richtig Frei geben
Hi,
also hier der Code:
Delphi-Quellcode:
Die Active_Connn setze ich im Tool um nur die aktuellen Module freizugeben.procedure Disconnect_Connections; begin case Active_Connn of 0:begin //Lager KA if DMLagerKA <> Nil then begin DMLagerKA.ADOConnection1.Connected:=false; FreeAndNil (DMLagerKA); end; end; 1:begin //Lager SC if DMLagerSC <> Nil then begin DMLagerSC.ADOConnection1.Connected:=false; FreeAndNil (DMLagerSC); end; end; 2:begin //Lager if DMLager <> Nil then begin DMLager.ADOConnection1.Connected:=false; FreeAndNil (DMLager); end; end; 3:begin //Spiesse if DMSpiesse <> Nil then begin DMSpiesse.ADOConnection1.Connected:=false; FreeAndNil (DMSpiesse); end; end; 4:begin //Logbuch if DMlogbuch <> Nil then begin DMlogbuch.ADOConnection1.Connected:=false; FreeAndNil (DMlogbuch); end; end; 8:begin //System if DMSystem <> Nil then begin DMSystem.ADOConnection1.Connected:=false; DMSystem.ADOConnection_System_DB.Connected:=false; FreeAndNil (DMSystem); end; end; 13:begin //feeder if DMFeeder <> Nil then begin DMFeeder.ADOConnection1.Connected:=false; FreeAndNil (DMFeeder); end; end; 121:begin //Lager Lager Spiesse if DMSpiesse <> Nil then begin DMSpiesse.ADOConnection1.Connected:=false; FreeAndNil (DMSpiesse); end; if DMLager <> Nil then begin DMLager.ADOConnection1.Connected:=false; FreeAndNil (DMLager); end; end; 122:begin //Lager Lager SC Spiesse if DMSpiesse <> Nil then begin DMSpiesse.ADOConnection1.Connected:=false; FreeAndNil (DMSpiesse); end; if DMLager <> Nil then begin DMLager.ADOConnection1.Connected:=false; FreeAndNil (DMLager); end; if DMLagerKA <> Nil then begin DMLagerKA.ADOConnection1.Connected:=false; FreeAndNil (DMLagerKA); end; end; 123:begin //Lager Lager SC Spiesse if DMSpiesse <> Nil then begin DMSpiesse.ADOConnection1.Connected:=false; FreeAndNil (DMSpiesse); end; if DMLager <> Nil then begin DMLager.ADOConnection1.Connected:=false; FreeAndNil (DMLager); end; if DMLagerSC <> Nil then begin DMLagerSC.ADOConnection1.Connected:=false; FreeAndNil (DMLagerSC); end; end; end; end; Krachen tuts am schluß net mehr da durch. Das Tool hängt nur bei 100% und macht nix mehr. manchmal a 1 minute selbst in der IDE. @Hansa: Das hab i mal so gemacht damit ich nicht alle Datamodule am start erzeuge. Weil das Programm in vielen richtugnen genutzt wird und so nicht immer alle auf sein müssen. danke |
Re: Datamodule richtig Frei geben
Ein Datamodul tut dir doch nichts. :mrgreen: Allerdings habe ich die Befürchtung, dass du Datamodul und DB-Tabellen verwechselt. Pro Tabelle ein Datamodul oder wie ? :shock: Lasse von mir aus die Tabellen zu, aber gruppiere sie zumindest sinnvoll in Datamodulen. Für mehrere (verwandte) Programme auf gleicher Datenbasis, davon 2 wichtige größere habe ich 4 Datamodule. Ein allgemeines, das enthält z.B. Database, Transactions, gemeinsam benötigte Tabellen usw. was jedes Programm eben braucht. Dann 2 weitere für die beiden Programme. Da sind hauptsächlich Datasets für das eine oder das andere Programm drin. Das 4. DM enthält nur SPs. Das spalte ich allerdings noch in 2 DMs auf. Dann ist aber wirklich bei 5 DMs (vorerst) Schluss. Für ca. 60 Tabellen, 180 Trigger, 80 SPs usw. reicht das völlig aus.
|
Re: Datamodule richtig Frei geben
Hi,
leider verwechsle i das nicht *GG* I habe auch so 6-7 Datamodules die connections,ADOQuerys und Datasources beinhalten. Ich arbeite viel mit DB Kompos also speichere die daten nicht zwischen. Ich wollte halt die DM nicht creieren wenn i sie nicht benötige ,oder der user sie nicht braucht. Aber über einige Tips zur Optimierung der SQL Anbindung wäre ich sehr interessiert da das a noch eine schachstelle ist. Aber das erklärt immer noch nicht die 100% CPU Auslastung beim close. mfg |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:49 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