Autor Beitrag
DiamondDog
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: 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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 04.09.2008 um 19:42
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var NewValue: Integer;
begin
  if TryStrToInt(user, NewValue) and userint <> NewValue then
  begin
    { Button klicken }
  end;
end;
DiamondDog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Do 04.09.08 21:28 
Ok habs jetzt so versucht aber das ist nicht ganz richtig:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Fr 05.09.08 21:52 
Ok dann Poste ich mal einwenig mehr Code (hab das falsche von mir mal dringelassen):
ausblenden volle Höhe 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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
procedure TfrmMain.MultilineButton1Click(Sender: TObject);
var userint,userold:integer;
begin
Timer2.Interval:=10000// 10 sekunden.
Timer2.Enabled:=True;
Timer3.Interval:=2000;// 2 sekunden.
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:='*';

//Kontacklisten Text aktualisieren
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:
ausblenden 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
   {============================================}
   {example of how to show fading popup window}
   //0 - message style, 1 - information style, 2 - warning style
   aFadeWnd.FadeType  := 1;
   //its better to use ImageList of icons if you gonna show more than one icon everytime,
   //else you have to care about destroying your HICON after showing fade window, cauz core makes self copy of HICON
   aFadeWnd.FadeIcon  := LoadImage(0, IDI_INFORMATION, IMAGE_ICON, 1616, LR_DEFAULTCOLOR or LR_SHARED);

   aFadeWnd.FadeTitle := 'User-Online Plugin';
   aFadeWnd.FadeText  := user + ' ' + Edit2.Text;

   //if your text is too long, then you have to set this param to False
   aFadeWnd.TextCentered := True;

   //it's recommended to set this parameter = False if your fade window is not very important
   aFadeWnd.NoAutoClose := False;

   //send msg to qip core
   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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TfrmMain.FormCreate(Sender: TObject);
begin
userold:= -1;
end;


So funktioniert alles.
1000 Dank fürs Helfen.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Sa 06.09.08 19:28 
user profile iconDiamondDog 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



BeitragVerfasst: Sa 06.09.08 19:53 
user profile iconDiamondDog hat folgendes geschrieben:
Ok habs jetzt so versucht aber das ist nicht ganz richtig:
ausblenden 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.


Besser:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function TryStrToInt(const s: stringvar i : integer) : boolean;
var Error : word;
begin
  Val(s, i, Error);
  TryStrToInt:=Error=0
end;