Autor |
Beitrag |
JRegier
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Do 16.06.05 07:42
Hallo, ich bin an einem Projekt dran, wo ich mal nur eine TQuery brauche, mal Zwei und so bis sechs!
Ich hatte vorher alle schon fertig erstellt aber hat mir nicht gefallen da ich vieleicht evtl mal
aus einer Procedur die andere aufrufe die evtl auch dieselben TQuerys benutz und dann könnte ein Fehler
entstehen! Jetzt habe ich eine Unit "Utils" gemacht und solche proceduren um bei Bedarf welche zu erstellen
bzw. aufzuräumen!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| const ALIAS = '...';
function Q(AOwner) : TQuery; var HQ : TQuery; begin HQ := TQuery.Create(AOwner); HQ.DatabaseName := ALIAS; HQ.RequestLive := True; HQ.AutoRefresh := True; Result := HQ; end;
procedure F(HQ : TQuery); begin HQ.Close; HQ.UnPrepare; HQ.Free; end; |
Meine Frage ist nun: wird die Performace dadurch stark beeinträchtigt?
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 16.06.05 07:55
Großartig Performance-Probleme dürftest du nicht bekommen.
Ich mache das im Prinzip auch so.
Kleiner Tip:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| function Q(AOwner) : TQuery; begin Result := TQuery.Create(AOwner); with Result do begin DatabaseName := ALIAS; RequestLive := True; AutoRefresh := True; end; end; |
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Do 16.06.05 08:07
Nur so: Ich verzichte auf die Angabe des Owners und gebe meine Queries dann eben selbst wieder frei. Is doch ok, oder?
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 16.06.05 08:50
@alzaimer:
Das mit dem Owner ist mir gar nicht aufgefallen. Ich übergebe auch meistens nil, da ich die Freigabe auch selbst steuere.
Fazit für dich: Damit gibts keine Probleme.
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Do 16.06.05 08:57
jasocul hat folgendes geschrieben: | Großartig Performance-Probleme dürftest du nicht bekommen.
Ich mache das im Prinzip auch so.
Kleiner Tip:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| function Q(AOwner) : TQuery; begin Result := TQuery.Create(AOwner); with Result do begin DatabaseName := ALIAS; RequestLive := True; AutoRefresh := True; end; end; | |
Ah, da hatte ich auch ne Frage zu Result Allgemein bzw. verlassen der Procedur!
Wie ist es in Delphi? Wenn die Anweisung mit Result abgearbeitet ist wird
die Procedur verlassen? In Java heist es return Wert und somit werden
die darunter stehende Anweisungen nicht mehr ausgeführt!
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 16.06.05 09:08
Ist ja eigentlich eine ganz neue Frage, aber ich bin mal nicht so (Ich hoffe, die Mods haun diesmal nicht so doll).
In Delphi ist das nicht so.
Da kannst du Result einen Wert zuweisen und den in der Funktion benutzen. Früher (anno tobak) gab es die Variable Result nicht. Da musste dem Funktionsnamen das Ergebnis übergeben werden. Daher musste man sich Variablen in der Prozedur definieren, dass bei intensiver Nutzung der Funktion wohl zu Performance-Problemen geführt haben soll.
Es geht auch heute noch so, dass man dem Funktionsnamen das Ergebnis übergeben kann. Nur dann den Funktionsnamen zur weiteren Bearbeitung zu benutzen, würde zu rekursiven Aufrufen der Funktion führen. Daher hat man dann due Variable Result eingeführt.
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Do 16.06.05 09:28
jasocul hat folgendes geschrieben: | Da musste dem Funktionsnamen das Ergebnis übergeben werden. |
Also im Klartext wenn ich dem Prozedurnamen den Wert übergibt wird die Prozedur dann verlassen?
Oder wird Prozedurname gar nicht mehr genutzt!
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 16.06.05 09:38
Die Funktion wird beim "end" verlassen und nicht bei der Wertübergabe.
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Do 16.06.05 09:42
jasocul hat folgendes geschrieben: | Die Funktion wird beim "end" verlassen und nicht bei der Wertübergabe. |
Oh man dann muß man ja aufpassen das was ungewolltes Passiert! Alles darunter!
Und was geschieht genau bei Wertübergabe, wird die aufrufende Prozedur dann schon weiter abgearbeitet "Thread"
oder erst wenn die aufgerufene Prozedur bei "end" verlassen wurde?
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 16.06.05 09:50
Die Übergabe der Daten wird erst mit dem Ende der Funktion durchgeführt. (kein Thread-ähnliches Verfahren)
|
|
Stefan.Buchholtz
      
Beiträge: 612
WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
|
Verfasst: Do 16.06.05 09:53
JRegier hat folgendes geschrieben: | jasocul hat folgendes geschrieben: | Die Funktion wird beim "end" verlassen und nicht bei der Wertübergabe. |
Oh man dann muß man ja aufpassen das was ungewolltes Passiert! Alles darunter!
Und was geschieht genau bei Wertübergabe, wird die aufrufende Prozedur dann schon weiter abgearbeitet "Thread"
oder erst wenn die aufgerufene Prozedur bei "end" verlassen wurde? |
Die aufrufende Prozedur wird erst weiter abgearbeitet wenn deine Funktion bei end verlassen wird.
Result kannst du in einer Funktion wie eine normale lokale Variable verwenden, der Inhalt von Result beim Verlassen der Funktion ist dann der Rückgabewert. Das ist so, als wenn du in Java sowas schreiben würdest:
Quelltext 1: 2: 3: 4: 5: 6: 7:
| int meineFunktion(void) { int result;
// irgendwas mit result machen
return result; } |
Um eine Delphi-Prozedur oder -Funktion vorzeitig zu verlassen, nimmst du exit.
Stefan
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Do 16.06.05 10:18
|
|