Autor |
Beitrag |
DiamondDog
      
Beiträge: 460
|
Verfasst: Do 04.09.08 19:18
Hallo Leute,
also ich hab folgendes Problem:
Ich habe user als string und ich möchte gerne user prüfen ob es eine Zahl enthält
und wenn ja soll user in integer umgewandelt werden (userint).
Hoffe mir kann da jemand Helfen hab schon gegoogelt aber dazu nix passendes gefunden
oder nur die Falschen Suchworte benutzt.
Danke schon mal fürs Helfen.
Mfg Dog Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Do 04.09.2008 um 19:42
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 04.09.08 19:33
Willst du prüfen, ob der String eine Zahl ist, oder ob er eine Zahl nur enthält? Der Titel und dein Beitrag widersprechen sich da ein wenig. Im zweiten Fall dürften noch andere Zeichen als 0..9 im String enthalten sein.
Mit TryStrToInt kannst du herausfinden, ob ein String eine Zahl ist. Sie wird auch sofort umgewandelt, genaueres dazu findest du in der Delphi-Hilfe.
Wenn du Zahlziffern im String suchen willst, die du später zusammenflickst, helfen dir die Befehle Length, Pos, Copy und IntToStr.
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: Do 04.09.08 19:50
Ich versuchs noch mal genau zu erklären:
Also ich habe user das enthält eine zahl als string
die ich in integer umwandeln möchte.
Problem ist wandel ich sie einfach in integer um bekomme ich beim starten eine Fehler
(Irgendwas von wegen das der string da noch keine Zahl enthält sondern ")
Deswegen will ich vorher Prüfen ob der String wirklich eine Zahl ist bevor er in integer umgewandelt wird.
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Do 04.09.08 19:54
du kannst auch variant statt string verwenden. Variant kann sowohl zahlen als auch text aufnehmen, immer was grad kommt. Die Frage ist was du überhaupt mit dem Integer machen willst, beschreibe mal dein Problem.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 04.09.08 19:59
Genau dazu ist TryStrToInt oder StrToIntDef gemacht. Schau dir einfach mal die Beschreibungen dazu an, dann siehst du, welches du davon brauchst.
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Do 04.09.08 20:21
So wie ich dich versteh, speichert user immer nur Zahlen ab, setz doch einfach einen Startwert für user fest, wenn dir die anderen Lösungen nicht gefallen.
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: Do 04.09.08 20:45
Also mal ne kleine Erklärung:
Ich rufe den Status user alle 10 sec ab.
Der Status user hat daher immer einen anderen Wert.
Jetzt möchte ich es halt so machen:
1. Prüfen ob user eine Zahl ist
2. wenn user eine Zahl ist dann in integer (userint) umwandeln.
3. ist userint größer dann..
4. wenn userint nicht mehr gleich ist also wenn sich die zahl geändert hat beim prüfen dann soll Buton1 geklickt werden.
hoffe das das so verständlich ist.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 04.09.08 21:09
Hier hat es jetzt doch wirklich genügend Lösungen für dein Problem.
Wenn user eine Zahl ist, dann soll sie in NewValue gespeichert werden. Falls NewValue nicht mehr userint, soll userint aktualisiert werden und zusätzlich noch eine andere Aktion ausgeführt werden.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var NewValue: Integer; begin if TryStrToInt(user, NewValue) and userint <> NewValue then begin end; end; |
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: Do 04.09.08 21:28
Ok habs jetzt so versucht aber das ist nicht ganz richtig:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| if TryStrToInt(user, userint) then begin if userint > 0 then begin if userint <> userold then begin popup.Click; userold:= userint; end; end; end; end; | Er kennt user userold ja beim vergleichen noch nicht.
Anders wuste ich gerade nicht wie ich es machen soll.
Weil userold ist es ja erst wenn der button popup geklickt wurde.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 04.09.08 21:42
Warum verwendest du nicht einfach meine Variante, wenn dein eigener Versuch scheitert? Es ist einfach, den neuen Wert erst mal nur zwischenzuspeichern (NewValue), ihn mit dem alten zu vergleichen (NewValue <> userint), und bei einem positiven Ergebnis den alten auf den neuen zu setzen.
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: Do 04.09.08 22:05
userint gibt es ja nicht.
Ich krieg meinen Wert ja nur aus user.
Und wenn user den wert geändert hat dann dann soll der Button geklickt werden.
Ich habe beim ersten durchlauf auch keinen wert zum vergleichen,
weil da user ja eh neu ist.
Hoffe das das jemand verstanden hat 
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: Fr 05.09.08 21:25
Kann mir denn noch jemand weiter Helfen?
Weil wie oben schon gesagt ich habe beim ersten durchlauf,
ja noch keinen Wert zum vergleichen der alt ist.
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Fr 05.09.08 21:33
naja du kannst doch userold mit irgendwas vorbelegen... -9999 oder so... dein Code ist einfach zu klein, bzw. immer noch nciht klar was eigentlich ganz genau da abgeht... da kann man nur raten 
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: Fr 05.09.08 21:52
Ok dann Poste ich mal einwenig mehr Code (hab das falsche von mir mal dringelassen):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| procedure TfrmMain.MultilineButton1Click(Sender: TObject); var userint,userold:integer; begin Timer2.Interval:=10000; Timer2.Enabled:=True; Timer3.Interval:=2000;Timer3.Enabled:=True; text:=GetHTML(Edit1.Text);
user:=copy(text,22,1000); datuhr:=copy(text,1,20); datum:=copy(datuhr,1,11); uhr:=copy(datuhr,12,20);
Label1.Caption:=user + ' ' + Edit2.Text; Label4.Caption:='Datum: '+ datum; Label5.Caption:='Uhrzeit: ' + uhr + 'Uhr' ; if Label1.Caption='' then Label1.Caption:='0' + Edit2.Text; Label2.Caption:='*';
PlugMsg1.Msg := PM_PLUGIN_SPEC_REDRAW; PlugMsg1.WParam := UniqContactId; PlugMsg1.DllHandle := FDllHandle; FPluginSvc.OnPluginMessage(PlugMsg1); if TryStrToInt(user, userint) then begin if userint > 0 then begin if userint <> userold then begin popup.Click; userold:= userint; end; end; end; end; |
So und wenn user jetzt größer 1 ist soll popup gelickt werd und dann halt wieder wenn sich der Status geändert hat halt von zb 1 user auf 2 user.
Hier der Code fürs popup obwohl der eigendlich unwichtig ist:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| procedure TfrmMain.popupClick(Sender: TObject); var PlugMsg1: TPluginMessage; aFadeWnd: TFadeWndInfo; begin begin aFadeWnd.FadeType := 1; aFadeWnd.FadeIcon := LoadImage(0, IDI_INFORMATION, IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR or LR_SHARED);
aFadeWnd.FadeTitle := 'User-Online Plugin'; aFadeWnd.FadeText := user + ' ' + Edit2.Text;
aFadeWnd.TextCentered := True;
aFadeWnd.NoAutoClose := False;
PlugMsg1.Msg := PM_PLUGIN_FADE_MSG; PlugMsg1.WParam := LongInt(@aFadeWnd);
PlugMsg1.DllHandle := FDllHandle; FPluginSvc.OnPluginMessage(PlugMsg1); end; end; | Das Popup soll dann halt user anzeigen.
Hoffe das Hilft weiter.
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Fr 05.09.08 22:04
Was mir hier förmlich ins Auge springt ist text. Was soll text sein? Die Caption vom Formular oder eine String-Variable? Im ersteren Fall bitte Caption benutzen, im zweiteren Fall ist es auch schlecht, man sollte keine Globale Variable text nennen (eben weil text ein Feld von TForm ist). (Das hat aber wohl noch nix mit deinem Problem zu tun).
Was mir weiter auffällt: userold ist lokal definiert - und daher wird es am ende der Prozedur verworfen. Es ist also nicht nur beim ersten aufruf nicht definiert, sondern bei jedem!
--> Lösung wäre Global zu definieren. Und dann am besten im OnCreate-Ereignis mit irgendeinem unproblematischen Wert vordefinieren, z.B. eben -9999. Bei bedarf diesen Wert dann eben abfragen. Oder du definierst eine Globale Boolean-Variable "erstmals" die mit true vordefiniert ist, und beim ersten klick auf false gestellt wird. Oder...
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: Sa 06.09.08 10:45
Text ist das was er sich auß der Txt vom WebServer holt.
Dann ich kann da nur mit Text arbeiten weil es Caption nicht gibt.
(Kann man zur Not später ja noch ändern.)
Hab userint und userold nun geändert das sie nicht mehr lokal definiert sind.
Habes jetzt noch das hinzugefügt:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TfrmMain.FormCreate(Sender: TObject); begin userold:= -1; end; |
So funktioniert alles.
1000 Dank fürs Helfen.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Sa 06.09.08 19:28
DiamondDog hat folgendes geschrieben: | Text ist das was er sich auß der Txt vom WebServer holt.
Dann ich kann da nur mit Text arbeiten weil es Caption nicht gibt.
(Kann man zur Not später ja noch ändern.) |
Deklariere für die HTTP-Antwort statt text einfach eine lokale Variable, zum Beispiel Response (Antwort) in der Prozedur selber.
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 06.09.08 19:53
|
|