Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehlermeldung: Operator ist auf Operandentyp nicht anwendbar (https://www.delphipraxis.net/81528-fehlermeldung-operator-ist-auf-operandentyp-nicht-anwendbar.html)

ark4869 28. Nov 2006 18:41


Fehlermeldung: Operator ist auf Operandentyp nicht anwendbar
 
Hallo.
Es tut mir Leid, falls es einen Thread dieser Art schon gibt, aber ich habe beim momentanen programmieren ein kleines Problem.
Wir haben die Aufgabe, einen Taschenrechner zu programmieren. Alles kein Problem, komme inzwischen recht gut damit klar.
Ich möchte jetzt gerne als kleine Extrafunktion(Es ist noch ein einfacher +,-,*,/ Rechner) eine Funktion einbringen, dass man das letzte Zeichen wieder wegmachen kann. Also wie auf dem normalen Taschenrechner "<--" .

Wenn die komplette Prozedur nun so lautet:
Zitat:

procedure TForm1.BBteinswegClick(Sender: TObject);
begin
EdWai.Text := EdWai.Text - ' '
end;
und ich kompilieren möchte, kommt die Fehlermeldung
"Operator ist auf diesen Operandentyp nicht anwendbar".
Wenn ich das - in ein + ändere, kompiliert der normal, und macht alles richtig, nimmt halt nicht eine Ziffer im Editfenster weg, sondern gibt eine Leerstelle dazu.
Auch wenn ich, einfach zum probieren, statt „ – ' '“ „ FloatToStr(0)“ z.B. einsetze, kommt diese Fehlermeldung...
Bei der Delphi Hilfe verstehe ich leider kein Wort.
Kann mir vielleicht jemand helfen?

Mit freundlichen Grüßen
Ark4869

mkinzler 28. Nov 2006 18:47

Re: Fehlermeldung: Operator ist auf Operandentyp nicht anwen
 
Man kann von einem String Nichts abziehen. In deinem Fall würde ein
Delphi-Quellcode:
s := EdWai.Text;
SetLength( s, Length( s) -1);
EdWai.Text := s;
helfen.

himitsu 28. Nov 2006 18:50

Re: Fehlermeldung: Operator ist auf Operandentyp nicht anwen
 
Tja, sowas geht halt mit Strings nicht,

abgesehn davon ... was soll den bei diser subtraktion rauskommen?

Delphi-Quellcode:
// z.B.:
irgendwas - ' ' = ?
// oder
irgendwas - 'X' = ?
...

Als wichtigste Funktionen um Zeichen aus 'nem String zu entfernen, oder einen Bereich aus einem String auszuwählen sind Delphi-Referenz durchsuchenCopy und Delphi-Referenz durchsuchenDelete:
Delphi-Quellcode:
EdWai.Text := Copy(EdWai.Text, 1, Length(EdWai.Text) - 1);

s := Copy(EdWai.Text, 1, Length(EdWai.Text) - 1);
EdWai.Text := S;

s := EdWai.Text;
s := Copy(s, 1, Length(s) - 1);
EdWai.Text := S;



S := EdWai.Text;
Delete(S, Length(EdWai.Text), 1);
EdWai.Text := S;
[add]
stimmt, Delphi-Referenz durchsuchenSetLength gibt's och

ark4869 28. Nov 2006 18:55

Re: Fehlermeldung: Operator ist auf Operandentyp nicht anwen
 
Danke sehr, funktioniert...
Aber ich bin so clever, dass ich eigentlich weiss dass es mir, ohne es zu verstehen, eigentlich nicht viel bringt. Werde mir also mal SetLength angucken und mich dann wieder melden, wenn ich noch Probleme habe.
Noch einmal vielen Dank :)

Also die Funktion mit dem delete verstehe ich schon besser, doch noch etwas unklar ist mir, wofür man Variable s braucht, dies wird aber, wie gesagt, bestimmt beim Lesen der Delphi Hilfe kommen :)
Was dabei rauskommen soll: Die letzte Ziffer im Edit soll weg sein ;)

OK, mir ist es jetzt klar, ich zitiere mal mein Informatikbuch :
" S ist eine String-Variable, Index und Count sind Integer-Ausdrücke. Delete löscht ab der durch Index angegebenen Position Count Zeichen aus dem String S."

Ich danke Euch Beiden nochmal, dafür, dass Ihr mir geholfen habt, und dafür, dass Ihr Euch die Zeit dafür genommen hat :D

Mit freundlichen Grüßen
ark4869

mkinzler 28. Nov 2006 18:58

Re: Fehlermeldung: Operator ist auf Operandentyp nicht anwen
 
SetLength verändrt die Länge des Strings.
Das Zwicshenspeichern in eine Variable ist notwendig, da man die Property .Text nicht direkt manipulieren kann.

himitsu 28. Nov 2006 19:07

Re: Fehlermeldung: Operator ist auf Operandentyp nicht anwen
 
Zitat:

Zitat von ark4869
doch noch etwas unklar ist mir, wofür man Variable s braucht

Nee, steht da nicht ... es wird leider nur über Umwege erkennbar.
(Thema Setter- und Getter-Methoden)

SetLength und Delete verlangen einen Var-Parameter,
da sie den Inhalt direkt in der Variable verändern.

Copy ließt dagegen nur den Inhalt aus und gibt das geänderte als Ergebnis zurück.

Delphi-Quellcode:
OUT := copy(IN, x, y);

delete(IN_OUT, x, y);

setlength(IN_OUT, x);
.Text ist aber keine Variable, sondern ein Property und da ist es so, daß es in Wirklichkeit 2 Funktionen sind ... eine zum Auslesen der Inhalts und eine zum Setzen.
Daher muß da wo der Ihnalt direkt geändert wird, praktisch erst der Inhalt ausgelesen, dann geändert und zum Schluß wieder gesetzt werden ... also muß der Inhalt irgendwo zwichengespeichert werden.

ark4869 28. Nov 2006 19:09

Re: Fehlermeldung: Operator ist auf Operandentyp nicht anwen
 
Warum kann man bei einem String denn addieren, aber nicht subtrahieren?
Und warum funktionieren in meinem Programm Befehle wie
Zitat:

EdWai.Text := EdWai.Text +FloatToStr(6)
,
wenn man Text nicht "manipulieren" kann.
Manipulieren hab ich in Anführungszeichen gesetzt, weil ich nicht genau weiss, wie du es meinst, ob du es einfach wie ändern meinst, oder in einem Sinn, den ich nicht kenne.

Edit:
OK, den letzten Punkt versteh ich jetzt, es liegt also an den Funktionen die man braucht, hätt ich da oben irgendwas mit Copy gehabt, hätte ich das ähnlich wie hier im Thread beigebracht machen müssen. Aber trotzdem bleibt die Frage, warum man addieren, aber nicht subtrahieren kann.

Mit freundlichen Grüßen
Ark4869

himitsu 28. Nov 2006 19:13

Re: Fehlermeldung: Operator ist auf Operandentyp nicht anwen
 
Das ist wohl mehr nur ein Syntaktischer Fehler in der Sprache.

In PHP wird z.B. mit "+" Addiert und über "." Strings aneinander gehängt.

Es wird also nicht addiert, sondern aneinander gehängt.


[add]
Code:
EdWai.Text := EdWai.Text +FloatToStr(6)
^setzen      ^auslesen
Man sieht es zwar nicht, aber Delphi macht aus diesem Code folgendes:
Delphi-Quellcode:
EdWai.GetText(TempVar1);    // TempVar1 := EdWai.Text;
FloatToStr(TempVar2, 6);    // TempVar2 := FLoaToStr(6);
Concat(TempVar1, TempVar2); // TempVar1 := TempVar1 + TempVar2;
EdWai.SetText(TempVar1);    // EdWai.Text := TempVar1;

mkinzler 28. Nov 2006 19:15

Re: Fehlermeldung: Operator ist auf Operandentyp nicht anwen
 
Zitat:

Warum kann man bei einem String denn addieren, aber nicht subtrahieren?
Das "+" bedeutet nich das addiert wird, sondern ist eigentlich ein Verketten.
Zitat:

Manipulieren hab ich in Anführungszeichen gesetzt, weil ich nicht genau weiss, wie du es meinst, ob du es einfach wie ändern meinst, oder in einem Sinn, den ich nicht kenne.
Wie himitsu schon genauer ausgeführt hat ist .Text kein normaler Member sondern ist eine Property die eigentlich nur "virtuell" besteht. Sie wird vom Compiler entweder auf Getter/Setter umgelenkt oder auf einen (normalerweise private) Member. man kann deshalb nicht einfach andere Funktionen darauf anwenden.

ark4869 28. Nov 2006 19:17

Re: Fehlermeldung: Operator ist auf Operandentyp nicht anwen
 
Okay, ich glaube ich habe alles verstanden :)
Danke nochmals, ich glaub jetzt hab ich wirklich keine Fragen mehr :D

Mit freundlichen Grüßen
Ark4869


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 Uhr.
Seite 1 von 3  1 23      

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