Backspace

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Fantasia
Beiträge: 3
Registriert: So 30. Aug 2015, 17:45

Backspace

Beitrag von Fantasia »

Hallo zusammen!

Ich bin noch sehr neu in diesem Forum, daher "blutiger Anfänger", wenn ich mich mal irgendwie kategorisieren sollte ;)

Zu meiner Frage:


Ich arbeite momentan an einem Projekt, bei dem ich auf Eure Hilfe angewiesen bin (Recherche hat bisher leider nichts Brauchbares ergeben)!
Es geht um die Aufgabe, per Klick auf ein Image, Button und co. den letzten Buchstaben/ die letzte Zahl eines Labels (beliebige Buchstaben/Zahlenfolge und -anzahl) zu löschen (prinzipiell die Funktion, die sonst die "Backspace"- Taste übernimmt). Ich hab zwar schon einiges von 'vorgefertigten' Prozeduren gelesen, die Wörter zählen können oder auch fest definierte Teile eines Edit-Feldes markieren, eine Lösung für das beschriebene Problem aber leider noch nicht gefunden.

Vielen Dank für Eure Unterstützung! ;)

Fantasia

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Backspace

Beitrag von Komoluna »

versuch mal Copy:

Code: Alles auswählen

s := Copy(s, 1, Length(s)-1);
s ist der Text den du bearbeiten willst.

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Fantasia
Beiträge: 3
Registriert: So 30. Aug 2015, 17:45

Re: Backspace

Beitrag von Fantasia »

Hallo Komoluna,

vielen Dank für die schnelle Antwort!

Genau so etwas habe ich gesucht, dann zählt 'Lenght(String)' wahrscheinlich immer die Buchstaben eines Textes... ;)

Beste Grüße
Fantasia

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Backspace

Beitrag von Komoluna »

Richtig, der Befehl Copy nimmt 3 Parameter:
1. der Eingangsstring
2. die Position des ersten Zeichens das kopiert werden soll
3. die Anzahl Zeichen die kopiert werden sollen

Mein Beispielcode sagt also: "Kopier vom String s alle Zeichen außer dem letzten"

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.


Developer CPS
Beiträge: 15
Registriert: Fr 28. Aug 2015, 18:44
OS, Lazarus, FPC: Windows 10 (L 1.4.4, FPC 2.6.4)
CPU-Target: 64-Bit
Wohnort: Baden-Württemberg, Deutschland
Kontaktdaten:

Re: Backspace

Beitrag von Developer CPS »

Ich denke, es geht noch einfacher:

Code: Alles auswählen

s := s[1..(length[s]-1)];

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Backspace

Beitrag von Socke »

Developer CPS hat geschrieben:Ich denke, es geht noch einfacher:

Code: Alles auswählen

s := s[1..(length[s]-1)];
Sofern Length(s) > 0 ist, funktioniert auch deine Variante. Die Variante mit Copy() hat den Vorteil, dass bei Length(s) = 0 ein Leerstring zurückgegeben wird.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

SoE
Beiträge: 84
Registriert: Mo 31. Aug 2015, 01:51

Re: Backspace

Beitrag von SoE »

Hi ihr Anfänger... grins... wieso sagt keiner AnsiLastChar ????

@Fantasia:
Ich komm' zwar von D7 aber Lazarus kennt auch AnsiLastChar. Das eignet sich super um von mehreren Komponenten die Sender Variable auszuwerten:

If AnsiLastChar(TButton(Sender).Name) = '1' Then ShowMessage('Button 1 wurde gedrückt');

oder

AnsiLastChar('Text');

oder

If AnsiLastChar('Fantasia') = 'a' Then ShowMessage('Volltreffer');

usw. usw. usw. ....

OK, ich sollte nicht nur das Fettgedruckte lesen...
Edit: Schau dir mal "Delete" an !!!

Code: Alles auswählen

 
// Label1 löschen mit Backspace...
// KeyPreview auf True von Form1
 
Procedure TForm1.FormCreate(Sender: TObject);
 Begin
  Form1.DoubleBuffered := True;
 End;
 
Procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
 Var
  s : AnsiString;
 Begin
  If Key = Chr(8)
  Then
   Begin
    s := Label1.Caption;
    Delete(s,Length(s), 1);
    Label1.Caption := s;
   End;
 End;     
 

Code: Alles auswählen

 
// KeyPreview im Objektinspektor = True
// Uses Windows (+ Sound) hahaha... Backspace Delete
 
Procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
 Var
  s : AnsiString;
 Begin
  If Key = Chr(8)
  Then
   Begin
    s := Label1.Caption;
    If Length(s) = 0 Then Exit;
    Windows.Beep(800,30);
    Delete(s,Length(s), 1);
    Label1.Caption := s;
   End;
 End;            
 
oder so

Code: Alles auswählen

 
// wenn es zu sehr flackert, dann Form1.DoubleBuffered := True; im OnCreate der Form
 
Procedure TForm1.Button1Click(Sender: TObject);
  Var
   s : String;
 Begin
  s := Label1.Caption;
  SetLength(s, Length(s)-1);
  Label1.Caption := s;
 End; 
 

Code: Alles auswählen

 
// uses Windows, Form1 (im Objektinspektor KeyPreview auf True stellen)
// Komponenten: Form1 und Label1... dann löschen mit Backspace
// wenn es zu sehr flackert, dann Form1.DoubleBuffered := True; im OnCreate der Form
 
Procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
 Var
  s : String;
 Begin
  If (Key = vk_Back)
  Then
   Begin
    s := Label1.Caption;
    SetLength(s, Length(s)-1);
    Label1.Caption := s;
   End;
 End;  
 

Code: Alles auswählen

 
// ohne uses Windows aber mit KeyPreview : True, Löschen mit Backspace
// wenn es zu sehr flackert, dann Form1.DoubleBuffered := True; (OnCreate)
 
Procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
 Var
  s : String;
 Begin
  If Key = Chr(8)
  Then
   Begin
    s := Label1.Caption;
    SetLength(s, Length(s)-1);
    Label1.Caption := s;
   End;
 End;
 
Unendliche Weiten.... ähmmm Möglichkeiten meine ich....

Martin V
Beiträge: 142
Registriert: Sa 30. Jan 2010, 19:35
OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
CPU-Target: xxBit

Re: Backspace

Beitrag von Martin V »

Weil es verschiedene Stringtypen gibt (#0-terminiert, mit Längenbyte an der Stelle String[0]), ist es grundsätzlich ratsam, keine stringtyp-spezifischen Befehle wie dec (string[0]) zu schreiben (das funktioniert nur mit shortstring), sondern die allgemeinen String-Manipulationsfunktionen von Lazarus zu nehmen wie setlength, copy, insert, delete. Man kann dann später den Stringtyp verändern, ohne das Programm umschreiben zu müssen. Ausnahme: Wenn das Programm historisch gewachsen ist oder wenn es auf Geschwindigkeit ankommt.

Fantasia
Beiträge: 3
Registriert: So 30. Aug 2015, 17:45

Re: Backspace

Beitrag von Fantasia »

Hallo!

Vielen Dank für die zahlreichen Antworten auf die eingangs gestellte Frage!

@ Creed Steiger: Ich habe mir mal die ganzen Stringmanipulationen durchgeschaut und wirklich einiges dazugelernt. Gerade solche Verweise sind aus meiner Sicht hilfreich, um immer mal wieder was dazuzulernen. ;)

@ Developer CPS: Stimmt, ist aber nicht so spannend :D

@ SoE: Jetzt beginne ich auch mal, das mit den unterschiedlichen Stringtypen zu verstehen, das sind doch nicht so unkomplizierte "Texthalter" wie anfangs gedacht. ;) Was ich aber noch nicht ganz verstehe ist, warum man denn überhaupt "ShortString" verwendet sollte, wenn man mit "AnsiString" auch die "255-Zeichen-Hürde" bequemstens umgehen kann...

Beste Grüße!
Fantasia

SoE
Beiträge: 84
Registriert: Mo 31. Aug 2015, 01:51

Re: Backspace

Beitrag von SoE »

Hi,

@ Fantasia:
Nirgendwo steht geschrieben, dass man einen ShortString benutzen muss...
Aber ich kann dazu gar nichts Sinnvolles sagen, da ich nie einen Grund hatte einen solchen einzusetzen und deshalb hab' ich mich nie mit dem ShortString befasst.

Für mich war das immer ein Relikt aus den Tagen von Delphi 1...

Antworten