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
Thema durchsuchen
Ansicht
Themen-Optionen

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, 20: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.007 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 8. Okt 2012, 21: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
43.136 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 9. Okt 2012, 00: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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 9. Okt 2012 um 01: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, 07: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, 08: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, 09: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
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 9. Okt 2012, 10:29
Wir haben hier in zentraler Unit folgendes stehen:

Delphi-Quellcode:
{$IFOPT B+}
  {$Message Fatal 'xyz-Programm/Komponenten/Unit nur lauffähige mit Option B-'}
{$ENDIF}
oder du definierst eine Include-Datei die du überall bei dir verwendest dwelche diese Option setzt.
Machen auch viele Komponentenhersteller so.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 9. Okt 2012, 10:47
Delphi-Quellcode:
{$IFOPT B+}
  {$Message Fatal 'xyz-Programm/Komponenten/Unit nur lauffähige mit Option B-'}
{$ENDIF}
Sowas mach ich auch immer öfters. (wie gesagt ... es gibt Dinge, da spielt man einfach nicht dran rum)

Schade ist nur, daß $IFOPT nur mit einbuchstabigen Optionen funktioniert
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#9

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

  Alt 9. Okt 2012, 12:25
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.
Bei Performancebottlenecks muß man Abstriche machen, das ist richtig. Inline-Funktionen helfen hier jedoch meist.
Bei mir sind derartige Funktionen, weil unschön und unsicher, in einer separaten Unit gekapselt und dort kann ich meine Spezialkompilereinstellungen von mir aus mit dickem Kommentar plazieren.

Es kommt jedoch sehr sehr selten auf reine Codeperformance an, Du wirst also in 99,9% aller Fälle sauber und ordentlich programmieren können. Und dafür galt mein Tipp.
  Mit Zitat antworten Zitat
RaSoWa1

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

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

  Alt 10. Okt 2012, 07:58
Sorry, dass ich mich erst melde, aber ich musste arbeiten.

Wir haben hier in zentraler Unit folgendes stehen:

Delphi-Quellcode:
{$IFOPT B+}
  {$Message Fatal 'xyz-Programm/Komponenten/Unit nur lauffähige mit Option B-'}
{$ENDIF}
oder du definierst eine Include-Datei die du überall bei dir verwendest dwelche diese Option setzt.
Machen auch viele Komponentenhersteller so.
Die Idee ist gut. Ich habe sie neben den Schalter als zusätzliche Warnung eingebaut. Meine Komponente funktioniert damit und der Nutzer kann mit seinen Schaltern spielen, wie er will.

Bei Performancebottlenecks muß man Abstriche machen, das ist richtig. Inline-Funktionen helfen hier jedoch meist.
Bei mir sind derartige Funktionen, weil unschön und unsicher, in einer separaten Unit gekapselt und dort kann ich meine Spezialkompilereinstellungen von mir aus mit dickem Kommentar plazieren.

Es kommt jedoch sehr sehr selten auf reine Codeperformance an, Du wirst also in 99,9% aller Fälle sauber und ordentlich programmieren können. Und dafür galt mein Tipp.
Danke für den Inline-Tip. Den hatte ich schon wieder vergessen.
Ich habe erstmal als Sofortlösung die Compilerschalter-Lösung verwendet. Später, wenn ich etwas mehr Zeit habe, werde ich den Code durchgehen und die problematischen Stellen suchen und durch entspreche Funktionen ersetzen, so dass ich dann ohne die Compilerschalter auskomme.


Danke nochmals an alle.

Klaus.
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz