Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - delete/insert --> untyped


BlauBeer - Fr 08.10.10 10:38
Titel: delete/insert --> untyped
in der Schule lernen wir gerade Delphi (Borland Delphi 5.0 (build 5.6.2)), da ich ausschließlich Linux benutze verwende ich Lazarus 0.9.29

wir sollen an einem einfachen Beispiel demonstrieren, dass wir die Grundlagen von Stringverarbeitung verstanden haben - theoretisch müsste es funktionieren, bis auf ein paar Stellen:


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:
41:
42:
43:
44:
45:
46:
...

procedure TForm1.cmdInsClick(Sender: TObject);
var str,strIns: String;
var s: Integer;
begin
  str:=txtWortein.Text;
  strIns:=txtInsert.Text;
  If ((str<>''And (strIns<>''))Then
      begin
          s:=StrToInt(txtStelle.Text);                                            //Programmabsturz wenn s keine Zahl ist!!!
          If (0<s) And (s<(length(str)+1)) Then
              ShowMessage('Der neue Text: '+Insert(strIns,str,length(str)))       //Falscher Typ (untyped expected AnsiString)???
          Else
              ShowMessage('Fehlerhafte Stelle!')
      end
  Else
      ShowMessage('Keine Eingabe oder kein einzufügender Text!');
end;

...
                                                                                                                                 
procedure TForm1.cmdDelClick(Sender: TObject);                                                                                   
var str: String;                                                                                                                 
var s,l: Integer;                                                                                                                
begin                                                                                                                            
  str:=txtWortein.Text;                                                                                                          
  If (str<>'')Then                                                                                                               
      begin                                                                                                                      
          s:=StrToInt(txtStelle.Text);                                            //Programmabsturz wenn s keine Zahl ist!!!     
          If (0<s) And (s<(length(str)+1)) Then                                                                                  
             begin                                                                                                               
                 l:=StrToInt(txtAnzahl.Text);                                     //Programmabsturz wenn l keine Zahl ist!!!     
                 If (0<l) And (l<length(str)+1-s) Then                                                                           
                    ShowMessage('Der neue Text: '+Delete(str,s,l+s))              //Falscher Typ (untyped expected AnsiString)???
                 Else                                                                                                            
                     ShowMessage('Fehlerhafte Länge!')                                                                           
             end                                                                                                                 
          Else                                                                                                                   
              ShowMessage('Fehlerhafte Stelle!')                                                                                 
      end                                                                                                                        
  Else                                                                                                                           
      ShowMessage('Keine Eingabe!');                                                                                             
end;

...

Die Fehlermeldung (Zeilen angepasst):

Delphi-Quelltext
1:
2:
3:
unit1.pas(13,45) Error: Incompatible types: got "untyped" expected "AnsiString"
unit1.pas(35,51) Error: Incompatible types: got "untyped" expected "AnsiString"
unit1.pas(277) Fatal: There were 2 errors compiling module, stopping


MaxWurzel - Fr 08.10.10 10:50

procedure Insert(Source: string; var S: string; Index: Integer); hat keinen Rückgabewert. Versuch mal folgendes:

Delphi-Quelltext
1:
2:
Insert(strIns,str,s);
ShowMessage('Der neue Text: '+str);


ALF - Fr 08.10.10 10:51

Hi und :welcome:
Schau mal was es darüber schon gibt nur Zahlen zulassen in einem Editfeld [http://www.delphi-forum.de/topic_eingabemoeglichkeiten+bei+editfeldern+beschraenken_99454.html]
Sieht komisch aus?

Delphi-Quelltext
1:
If (0<s) And (s<(length(str)+1)) Then                    

aber Stringverarbeitung, hat nicht nur was mit Zahleneingabe zu tun. Oder habe ich Deine Hausaufgabe falsch verstanden?

Gruss Alf


Bergmann89 - Fr 08.10.10 19:03

Hey,

eine Anwendung, die abstützt, oder mit Fehlern um sich schmeißt ist nicht so schön. Speziell für dein Programm gibt es in Delphi 3 einfache Methoden die Fehler zu umgehen:
1. Lösung: Fehler abfangen und ordentliche Meldung ausgeben:

Delphi-Quelltext
1:
2:
3:
4:
5:
try
  s := StrToInt(Edit1.Text);
except
  ShowMessage('Sie müssen eine Zahl eingeben!');
end;


2. Lösung: Fehler ignorieren:

Delphi-Quelltext
1:
  s := StrToIntDef(Edit1.Text, 0);                    


3. und besste Lösung: voher prüfen und dementsprechend handeln:

Delphi-Quelltext
1:
2:
  if not TryStrToInt(Edit1.Text, s) then
    ShowMessage('Sie müssen eine Zahl eingeben!');


MfG Bergmann.


BlauBeer - Sa 09.10.10 10:48

vielen Dank, es funktioniert :D