Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Val und zuweisung (https://www.delphipraxis.net/192653-val-und-zuweisung.html)

EWeiss 8. Mai 2017 22:03

Val und zuweisung
 
Ich habe einen string den ich mit VAL konvertieren muss.
Delphi-Quellcode:
var
 sEnable: string
begin
  sEnable := '"2"""';
  VAL(... ??
end;
Den möchte ich jetzt so auslegen das als Ergebnis die 2 herauskommt..
Wie geht's?

Komme mit der Funktion nicht so richtig klar.

EDIT:
Habe es selbst herausgefunden ;)

Delphi-Quellcode:
var
 sEnable: string
 int: Integer;
 ErrorPos: Integer;
begin
  sEnable := '"2"""';
  VAL(sEnable, Int, Errorpos);
  if errorPos = 0 then
    if sEnable = '2' then // RecycleBin
    begin
      EnableFlag := StrToInt(sEnable);
    end;
end;
Nach Val ist sEnable = "2"

gruss

gammatester 8. Mai 2017 22:12

AW: Val und zuweisung
 
Zitat:

Zitat von EWeiss (Beitrag 1370627)
Ich habe einen string den ich mit VAL konvertieren muss.
Delphi-Quellcode:
var
 sEnable: string
begin
  sEnable := '"2"""';
  VAL(... ??
end;

Schau mal in die Hilfe: S is a string-type expression; it must be a sequence of characters that form a signed real number.
Ich sehe nicht, wie "2""" eine Zahl sein soll.

EWeiss 8. Mai 2017 22:13

AW: Val und zuweisung
 
Zitat:

Zitat von gammatester (Beitrag 1370629)
Zitat:

Zitat von EWeiss (Beitrag 1370627)
Ich habe einen string den ich mit VAL konvertieren muss.
Delphi-Quellcode:
var
 sEnable: string
begin
  sEnable := '"2"""';
  VAL(... ??
end;

Schau mal in die Hilfe: S is a string-type expression; it must be a sequence of characters that form a signed real number.
Ich sehe nicht, wie "2""" eine Zahl sein soll.

Siehe mein Edit..

gruss

hoika 9. Mai 2017 06:49

AW: Val und zuweisung
 
Hallo,
wenn das Format bekannt ist, geht es auch anders

sEnable='"2"""'
StringReplace(sEnable,'"','',[rfReplaceAll]
sEnable='2'

TryStrToInt
int=2

EWeiss 9. Mai 2017 07:03

AW: Val und zuweisung
 
Zitat:

Zitat von hoika (Beitrag 1370655)
Hallo,
wenn das Format bekannt ist, geht es auch anders

sEnable='"2"""'
StringReplace(sEnable,'"','',[rfReplaceAll]
sEnable='2'

TryStrToInt
int=2

Ja Danke aber das ist nicht bekannt..
Keine Ahnung was der User da in die Textdatei hinein schreibt.
Wenn es falsch ist dann kracht's.

gruss

Amateurprofi 9. Mai 2017 07:49

AW: Val und zuweisung
 
Zitat:

Zitat von EWeiss (Beitrag 1370627)
Ich habe einen string den ich mit VAL konvertieren muss.
Delphi-Quellcode:
var
 sEnable: string
begin
  sEnable := '"2"""';
  VAL(... ??
end;
Den möchte ich jetzt so auslegen das als Ergebnis die 2 herauskommt..
Wie geht's?

Komme mit der Funktion nicht so richtig klar.

EDIT:
Habe es selbst herausgefunden ;)

Delphi-Quellcode:
var
 sEnable: string
 int: Integer;
 ErrorPos: Integer;
begin
  sEnable := '"2"""';
  VAL(sEnable, Int, Errorpos);
  if errorPos = 0 then
    if sEnable = '2' then // RecycleBin
    begin
      EnableFlag := StrToInt(sEnable);
    end;
end;
Nach Val ist sEnable = "2"

gruss


@EWeiss:

Ich glaube nicht, dass bei dem von dir gezeigten Beispiel sEnable nach dem VAL '2' ist, weil VAL den übergebenen String nicht verändert (S ist kein var Parameter).
Und auspropieren zeigte, zumindest bei mir, dass sEnable nach dem VAL tatsächlich unverändert ist.

Frickler 9. Mai 2017 07:53

AW: Val und zuweisung
 
Zitat:

Zitat von EWeiss (Beitrag 1370657)
Keine Ahnung was der User da in die Textdatei hinein schreibt.
Wenn es falsch ist dann kracht's.
gruss

Ich nutze für sowas folgende Funktion:

Delphi-Quellcode:
{ Konvertiert den String in eine Zahl, überliest dabei andere Buchstaben.
  So liefert SloppyStrToIntDef('Länge: 15 cm', 0) als Ergebnis die Zahl 15.
  Unterbrochene Ziffernfolgen werden allerdings nicht zusammengefügt, so dass
  SloppyStrToIntDef('1 2 3 4 5', 0) die Zahl 1 liefert und nicht etwa 12345.
}
function SloppyStrToIntDef(const s: string; default: integer): integer;
var
  i: integer;
  tmp: string;
  flag: (vorZahl, inZahl, nachZahl);
begin
  tmp := ''; flag := vorZahl;
  for i:=1 to Length(s) do begin
    if CharInSet(s[i], ['0'..'9']) then begin
      if flag = vorZahl then begin
        flag := inZahl;
        tmp := tmp + s[i];
      end
      else if flag = inZahl then
        tmp := tmp + s[i]
      else
        break;
    end
    else begin
      if flag = inZahl then
        flag := nachZahl
    end
  end;
  result := StrToIntDef(tmp, default);
end;

EWeiss 9. Mai 2017 08:01

AW: Val und zuweisung
 
Zitat:

Ich glaube nicht, dass bei dem von dir gezeigten Beispiel sEnable nach dem VAL '2' ist
Doch VAL verändert den.

Delphi-Quellcode:
            sEnable := Trim(ParseThis(sBF, ',', 5));
            if Length(sEnable) = 0 then
              EnableFlag := 1
            else
              VAL(sEnable, Int, Errorpos);

            if Errorpos = 0 then
              EnableFlag := StrToInt(sEnable);

            if EnableFlag = 2 then // RecycleBin
            begin
              sUseThumb := ExtractFilePath(sUseThumb);
              if SHGetRecycleBinCount > 0 then
              begin
                sUseThumb := sUseThumb + 'RecycleBinFull.png';
                gp.RecycleBinFull := true;
              end
              else
              begin
                sUseThumb := sUseThumb + 'RecycleBinEmpty.png';
                gp.RecycleBinFull := false;
              end;
            end;
Wenn sEnable > 0 ist dann wird über VAL sEnable verändert
und zwar so wie gezeigt von '"2"""' zu '2'

OK.. Muss jetzt in die Kiste! Werde das nochmal überdenken.
Zu viel Probleme im Moment.
Danke.


gruss

Medium 12. Mai 2017 00:06

AW: Val und zuweisung
 
Die Definition der Funktion Val() aus der Delphi-Doku:
Delphi-Quellcode:
procedure Val(S; var V; var Code: Integer);
Der Parameter "S", (sEnable bei dir) wird nicht als var-Parameter übergeben, und kann nachher nicht anders sein.

Zudem sehe ich noch ein Problem in deinem Code: Was machst du, wenn Errorpos <> 0 ist? Eigentlich müsste der Compiler warnen, dass EnableFlag undefiniert sein könnte. (Wenn wir hier den gesamten Code sehen.)

Delphi-Quellcode:
            sEnable := Trim(ParseThis(sBF, ',', 5));
            if Length(sEnable) = 0 then
              EnableFlag := 1 // Wenn Wert nicht gesetzt, 1 als Standard nehmen
            else
              VAL(sEnable, Int, Errorpos); // Wenn dennoch irgendwas im String ist, versuchen eine Zahl daraus zu lesen
           
            if Errorpos = 0 then
              EnableFlag := StrToInt(sEnable); // Wenn kein Fehler beim Interpretieren als Zahl war, umwandeln.
                                               // ABER! Unnötig. Die erkannte Zahl steht bereits in "Int" aus dem VAL()-Aufruf!
            // Vor allem aber: Was machst du, wenn Errorpos NICHT 0 ist, also KEINE Zahl erkannt wurde? Nichts! EnableFlag
            // wird nichts neues zugewiesen, es wird kein Fehler ausgelöst, nichts. Du machst einfach weiter unter der Annahme,
            // dass die Zahl richtig erkannt wurde. Was auch immer nachher in EnableFlag drin steht.
            //
            // Würde sEnable also in der ersten Zeile als '"2""' herauskommen, sollte Errorpos = 1 sein, und in EnableFlag steht
            // NUR DANN eine 2, wenn irgendwo vorher an einer anderen Stelle eine 2 rein geschrieben wurde. NUR dann. Step das mal durch.

            if EnableFlag = 2 then // RecycleBin
            begin
              sUseThumb := ExtractFilePath(sUseThumb);
              if SHGetRecycleBinCount > 0 then
              begin
                sUseThumb := sUseThumb + 'RecycleBinFull.png';
                gp.RecycleBinFull := true;
              end
              else
              begin
                sUseThumb := sUseThumb + 'RecycleBinEmpty.png';
                gp.RecycleBinFull := false;
              end;
            end;

EWeiss 12. Mai 2017 00:11

AW: Val und zuweisung
 
Das hat sich erledigt und war Humbug ;) krass ausgedrückt Schwachsinn. (Meinerseits)
Der Val Parameter den ich meine aus VB Zeiten tut nichts anderes als ein String in einem Integer zu konvertieren
Ich wollte das jetzt anwenden und habe da wohl die falsche Funktion erwischt. ;)
Zitat:

VAL Convert a text to a value.
Und ist gelinde gesagt nicht anderes als ein StrToInt(sEnable)

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf