AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Syntaxoptionen "Boolesche Ausdrücke vollständig" Ein-/Ausschalten

Syntaxoptionen "Boolesche Ausdrücke vollständig" Ein-/Ausschalten

Ein Thema von RaSoWa1 · begonnen am 8. Okt 2012 · letzter Beitrag vom 10. Okt 2012
Antwort Antwort
RaSoWa1

Registriert seit: 1. Jun 2006
Ort: Halle/Saale
140 Beiträge
 
Delphi 2010 Professional
 
#1

Syntaxoptionen "Boolesche Ausdrücke vollständig" Ein-/Ausschalten

  Alt 8. Okt 2012, 21:33
Hallo,

in meiner TFilterGrid-Kompenente verwende ich an verschiedenen Stellen folgende Code-Konstruktion:
z.B.:
Delphi-Quellcode:
 
var
  ci: TColInfo;
begin
....
  ci := ColInfo[c];
  if (ci <> nil) and Assigned(ci.CompToCellProc) then
.....
Bei mir ist die Syntaxoptionen "Boolesche Ausdrücke vollständig" immer ausgeschalten und der Code funktioniert.
Ein Nutzer meiner Komponente hat diese Option aktiviert und es kommt zwangsläufig zu einer Zugriffverletzung, wenn ci = nil ist.

Ich kann den Code ändern in:
Delphi-Quellcode:
....
  if (ci <> nil) then
    if Assigned(ci.CompToCellProc) then
....
was mir aber nicht sehr gefällt, da er dadurch unübersichtlicher wird.
Ich würde lieber die Compilerschalter {$B+} bzw. {$B-} verwenden.

An welcher Stelle im Quelltext der Komponenete muss ich diese Compilerschalter setzten, damit sie nur für diese gelten?
Wie kann ich erkennen welcher Schalter gesetzt ist?
Wie würdet ihr das Problem lösen?

Grüße Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.599 Beiträge
 
Delphi 12 Athens
 
#2

AW: Syntaxoptionen "Boolesche Ausdrücke vollständig" Ein-/Ausschalten

  Alt 8. Okt 2012, 22:38
Ich würde lieber die Compilerschalter {$B+} bzw. {$B-} verwenden.

An welcher Stelle im Quelltext der Komponenete muss ich diese Compilerschalter setzten, damit sie nur für diese gelten?
Wie kann ich erkennen welcher Schalter gesetzt ist?
Der Schalter muss vor der Code-Zeile gesetzt werden und kann nach der Code-Zeile wieder zurückgesetzt werden. Abfragen kannst du ihn über IFOPT.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Syntaxoptionen "Boolesche Ausdrücke vollständig" Ein-/Ausschalten

  Alt 9. Okt 2012, 01:59
Da dieser Schalter nur lokal wirkt, also ab seines Vorfindens und maximal bis zum Ende der Unit, kannst du es lokal deaktivieren.

Aber ganz im Enst, wenn der Typ das global aktiviert, dann hat er selber Schuld, wenn irgendwas nicht ordentlich läuft. Es gibt Dinge, da spielt man einfach nicht dran rum!
Fazit: ER sollte bei sich diese Option mit bedacht einsetzen und dein Problem wäre gelöst.

Oder du deaktivierst zu Beginn deiner Unit (da wo deine Komponente drinsteckt) diese Option, für deine Komponente.


Wenn es mich nervt, daß ich jedesmal, wenn ich nach Hause komm, einen Code eingeben muß,
dann kann ich natürlich einfach die Alarmanlage immer deaktiviert lassen.
Dann soll ich mich aber auch nicht wundern, wenn jemand einbricht und keiner es mitbekommt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 9. Okt 2012 um 02:06 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Syntaxoptionen "Boolesche Ausdrücke vollständig" Ein-/Ausschalten

  Alt 9. Okt 2012, 08:09
Wieso schreibst Du nicht einfach eine Funktion, die aussagt, was Du willst? Dann hast Du beide Probleme ein für alle mal gelöst:

Delphi-Quellcode:
Function CanAccessAdapter (col : TColInfo) : Boolean;
// Ja ja geht auch anders/einfacher aber egal, die Funktion ist zweitrangig
Begin
  if Not Assigned (ci) Then return false;
  return := Assigned(ci.CompToCellProc);
End;
...
// wichtiger ist, das der eigentliche Code nun viel lesbarer ist
If CanAccessAdapter (ColInfo[i]) Then begin
  ...
Sieht doch noch besser aus, oder?
Ich persönlich finde, das Compilerschalter keine Änderung der Funktionalität herbeiführen sollen.
Heute machst Du das so harmlos (knallt/knallt nicht), aber was ist, wenn Du mal soetwas machst?
Delphi-Quellcode:
function SomeFunc (p : TSomething) : Boolean;
Begin
  if p=Nil then inc(SomeCounter);
  return false
End;
...1
if (ci<>Nil) and SomeFunc(ci) then
Ok, das ist auch kein sonderlich guter Stil (Seiteneffekte in Funktionen), aber trotzdem ein Beispiel, wie ein Programm je nach Compilerschalter unterschiedlich funktioniert. Und DAS wäre fatal, weil Du es nicht einmal sofort merkst
  Mit Zitat antworten Zitat
DSCHUCH

Registriert seit: 6. Jun 2007
Ort: Dresden
185 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Syntaxoptionen "Boolesche Ausdrücke vollständig" Ein-/Ausschalten

  Alt 9. Okt 2012, 09:07
was ich besonders gern verwende, ist die neue Exit Syntax.

Delphi-Quellcode:
If not Assigned(X) Then Exit(False);
Result:=X.Y
  Mit Zitat antworten Zitat
RaSoWa1

Registriert seit: 1. Jun 2006
Ort: Halle/Saale
140 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Syntaxoptionen "Boolesche Ausdrücke vollständig" Ein-/Ausschalten

  Alt 9. Okt 2012, 10:27
Danke an alle für die zahlreichen Vorschläge.

Da dieser Schalter nur lokal wirkt, also ab seines Vorfindens und maximal bis zum Ende der Unit, kannst du es lokal deaktivieren.

Aber ganz im Enst, wenn der Typ das global aktiviert, dann hat er selber Schuld, wenn irgendwas nicht ordentlich läuft. Es gibt Dinge, da spielt man einfach nicht dran rum!
Fazit: ER sollte bei sich diese Option mit bedacht einsetzen und dein Problem wäre gelöst.

Oder du deaktivierst zu Beginn deiner Unit (da wo deine Komponente drinsteckt) diese Option, für deine Komponente.[/SIZE]
Ich glaube, das ist die beste Lösung für mich.

Ich persönlich finde, das Compilerschalter keine Änderung der Funktionalität herbeiführen sollen.
Heute machst Du das so harmlos (knallt/knallt nicht), aber was ist, wenn Du mal soetwas machst?
Im Grunde hast du Recht, aber {$B-} ist ja die Standardeinstellung, die ich ggf. für meine Komponenete wieder herstelle.
Mein Codeschnipsel dient nur als Beispiel für meine Vorgehensweise. Da ich auch mit anderen Objekten und auch in zeitkritischen Schleifen so vorgehe, möchte ich nach Möglichtkeit nicht unnötig in eine Funktion springen.


Danke für die Hilfe

Klaus
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23: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 by Thomas Breitkreuz