44 Stimmen

Warum funktioniert dieser Code nicht in Object Pascal?

Frage von Muschelknacker | 22.10.2019 um 19:48

Warum funktioniert dieser Code nicht in Object Pascal?

procedure TbestandDataForm.DBEdit1Change(Sender: TObject);
var
  OldChange: TNotifyEvent;
  OldStart: Integer;
begin
  with (Sender as TDBEdit) do
  begin
    OldChange := OnChange;
    OnChange := nil;
    OldStart := SelStart;
    if ((SelStart > 0) and (Text[SelStart - 1] = '')) or (SelStart = 1) then
    begin
      SelStart := SelStart - 1;
      SelLength := 1;
      SelText := AnsiUpperCase(SelText);
    end;
    OnChange := OldChange;
    SelStart := OldStart;
  end;
end;

Error: Projekt werkzeug hat Exception-Klasse »External: SIGSEGV« ausgelöst.

In Datei 'unit2.pas' in Zeile 69:

if ((SelStart > 0) and (Text[SelStart - 1] = '')) or (SelStart = 1) then

AntwortenPositivNegativDatumStimmen
33 Stimmen

Du musst schon ein bisschen mehr Informationen geben und nicht nur hier einen Quelltext hinhauen ohne irgendwelche Erläuterungen zu geben.

Vermutlich wird der Index "SelStart - 1" zu groß sein für die Länge von "Text". Aber viel mehr kann man dazu jetzt nicht sagen ohne weitere Informationen.

Darüberhinaus ist die Rückgabe von Text[SelStart - 1] ein char (Länge von 1, zum Beispiel ein Buchstabe) und kann gar nicht '' (leer) sein. Vielleicht meinst du sowas wie Text = '' stattdessen.
22.10.2019 um 22:04

AntwortenPositiv Negativ
33 Stimmen

Entschuldigung, ich war unkonzentriert.

Vor langer Zeit hat ein Herr Warren im SwissDelphiCenter eine Lösung für folgendes Problem vorgestellt : in einem TEdit jedes erste Zeichen eines Wortes in einen Großbuchstaben umwandeln.

Ich hatte vor, diesen Code mal in Pascal mit einem DBEdit zu testen.

Das geht offensichtlich nicht.

(ich habe keinerlei Ausbildung in Programmierung, es ist nur Hobby)
27.10.2019 um 12:52

AntwortenPositiv Negativ
33 Stimmen

Warum sagst du das nicht gleich, was du erreichen möchtest?

Probiere doch mal sowas wie das hier:

procedure TForm1.Edit1Change(Sender: TObject);
var
  s: string;
begin

  s := (Sender as TEdit).Text;

  if length(s) > 0 then begin
     s[1] := UpperCase(s[1])[1];
     (Sender as TEdit).Text := s;
  end;

end;    

Habe das jetzt zwar nicht getestet, aber so etwas in die Richtung sollte prinzipiell funktionieren.
27.10.2019 um 18:56

Positiv Negativ
33 Stimmen

Danke Compi für deinen Denkanstoß.

Was bedeutet s[1] ?

Das erste Zeichen im String ?

Ab dem zweiten Zeichen muß es ja mit LowerCase weitergehen.

Also etwa LowerCase(s[????],.....und irgendetwas);

Habe verschiedene Parameter versucht, kein Erfolg, inkompatieble Typen usw. ??
Letztes Update am 29.10.2019 | Erstellt am 29.10.2019

Positiv Negativ
33 Stimmen

Sorry, hab hier ein paar Tage nicht rein gesehen.

Genau. Das s[1] ist das erste Zeichen des Strings. Mit [] kannst du auf die einzelnen Zeichen zugreifen.

Das mit lowercase hast du ja auch noch nicht verraten.. Bitte sag doch sowas am Anfang. Mit [] kannst du nur auf einzelne Zeichen zurück greifen. Wenn du mehrere willst, arbeite mit der Funktion copy.
07.11.2019 um 00:01

Positiv Negativ
33 Stimmen

Hallo Compi,

ich hab nun mein Projekt überarbeitet und die oberste procedure entfernt, wobei ich nun an sinnvoller Stelle für einige Komponenten die Eigenschaft "CharCase" verwende.

Danke für deine Hilfe, bis später mal wieder.....................
03.02.2020 um 18:13

Positiv Negativ
Antworten
Antworten

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.