Lazreport und leerer Platzhalter

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Lazreport und leerer Platzhalter

Beitrag von arturx »

Wenn in einem Lazreport aus Versehen ein leerer Platzhalter [] eingegeben wird, stürzt das Programm ab.

IMO lässt sich das Ganze leicht optimieren :

1.LR_utils:

Code: Alles auswählen

procedure RemoveQuotes(var s: String);
begin
      If s='' then           // <-- Neu
         begin s := '';      // <-- Neu
                exit;          // <-- Neu
          end;               // <-- Neu
  if (s[1] = '"') and (s[Length(s)] = '"') then //<-- hier kam es natürlich zum Absturz
    s := Copy(s, 2, Length(s) - 2);
end;


2. LR_CLASS
Die nach der Änderung sichtbare Fehlermeldung in habe ich noch etwas erweitert :

Code: Alles auswählen

procedure TfrReport.GetVariableValue(const s: String; var aValue: Variant);
......
......
......
       if s <> SubValue then
        begin
          SubValue := s;
          aValue:= frParser.Calc(s);
          SubValue := '';
        end
        else
            begin //<-- Neu
             If s=''  //<-- Neu
               then raise(EParserError.Create('empty element;')) //<-- Neu
               else                                                                    //<-- Neu
                      raise(EParserError.Create('Undefined symbol ";"'+SubValue+';'));
            end; //<-- Neu
      end;
    end;
  end;
end;


P.S. Ich hätte das Ganze natürlich gern formatiert, weiß aber z.B. nicht, wie man einrückt,
da Leerzeichen in der Vorschau verschwinden. Kann mir jemand einen Tip geben ??!!!!!
Zuletzt geändert von monta am So 3. Jan 2010, 11:48, insgesamt 1-mal geändert.
Grund: Highlighter

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Lazreport und leerer Platzhalter

Beitrag von monta »

arturx hat geschrieben:P.S. Ich hätte das Ganze natürlich gern formatiert, weiß aber z.B. nicht, wie man einrückt,
da Leerzeichen in der Vorschau verschwinden. Kann mir jemand einen Tip geben ??!!!!!

Da wo im Beitragseditor Highlighter steht, kannst du die Syntaxhervorhebung auswählen ;)

Oder hinschreiben:

Code: Alles auswählen

[code=laz][/code]
Johannes

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: Lazreport und leerer Platzhalter

Beitrag von arturx »

Hey Monta,
zuerst Danke für den Formatierungstip und die Formatierung

zu meinem Quelltext (sorry, meine Idee war nicht zuende gedacht).
Besser :

Code: Alles auswählen

procedure RemoveQuotes(var s: String);
begin
         If s=''                // <-- neu
            then  exit;         // <-- neu
        if (s[1] = '"') and (s[Length(s)] = '"') then
         s := Copy(s, 2, Length(s) - 2);
end;

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Lazreport und leerer Platzhalter

Beitrag von theo »

Was möchtest du uns mit diesem Beitrag sagen bzw. fragen?

Wenn du Lazarus Packages verbessern helfen möchtest, mach einen Patch und häng in in den Bugtracker.
Erst nachschauen, ob es den Bugreport schon gibt.

http://wiki.lazarus.freepascal.org/Creating_A_Patch/de
Bugtracker für Packages vorgefiltert:
http://bugs.freepascal.org/search.php?p ... atus_id=90

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: Lazreport und leerer Platzhalter

Beitrag von arturx »

theo hat geschrieben:Was möchtest du uns mit diesem Beitrag sagen bzw. fragen?
Wenn du Lazarus Packages verbessern helfen möchtest, mach einen Patch und häng in in den Bugtracker.
Erst nachschauen, ob es den Bugreport schon gibt.


Ich dachte, es wäre sinnvoll, die Idee zuerst vorzustellen und zur Diskussion zu geben,
ob ein anderer einen besseren Vorschlag hat.
Ich wollte die Änderung nicht ohne weitere Diskussion / Prüfung in den Bugtracker geben.
Vielleicht habe ich das Thema dieses Forums "Lazarus - Bugs" falsch interpretiert ??

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Lazreport und leerer Platzhalter

Beitrag von Socke »

arturx hat geschrieben:Ich dachte, es wäre sinnvoll, die Idee zuerst vorzustellen und zur Diskussion zu geben,
ob ein anderer einen besseren Vorschlag hat.
Ich wollte die Änderung nicht ohne weitere Diskussion / Prüfung in den Bugtracker geben.
Vielleicht habe ich das Thema dieses Forums "Lazarus - Bugs" falsch interpretiert ??

Da man keine Quotes entfernen kann, wenn sie nicht vorhanden sind, ist das - denke ich - als Bug anzusehen und gehört also in den Bug-Tracker (vorher suchen, ob es ihn evtl. schon gibt). Das Forum ist mehr oder weniger dazu gedacht zu diskutieren, ob ein bestimmtes Phänomen ein Bug ist oder nicht. Der Bug selbst und die Lösung wird dann meistens im Bug-Tracker oder auf den Mailing-Listen diskutiert. So gesehen hast du (fast) alles richtig, aber nur einen kleinen Umweg gemacht.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Lazreport und leerer Platzhalter

Beitrag von Hitman »

arturx hat geschrieben:zu meinem Quelltext (sorry, meine Idee war nicht zuende gedacht).
Besser :


"Exit" kann man sich auch noch sparen ...

Code: Alles auswählen

procedure RemoveQuotes(var s: String);
begin
        if (Length(s) > 1) and (s[1] = '"') and (s[Length(s)] = '"') then
         s := Copy(s, 2, Length(s) - 2);
end;

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: Lazreport und leerer Platzhalter

Beitrag von arturx »

Hitman hat geschrieben:
arturx hat geschrieben:zu meinem Quelltext (sorry, meine Idee war nicht zuende gedacht).
Besser :


"Exit" kann man sich auch noch sparen ...

Code: Alles auswählen

procedure RemoveQuotes(var s: String);
begin
        if (Length(s) > 1) and (s[1] = '"') and (s[Length(s)] = '"') then
         s := Copy(s, 2, Length(s) - 2);
end;


Deine Idee ist fast perfekt :wink: den Fall s='"' erwischt man auch noch, wenn sie ein wenig verändert :


Code: Alles auswählen

procedure RemoveQuotes(var s: String);
begin
        if (Length(s) >= 1) and (s[1] = '"') and (s[Length(s)] = '"') then
         s := Copy(s, 2, Length(s) - 2);
end;

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Lazreport und leerer Platzhalter

Beitrag von Socke »

Hitman hat geschrieben:"Exit" kann man sich auch noch sparen ...

Code: Alles auswählen

procedure RemoveQuotes(var s: String);
begin
        if (Length(s) > 1) and (s[1] = '"') and (s[Length(s)] = '"') then
         s := Copy(s, 2, Length(s) - 2);
end;

Dann muss man aber immer mit dem Compiler-Switch {$B OFF} (boolsche Ausdrücke nicht komplett auswerten) kompilieren. Auch wenn das Standard-Einstellung ist, könnte es sein, dass sie überschreiben wird und dann doch diese Fehler generiert.
Natürlich kann man das dann mit zwei verschachtelten If-Abfragen auch ohne exit schreiben (in der LCL wirds oft mit exit gemacht).
[quote="arturx"]

Code: Alles auswählen

procedure RemoveQuotes(var s: String);
begin
        if (Length(s) > 1) and (s[1] = '"') and (s[Length(s)] = '"') then
         s := Copy(s, 2, Length(s) - 2);
end;
[/quoete]
Wäre hier nicht noch zu klären ob Copy(s,2,length(s)-2) bei s = '"' nicht auch zu einer AaccessViolation führt, da auf s[2] zugegriffen wird? Hitmans Version wäre also richtig(er).

Edit: Fehler entfernt
Zuletzt geändert von Socke am So 3. Jan 2010, 15:52, insgesamt 1-mal geändert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Lazreport und leerer Platzhalter

Beitrag von Hitman »

arturx hat geschrieben:Deine Idee ist fast perfekt :wink: den Fall s='"' erwischt man auch noch, wenn sie ein wenig verändert :

Naja ... '"' ist aber kein quoted string, sondern ein einzelner quote Char. Zumal die Funktion schon RemoveQuotes heißt, würde ich das absichtlich außen vor lassen. Zudem wird Copy mit Length(s) - 2 aufgerufen ... das funktioniert zwar trotzdem, wenn Length = 1 ist, finde ich aber dennoch unsauber.
Geschmackssache ... ich würde bei einem strikten > 1 bleiben ;-)

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: Lazreport und leerer Platzhalter

Beitrag von arturx »

Hitman hat geschrieben:"... das funktioniert zwar trotzdem, wenn Length = 1 ist, finde ich aber dennoch unsauber.
Geschmackssache ... ich würde bei einem strikten > 1 bleiben ;-)


Hey Hitman,

das sehe ich genauso wie Du. Der Vorteil wäre halt, dass das Ergebnis immer stimmt.
Ein einzelnes '"' würde gleich mit korrigiert, kann (aber) deshalb später nicht mehr entdeckt und angemahnt werden.
Ich hatte auch überlegt, ob ich das korrigiere oder nicht. Das Ergebnis war halt so universell und nett
Geschmackssache ...

Antworten