Autor Beitrag
firefuzy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 69

Win 98 SE, WinXP Prof, Vista HPrem.
Delphi 7
BeitragVerfasst: Sa 14.03.09 16:44 
Hallo

Mich würde interessieren ob es eine Möglichkeit gibt dem Compiler mitzuteilen, dass man der Variable Result einen Wert zuweisen will und nicht einer anderen Property die auch Result heißt.
z.B.: System.Exit statt Exit, nur eben für Result
In meinem konkreten Fall sieht das so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function TKundenList.SameKundeExists(Kunde: TKunde): TKundenStatus; 
...
with Datenbank do begin
    Lock;
    ...
    UnLock;
    if Results[0][0] > 0 then
      Result := (KS_ExistsInDB); //<- hier sagt Delphi "[Error] Hauptsystem.pas(351): Cannot assign to a read-only property", da "Datenbank" auch eine (read-only) Property namens "Result" hat;
end;
...
end;


In der Delphihilfe habe ich leider nichts gefunden. Wenn man normalerweise Rechtsklick->"Find declaration" auf Result macht springt der Cursor nur zum Anfang der Funktion, so komme ich also auch nicht weiter.

Vielen Dank für eure Hilfe

firefuzy
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 14.03.09 16:51 
Was spricht dagegen die erste Result Variable sinnvoll und aussagekräftig zu bennnen?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 14.03.09 16:51 
Lass das with Datenbank do begin weg und arbeite stattdessen mit Datenbank.{...}.

Soweit ich weiß, ist so etwas einer der Gründe, weswegen einige Leute der Meinung sind, dass dieses with schlechter Stil ist. ;-)

_________________
We are, we were and will not be.
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Sa 14.03.09 16:51 
Ich würde Funktionen nur für Integer oder String nehmen. Du gibst hier ja eine etwas komplexere Einheit zurück. Dafür schlage ich eine Prozedur mit Out-Parameter vor:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TKundenList.SameKundeExists(Kunde: TKunde; out AKundenStatus: TKundenStatus); 
...
with Datenbank do begin
    Lock;
    ...
    UnLock;
    if Results[0][0] > 0 then
      AResult := (KS_ExistsInDB); 
end;
...
end;


Edit: Oder so wie Luckie.
Edit: Oder wie Gausi
:wink:
firefuzy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 69

Win 98 SE, WinXP Prof, Vista HPrem.
Delphi 7
BeitragVerfasst: Sa 14.03.09 17:43 
@Luckie: Datenbank ist eine 3rd Party Komponente, an der ich im Sinne von "Never touch a running system" lieber nicht herumfummle. ;)
@Gausi: ich persönlich finde, dass with sehr hilfreich für die Übersichtlichkeit ist, weshalb ich es nur ungern weglassen würde.

Ich werde das Problem dann so lösen wie Regan es vorgeschlagen hat.

Vielen Dank an euch Drei :D
firefuzy
Dunkel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 682

Mac OS X Snow Leopard
Xcode 3.1
BeitragVerfasst: Sa 14.03.09 18:07 
Alternativ könnte man auch den Namen der Funktion als Rückgabe-Variable verwenden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function TKundenList.SameKundeExists(Kunde: TKunde): TKundenStatus; 
...
with Datenbank do begin
    Lock;
    ...
    UnLock;
    if Results[0][0] > 0 then
      SameKundeExists:= (KS_ExistsInDB);
end;
...
end;

Aber ich (bestimmt auch andere) würde(n) davon abraten. Es ist schlechter Lesbar, wenn man den Namen der Funktion ändert, muss man auch im Code rumfummeln, ...

Die out-Variable ist definitiv die bessere Alternative.

_________________
Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Sa 14.03.09 18:14 
What I eigentlich not verstehen do, is the fact, das you deutsche and englishe words in dein Code mishst. Whyso? Dat sieht doch blöd aus. Have you Angst vor your own Sprache? :wink:

Ansonsten schließe ich mich Gausi an: Lass das 'With' weg. Wie Du siehst, sorgt es für Probleme. Hier hast Du Glück, weil der Fehler vom Compiler erkannt wird. Aber was, wenn nicht?

Gegen die Verwendung des Funktionsnamens anstelle von 'Result' ist an sich nichts einzuwenden, nur sollte man das dann konsistent durchziehen.

_________________
Na denn, dann. Bis dann, denn.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 14.03.09 18:34 
user profile iconfirefuzy hat folgendes geschrieben Zum zitierten Posting springen:
@Gausi: ich persönlich finde, dass with sehr hilfreich für die Übersichtlichkeit ist, weshalb ich es nur ungern weglassen würde.
Ich selbst nutze with wenn, dann nur an Stellen wo absolut klar ist was gemeint ist und nur für wenige Zeilen. Ein Beispiel wäre das Hinzufügen eines Eintrags in eine ListView.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
with ListViewX.Items.Add do
begin
  Caption :=
  Subitems.Add()
end;
Aber mehr als so wenige Zeilen oder mit weiterer Verschachtelung würde ich es niemals verwenden. Und wenn ich selbst Code schreibe verwende ich es normalerweise selbst dort nicht.

Gerade bei Datenstrukturen, die nicht bei Delphi dabei sind, erschwert es nicht nur die Lesbarkeit, wenn man erst raten muss was wozu gehört, sondern verhindert auch ein einfaches Debugging. Maus drüberhalten zum Auswerten ist da nämlich nicht zum Beispiel. Das kann man dann alles in Strg + F7 schön manuell reintippen... :puke:

Hier in diesem Fall ist aber offensichtlich nicht klar was gemeint ist, und also ist das with absolut fehl am Platze.