Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi "Delete" funktioniert nicht (https://www.delphipraxis.net/142176-delete-funktioniert-nicht.html)

NeruvonoS 23. Okt 2009 08:31


"Delete" funktioniert nicht
 
Hallo :)

Ich hab mal wieder nen Problem:
Ich wollte aus meinem Array (ein String) die ersten beiden Zeichen löschen.
Delphi-Quellcode:
Delete(Array[x],1,2);
Die Fehlermeldung:
Zitat:

[Error] Hauptteil.pas(411): Incompatible types: 'String' and 'procedure, untyped pointer or untyped parameter'
Weiß wer was mir das sagen möchte?

Grüße
NeruvonoS

NeruvonoS 23. Okt 2009 08:35

Re: "Delete" funktioniert nicht
 
Was mir einfällt:
Der Array ist vom Typ ein Record. Die Stelle im Record aber ein String.
Delphi-Quellcode:
Delete(Array[x].String,1,2);
Das sollte aber eigentlich nicht stören oder?

Uwe Raabe 23. Okt 2009 08:35

Re: "Delete" funktioniert nicht
 
Zitat:

Zitat von NeruvonoS
Weiß wer was mir das sagen möchte?

"Das ist nicht das Delete, das du meinst! Dein Delete heißt hier System.Delete"

Progman 23. Okt 2009 08:36

Re: "Delete" funktioniert nicht
 
Vorausgesetzt, das Array ist ein Array[x..y] of String, dann mal über eine Zwischenvariable gehen:
Delphi-Quellcode:
var s: String;

  s:=Array[x];
  Delete(s,1,2);
  Array[x]:=s;
Das dürfte dann funktionieren ;)

NeruvonoS 23. Okt 2009 08:59

Re: "Delete" funktioniert nicht
 
Okay ich machs doch mal etwas ausführlicher:
Delphi-Quellcode:
Button.Caption := Copy(Array[x].Name,3,pos(' ',System.Delete(Array[x].Name,1,2));
Ich Kopiere also den Array[x].Name ab der 3. Stelle(Da die ersten beiden = ' ' sind. und zwar soviele zeichen bis er das nächste ' ' findet. das nächste ' ' findet er aber nicht. Denn: pos sucht nur das 1. raus was er findet, dewegen möchte ich die ersten beiden zeichen kurzzeitig löschen und nicht ganz aus dem Array vernichten.
Zu System.Delete:
[Error] Hauptteil.pas(410): Incompatible types


Er sagt mir aber auch 'Incompatible types' wenn ich nur Delete nehme... ist also noch ein gedanken fehler drin...

NeruvonoS 23. Okt 2009 09:02

Re: "Delete" funktioniert nicht
 
Zitat:

Zitat von Progman
Das dürfte dann funktionieren ;)

Leider auch nicht. Wäre ja auch sinnlos wenn man es anstatt in eine in 3 schreiben muss, damit es funktioniert.

Progman 23. Okt 2009 09:17

Re: "Delete" funktioniert nicht
 
Wäre es möglich, dass man ein Array nicht "Array" nennen sollte und den Bezeichner "name" vermeiden sollte? Das könnte so manches durcheinander bringen. Vielleicht ist das der Grund?

NeruvonoS 23. Okt 2009 09:19

Re: "Delete" funktioniert nicht
 
der array heißt nicht array,
aber was ist an Name so schlimm?

Progman 23. Okt 2009 09:23

Re: "Delete" funktioniert nicht
 
"Name" ist eigentlich ein reserviertes Wort, da viele Objecte/Komponenten die Eigenschaft "Name" haben. Da kann der Compiler schon mal ins stolpern kommen ;)

Uwe Raabe 23. Okt 2009 09:25

Re: "Delete" funktioniert nicht
 
Die Deklaration von Delete lautet

Delphi-Quellcode:
procedure Delete(var S: string; Index: Integer; Count: Integer);
Damit ist ersichtlich, daß Delete keinen String zurückgibt, sondern den String im ersten Parameter ändert.

Delphi-Quellcode:
tmpName := Array[x].Name;
Delete(tmpName, 1, 2);
N := pos(' ', tmpName) - 1; // wir wollen den Blank ja nicht mit kopieren!
if N < 0 then
  N := Length(tmpName);
Button.Caption := Copy(tmpName, 1, N); // "1", da tmpName die ersten Blanks nicht mehr enthält

NeruvonoS 23. Okt 2009 09:30

Re: "Delete" funktioniert nicht
 
Das Problem dabei ist, dass ich schon nen 1100 Zeilen langen Quellcode habe.
Da alle ersetzen für einen Test würde es glaub ich nur unübersichtlicher erscheinen lassen.
Vor allem da auch andere Captions mit Name oder Namen benannt sind. (die stören zwar nicht, aber dann sind die zum neuen Variablennamen nicht mehr gleich -> folge unübersichtlich... dabei geht es doch bisher noch :( )
Und es ist ja noch nichteinmal gesagt dass es daran liegt. ich probiers nochmal mit dem auslagern in nen anderen String. Dann sollte man es ja merken


So @Uwe:
Mein Array[x].Name ist IMMER mit 20 Zeichen belegt.
Ansonsten seh ich noch keinen Unterschied zu meinem QC

NeruvonoS 23. Okt 2009 09:35

Re: "Delete" funktioniert nicht
 
ALSO
das programm läuft.
das macht doch echt kein spaß, warum gibt denn Delete keinen String wieder aus?
Grummel
nagut danke trotzdem euch beiden

Grüße
NeruvonoS

Progman 23. Okt 2009 09:40

Re: "Delete" funktioniert nicht
 
Zitat:

Zitat von NeruvonoS
....warum gibt denn Delete keinen String wieder aus?.....

Delete ist nun mal keine Function sondern eine Procedure und ändert nur die übergebene String-Variable.

Uwe Raabe 23. Okt 2009 09:56

Re: "Delete" funktioniert nicht
 
Zitat:

Zitat von NeruvonoS
Mein Array[x].Name ist IMMER mit 20 Zeichen belegt.

Und was willst du damit sagen? Alles was wir (glauben zu) wissen ist, daß die ersten beiden Zeichen Blanks sind. Weiterhin "vermuten" wir, daß das dritte Zeichen kein Blank ist. Aber können wir auch davon ausgehen, daß immer ein dritter Blank enthalten ist?

Selbst wenn deine Daten immer gewissen Regeln genügen, ist es kein Luxus, das Einhalten dieser Regeln auch zu überprüfen. Ein gutes Hilfsmittel dazu sind Assertions.

NeruvonoS 23. Okt 2009 10:33

Re: "Delete" funktioniert nicht
 
Zitat:

Zitat von Uwe Raabe
Assertions

Was ist das?

alzaimar 23. Okt 2009 10:34

Re: "Delete" funktioniert nicht
 
Zitat:

Zitat von NeruvonoS
Das Problem dabei ist, dass ich schon nen 1100 Zeilen langen Quellcode habe.
Da alle ersetzen für einen Test würde es glaub ich nur unübersichtlicher erscheinen lassen.

Du verwendest also 100x den gleichen unübersichtlichen und fehleranfälligen Code?
Hast Du schon mal etwas von Refactoring gehört?

Sir Rufo 23. Okt 2009 10:44

Re: "Delete" funktioniert nicht
 
Zitat:

Zitat von NeruvonoS
ALSO
das programm läuft.
das macht doch echt kein spaß, warum gibt denn Delete keinen String wieder aus?
Grummel
nagut danke trotzdem euch beiden

Grüße
NeruvonoS

Wat macht ihr denn hier für ein Geschi**e um die Funktionalität von Delete.
Wenn die gewünschte function/procedure nicht ganz das macht, was sie soll,
dann definier einfach deine eigene:
Delphi-Quellcode:
function DeleteStr( const s : string; Index, Count : integer ) : string;
begin
  Result := s;
  Delete( Result, Index, Count );
end;
Jetzt hast du eine function, die den Ursprungs-String nicht ändert und einen String zurück liefert.

cu

Oliver

PS: Das ganze Trara um 4 Zeilen Code :mrgreen:

NeruvonoS 23. Okt 2009 11:59

Re: "Delete" funktioniert nicht
 
Zitat:

Zitat von alzaimar
Hast Du schon mal etwas von Refactoring gehört?

Was zur Hölle?

Eieiei, kommt doch mal alle runter :)
Ich werd hier mit Begriffen zugeworfen...
Ich bin kein verrückter der einfach mal so ne Sprache lernt und sich mit allem auskennt, ich programmiere zum Spaß. Ist doch wohl klar, dass ich wahrscheinlich nicht sauber arbeite und ich wette schon fast mein QC 25% Zeilen zuviel hat, nur wegen unnützen kram.
Ich habe nichts gegen Kritik oder Vorschläge,
aber bitte, wenn ihr iwelche Begriffe nuzt die nicht jeder automatisch kennt, beschreibt sie bitte.

Danke

Uwe Raabe 23. Okt 2009 11:59

Re: "Delete" funktioniert nicht
 
Zitat:

Zitat von NeruvonoS
Zitat:

Zitat von Uwe Raabe
Assertions

Was ist das?

Fragen zu Assert


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 Uhr.

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