Autor Beitrag
JRegier
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: 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!

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 16.06.05 07:55 
Großartig Performance-Probleme dürftest du nicht bekommen.
Ich mache das im Prinzip auch so.
Kleiner Tip:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Do 16.06.05 08:57 
user profile iconjasocul hat folgendes geschrieben:
Großartig Performance-Probleme dürftest du nicht bekommen.
Ich mache das im Prinzip auch so.
Kleiner Tip:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Do 16.06.05 09:28 
user profile iconjasocul 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 16.06.05 09:38 
Die Funktion wird beim "end" verlassen und nicht bei der Wertübergabe.
JRegier Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Do 16.06.05 09:42 
user profile iconjasocul 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Do 16.06.05 09:53 
user profile iconJRegier hat folgendes geschrieben:
user profile iconjasocul 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Do 16.06.05 10:18 
user profile iconStefan.Buchholtz hat folgendes geschrieben:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
int meineFunktion(void) {
  int result;

  // irgendwas mit result machen

  return result;
}



oder in Delphi wie in Java

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function XY(...) : Integer;
var TT : Integer;
begin
   case HUHU of
   cc: begin
       Result := TT+10;  // Result und Exit zusammen!
       Exit;
       end;
   dd: begin
       Result := TT*10;
       Exit;
       end;
   end;
end;