AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

string concatentation mit NULLs

Ein Thema von Krampus · begonnen am 4. Jul 2008 · letzter Beitrag vom 4. Jul 2008
Antwort Antwort
Krampus

Registriert seit: 19. Mär 2007
9 Beiträge
 
Delphi 7 Enterprise
 
#1

string concatentation mit NULLs

  Alt 4. Jul 2008, 10:38
hallo!

folgende Delphi6 - programmzeile liefert nur unter VISTA (unter W2000, XP läufts)
die meldung "ungültige variant operation".

bisher war ich es gewohnt, dass das ergebnis für v einfach NULL ist,
aber keine variant-exception verursacht.

Code:
var
 v: Variant;
begin
 v := (NULL + 'EIN_STRING');
end
hintergrund:
natürlich abstrahiert das ganze - NULL ist in der praxis ein TADOField.Value,
der tw. halt NULL sein kann.

workarounds zu finden ist nicht das problem - ich will nur den grund für
die anomalie herausfinden (vielleicht gibts ja irgendeinen compiler-switch o.ä.)

danke für eure hilfe!
  Mit Zitat antworten Zitat
HeinzJ

Registriert seit: 17. Aug 2007
Ort: Bremen
84 Beiträge
 
Delphi 2007 Architect
 
#2

Re: string concatentation mit NULLs

  Alt 4. Jul 2008, 11:23
Ich denke mal, das der Operator + (für Stringverkettung) da mal schlicht keinen NULL Wert zuläßt.
Versuchs mal mit VariantFeld.AsString.
  Mit Zitat antworten Zitat
Krampus

Registriert seit: 19. Mär 2007
9 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: string concatentation mit NULLs

  Alt 4. Jul 2008, 11:49
Zitat von HeinzJ:
Ich denke mal, das der Operator + (für Stringverkettung) da mal schlicht keinen NULL Wert zuläßt.
Versuchs mal mit VariantFeld.AsString.
AsString kenn ich schon...

wie eingangs schon erwähnt lässt er´s auf 2 von 3 rechnern schon zu.
auf dem dritten läuft vista (was der einzig erkennbare unterschied ist) -
vielleicht ist die lösung aber auch ein delphi-compliler-switch (oder was halt immer - DAS ist die frage)

so ists halt urpraktisch, ein schöner einzeiler und vermeidet dutzende if-s bzw. doppelte leerzeichen.
so wird das leerzeichen nur verwendet, wenn das feld auch einen wert hat:
Code:
sName := Nz(rs.FieldValues[FLD_TITEL] + ' ', '') + Nz(rs.FieldValues[FLD_NAME2] + ' ', '') +
    Nz(rs.FieldValues[FLD_NAME1], '') + Nz(' ' + rs.FieldValues[FLD_NAME3], '');
--------------------------------------------------
function Nz(val, replace: variant): Variant;
begin
   if (val <> NULL) then
      result := val
    else
      result := replace;
end;
nachdem ich das seit 10 jahren so mache hab ich einfach keine lust
100e codezeile aufzublasen nur weil ich mal am samstag nachmittag
in der gartenhütte mit dem sch*** vista-notebook ein paar code-zeilen schreibe...
...wenn die möglichkeit besteht die URSACHE der anomalie zu finden
und das auf dem vista-ding auch zum laufen zu kriegen.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: string concatentation mit NULLs

  Alt 4. Jul 2008, 12:02
Hi,

Vielleicht kannst du es einfach so machen:

Delphi-Quellcode:
var
  v: Variant;
  tmp: String;
begin
  tmp := ADOField.Value;
  v := (tmp + 'EIN_STRING');
end
Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#5

Re: string concatentation mit NULLs

  Alt 4. Jul 2008, 12:13
Zitat von Krampus:
hallo!
workarounds zu finden ist nicht das problem - ich will nur den grund für
die anomalie herausfinden (vielleicht gibts ja irgendeinen compiler-switch o.ä.)

danke für eure hilfe!
Wenn dasselbe EXE-File auf allen Systemen läuft, liegts wohl an den Compilereinstellungen. Wenn's nicht läuft, am System.

Gruß Gammatester
  Mit Zitat antworten Zitat
Krampus

Registriert seit: 19. Mär 2007
9 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: string concatentation mit NULLs

  Alt 4. Jul 2008, 12:21
Zitat von Neutral General:
Delphi-Quellcode:
var
  v: Variant;
  tmp: String;
begin
  tmp := ADOField.Value;
  v := (tmp + 'EIN_STRING');
end
würde eine exception verursachen sobald das feld leer ist.
NULL kann keiner string-variable zugewiesen werden.
wenn dann entweder mit FieldbyName(FLD).AsString (siehe 2. posting)
oder VarToStr(ADOField.Value) (='') ... aber das alles ist nicht die frage.

brauche keinen workaround sondern eine konkrete antwort auf die
frage warum eine string-concatentation mit einem null-wert (NULL + 'WASWEISSICH') *)
auf einem PC funktioniert (und NULL ergibt) und auf dem anderen nicht?

*) der gag bei der sache ist, dass der 'WASWEISSICH'-string nur angefügt
wird, wenn das feld nicht leer ist - was mir einen haufen if-s spart
(hab ich das nicht schon oben gesagt?)...

...der concat von 2 strings ('' + 'irgendwas') führt das ganze ad absurdum
und resultiert in diesem fall in 2 leerzeichen, wenn eine adresse z.b. keinen titel hat
und das ist genau was ich damit auf möglichst einfache weise vermeiden will.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: string concatentation mit NULLs

  Alt 4. Jul 2008, 12:49
Hallo,

handelt es sich wirklich um das identische Lademodul auf den verschiedenen Rechnern?

Zumindest seit Einführung der Unit Variants ist ein expliziter String-Cast notwendig, wenn du String-Variants mit nativen Strings in einem Ausdruck mischen willst. Damit das ganze überhaupt funktioniert muss noch NullStrictConvert auf False gesetzt sein und NullAsStringValue auf einen leeren String verweisen.

Delphi-Quellcode:
begin
  Variants.NullStrictConvert := False;
  ShowMessage('1' + String(null) + '2');
end;
Ich halte diese Vorgehensweise nicht für eine Umgehungslösung, sondern für eine Notwendigkeit. Vielleicht hat sich da in den neueren Versionen von Delphi etwas geändert. Es kann nicht schaden, wenn du deine Standardeinstellungen für die genannten Variablen überprüfst.

Freundliche Grüße
  Mit Zitat antworten Zitat
Krampus

Registriert seit: 19. Mär 2007
9 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: string concatentation mit NULLs

  Alt 4. Jul 2008, 12:58
[quote="gammatester"]
Zitat von Krampus:
Wenn dasselbe EXE-File auf allen Systemen läuft, liegts wohl an den Compilereinstellungen. Wenn's nicht läuft, am System.
denk ich auch (auch wenn ich mir da nicht 100%ig sicher bin...)
ja, die xp-EXE läuft auf dem vista-system.

die compiler-switches (in Programmoptionen) hab ich natürlich schon verglichen - die sind ident (oder ich blind)

manche leute haben aber schon von generellen problemen D6 + vista berichtet.
bis auf diese geschichte läuft hier aber alles soweit einwandfrei.

gibts konkret einen compiler-switch, der varianten-handlings steuert?

----------------------------------------------------

hab mir mal beide CPU-debugfenster angesehen - der assembler-code der beiden systeme ist derselbe.
nur beim vista-system schlägt die anweisung in zeile 00456F32 fehl:

call @VarAdd

hmm...VariantManager...
hat wer eine idee...?
Miniaturansicht angehängter Grafiken
call_varadd_116.png  
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: string concatentation mit NULLs

  Alt 4. Jul 2008, 13:20
Blöde Frage: Auf allen Rechnern hast du die gleichen Updates von D6? Da gibt es doch ein Update für die variants.pas. Bei meinem D6 geht das nämlich *nicht* und das läuft unter XP. Es wäre mir neu, das Variants von Windows abgebildet werden.

Du kannst den VariantManager so umbiegen, das er a) NULL implizit in '' castet oder b) beim Konkatenieren eben deine gewünschte Funktionalität implementiert. Soweit ich das hier sehe, betrifft es die eine Routine 'VarOp' .

Schau mal in 'Variants' und 'System' nach TVariantManager. Das müsste gehen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Krampus

Registriert seit: 19. Mär 2007
9 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: string concatentation mit NULLs

  Alt 4. Jul 2008, 13:28
Zitat von marabu:

handelt es sich wirklich um das identische Lademodul auf den verschiedenen Rechnern?

Zumindest seit Einführung der Unit Variants ist ein expliziter String-Cast notwendig, wenn du String-Variants mit nativen Strings in einem Ausdruck mischen willst. Damit das ganze überhaupt funktioniert muss noch NullStrictConvert auf False gesetzt sein und NullAsStringValue auf einen leeren String verweisen.

Delphi-Quellcode:
begin
  Variants.NullStrictConvert := False;
  ShowMessage('1' + String(null) + '2');
end;
BINGO!
auf dem vista-system war eine veraltete version der variants-unit.
RTL Patch#2 installiert - hat die Variants.dcu upgedated - PROBLEM BEHOBEN!

P.S: VarToStr statt String() und NullStrictConvert darf TRUE bleiben (default in variants.pas)
ShowMessage('1' + VarToStr(null) + '2'); DANKE! bist mein held des tages und hast mich vor einem vollrausch bewahrt
  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 21:45 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