Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Curosr in TEdit ans Ende setzen (https://www.delphipraxis.net/165471-curosr-tedit-ans-ende-setzen.html)

scrat1979 1. Jan 2012 19:48

Curosr in TEdit ans Ende setzen
 
Hallo Zusammen und ein Gutes Neues Jahr!!!!

Kaum hat das Jahr angefangen, schon habe ich das erste Problem. Manchmal scheint das einfachste schwer zu sein :(
Bevor ihr mich jetzt auf die SuFu oder Google verweist, ich habe dort gefühlte 1.000 Einträge zu dem Thema gefunden, alles funktioniert bei mir jedoch leider nicht. Ich verwende Delphi 2010 Pro und es geht um die Standard TEdit-Komponente.

Wie der Titel schon sagt, möchte ich den Cursor an das Ende eines Textes setzen. Aufgerufen wird die Funktion im OnEnter-Event des TEdit:

Delphi-Quellcode:
  if ((EditURL.Enabled) and (Length(EditURL.Text) = 0)) then begin
    EditURL.Text := 'http://';
    EditURL.SelStart := EditURL.GetTextLen;
  end;
Der Source ist ja selbsterklärend nur funktioniert das leider nicht. Auch andere Varianten mit SelLength etc. funktionieren nicht. Der Cursor bleibt schön links stehen. Mehr Code steht in der Procedure übrigends nicht drin, so dass ich ausschließen kann, dass ein anderer Code-Teil zu dem Verhalten führt.

Ich denke es ist ein simpler Denkfehler meinerseits und hoffe, dass mich jemand von der Leitung stupst :)

Grüsse

stahli 1. Jan 2012 20:17

AW: Curosr in TEdit ans Ende setzen
 
Der Denkfehler:
Delphi-Quellcode:
Length(EditURL.Text) = 0)
;-)
Zu viel gefeiert? :mrgreen:

scrat1979 1. Jan 2012 21:07

AW: Curosr in TEdit ans Ende setzen
 
Eigentlich nicht :) Ich denke schon dass das passt, vielleicht nochmals mein Vorhaben:

Ich habe ein Edit um - wie der Name schon sagt - eine Homepageadresse einzugeben. Wenn das Feld beim OnEnter-Event leer ist, soll die Zeichenkette "http://" eingefügt werden (Zeitersparnis...) und der Cursor an das Textende gesetzt werden. Daher bin ich der Meinung, dass die Überprüfung auf
Delphi-Quellcode:
Length(EditURL.Text) = 0
korrekt ist...

stahli 1. Jan 2012 21:20

AW: Curosr in TEdit ans Ende setzen
 
Oups. :oops:
Ich hatte die zweite Zeile übersehen und gedacht, der SelStart würde nur für Leerstrings aufgerufen.
Bei mir gilt die Feier-Ausrede übrigens gar nicht. Ich habe ordnungsgemäß gearbeitet. :-)

Bei mir funktioniert:
Delphi-Quellcode:
odEditPanel.SelStart := MaxInt;
Hast Du mal debugt, was überhaupt durchgeführt wird und was Text und TextLength liefert?

scrat1979 2. Jan 2012 05:44

AW: Curosr in TEdit ans Ende setzen
 
Okay, auf das bin ich natürlich nicht gekommen und nein, ich habe nicht gedebugged :oops: Ich sah dafür aber auch keinen Grund, das Edit ist ja definitiv vor dem Aufruf leer...

Werde es heute Abend gleich mal probieren und posten, ob es geklappt hat. Dank Dir!

scrat1979 2. Jan 2012 19:02

AW: Curosr in TEdit ans Ende setzen
 
Hab es versucht, leider ohne Erfolg, der Cursor bleibt nach wie vor am Beginn stehen :(

EDIT: Habe gerade noch herausgefunden, dass es funktioniert, wenn man das Control über TAB anspringt, klickt man in das TEdit mit der Maus rein, geht der Code leider nicht. Bei einem leeren Projekt sieht es übrigens exakt gleich aus...

stahli 2. Jan 2012 19:24

AW: Cursor in TEdit ans Ende setzen
 
Ach so, Du hast den Code im Edit.OnEnter?
Das sollest Du besser bei der Initialisierung des Formulars durchführen.

Alternativ wäre eine Ableitung von TEdit denkbar, die entsprechend angepasst wird.

Oder einen Timer starten, der SelStart mit einer kurzen Verzögerung durchführt.
Das widerspricht dann allerdings dem Standardverhalten und ist daher nicht unbedingt zu empfehlen.

scrat1979 2. Jan 2012 19:37

AW: Cursor in TEdit ans Ende setzen
 
Zitat:

Zitat von stahli (Beitrag 1144060)
Ach so, Du hast den Code im Edit.OnEnter?
Das sollest Du besser bei der Initialisierung des Formulars durchführen.

Alternativ wäre eine Ableitung von TEdit denkbar, die entsprechend angepasst wird.

Oder einen Timer starten, der SelStart mit einer kurzen Verzögerung durchführt.
Das widerspricht dann allerdings dem Standardverhalten und ist daher nicht unbedingt zu empfehlen.

Hmmmm. Aber ich will den Code ja erst explizit ausführen, wenn ich auf das TEdit klicke (bzw. wenn es den Focus erhält) und nicht schon, sobald das Formular aufgerufen / angezeigt wird. Es muss doch möglich sein, "http://" in das TEdit zu schreiben wenn es den Focus erhält und keinen Text enthält und den Curosr dann dahinter zu plazieren. Ich meine, wir fliegen zum Mars und bauen Raumstation in hunderten Kilomenter Höhe aber das kleine Problem bekommen wir nicht hin :-(

Hoffe auf weitere Tipps...

stahli 2. Jan 2012 19:56

AW: Cursor in TEdit ans Ende setzen
 
Zitat:

Zitat von scrat1979 (Beitrag 1144062)
Ich meine, wir fliegen zum Mars und bauen Raumstation in hunderten Kilomenter Höhe...

Aber WIR doch nicht ;-)

Ohne dass ich das jetzt im Detail untersucht habe, mal ein paar Überlegungen:

Wenn Du in ein Edit klickst, wird der Cursor an die entsprechende Position gesetzt. Das würde man auch so erwarten.
Dein gewünschtes Verhalten würde dem eher widersprechen.
Vielleicht kannst Du die Anzeige von "http://" einfach unterlassen und ggf. bei der späteren Verarbeitung ergänzen.

Wenn Du es im OnEnter machst, hat das Edit schon die Kontrolle übernommen. Der Klick ist ja schon erfolgt und die Klickposition vermerkt.
Dann wird der Fokus gesetzt und OnEnter aufgerufen. Dann setzt das Edit den Fokus an die Klickposition. Ich würde das zumindest so vermuten.
Im OnEnter kannst Du daher dann den Cursor nicht in jedem Fall beliebig setzen.

Du müsstest dazu das Verhalten des Edits ändern (durch eine Komponentenableitung) oder die Änderung nachträglich veranlassen (z.B. durch einen Timer).

Klaus01 2. Jan 2012 20:11

AW: Curosr in TEdit ans Ende setzen
 
Hallo,

würde es nicht gehen, wenn Du das http:// nachträglich hinzufügst wenn der User es nicht eingetragen hat. z.B. dann wenn das Editfeld verlassen wird.

Grüße
Klaus

Hansa 2. Jan 2012 20:37

AW: Curosr in TEdit ans Ende setzen
 
Eine URL rechtsbündig einzugeben, das ist wohl eher unüblich. Man schreibt hier nun mal von links nach rechts und nicht so wie die im nahen Osten. :mrgreen: Gehts mehr Richtung Taschenrechner, dann bleibt wohl nichts anderes übrig, als das TEdit zu erweitern :

http://www.swissdelphicenter.ch/de/showcode.php?id=714

Dieses eigene TEdit hätte dann ja auch eine zusätzliche published property, d.h. schon zur Designzeit könnte man das Verhalten einstellen.

scrat1979 2. Jan 2012 20:52

AW: Curosr in TEdit ans Ende setzen
 
Zitat:

Zitat von Klaus01 (Beitrag 1144068)
Hallo,

würde es nicht gehen, wenn Du das http:// nachträglich hinzufügst wenn der User es nicht eingetragen hat. z.B. dann wenn das Editfeld verlassen wird.

Grüße
Klaus

Da ICH der einzige User meines Programmes sein werde geht das natürlich, nur wollte ich es eigentlich so nicht. Naja, dann muss ich es halt so machen... :evil:

@Hansa: Danke für Deinen Tipp, Du scheinst das Problem jedoch falsch verstanden zu haben ( Wenn URL in Deinem Post nicht vorhanden gewesen wäre würde ich sagen "Falscher Thread" :) ). Spass beiseite, es geht nicht um die Ausrichtung von rechts nach links, sondern darum, nach dem Fokusieren eines TEdit - falls es leer ist - den Text "http://" zu setzen und den Cursor schonmal dahinter (also rechts neben dem "//") zu platzieren, um die Eingabe z.B. mit "www..." sofort beginnen zu können. Vielleicht fällt Dir ja dazu aber auch was ein :lol:

Grüsse und Danke schonmal an Alle!

Bummi 2. Jan 2012 22:20

AW: Curosr in TEdit ans Ende setzen
 
ein Versuch ...
Delphi-Quellcode:
procedure TForm1.Edit1Click(Sender: TObject);
begin
   if TEdit(Sender).Tag <> 0 then
      begin
      TEdit(Sender).Tag := 0;
      TEdit(Sender).SelStart := Length(TEdit(Sender).Text) + 1;
      end;
end;

procedure TForm1.Edit1Enter(Sender: TObject);
begin
   With TEdit(Sender) do
    begin
      if Length(Text)=0 then
          begin
            Text := 'http:\\';
            SelStart := Length(Text) + 1;
            Tag := 1;
          end;
    end;
end;

himitsu 2. Jan 2012 22:44

AW: Curosr in TEdit ans Ende setzen
 
Zitat:

Zitat von scrat1979 (Beitrag 1144055)
klickt man in das TEdit mit der Maus rein, geht der Code leider nicht.

Warum sollte es auch?

Hab hier nicht alles durchgelesen, aber wann/wo wurde der Code denn ausgeführt?

Passiert das vor dem Loslassen der Maustaste, dann ist das Verhalten vollkommen korrekt, denn mit Loslassen der Maustaste wird der Cursor ebenfalls an die Position des Mauszeigers gesetzt und schon ist es egal wo er vorher hingesetzt wurde.

Furtbichler 3. Jan 2012 07:42

AW: Curosr in TEdit ans Ende setzen
 
Delphi-Quellcode:
Procedure TForm1.Edit1Change(Sender: TObject);
begin
  if Edit1.Text='' Then begin
    Edit1.Text := 'http://';
    Edit1.SelStart := Length(Edit1.Text);
  end;
end;
So, nun versuch mal, das Edit-Feld zu leeren.

DeddyH 3. Jan 2012 07:46

AW: Curosr in TEdit ans Ende setzen
 
Und wo ist da jetzt der große Unterschied zu Bummis Code, außer dass dieser den Sender auswertet und das Tag belegt?

Furtbichler 3. Jan 2012 08:01

AW: Curosr in TEdit ans Ende setzen
 
Zitat:

Zitat von DeddyH (Beitrag 1144102)
Und wo ist da jetzt der große Unterschied zu Bummis Code, außer dass dieser den Sender auswertet und das Tag belegt?

Ich finde meinen Code irgendwie -wie soll ich's sagen- kürzer?

Und, na ja, es ist schon eine komische Frage und um ehrlich zu sein, muss ich suchen, um Gemeinsamkeiten zu finden.

1. Ich verwende ein Event (OnChange) und 3 signifikante Zeilen
2. Bummi verwendet zwei Events(OnClick und OnEnter) und 7 Programmzeilen.

Auch sonst ist die Logik eine andere.

Bummi 3. Jan 2012 09:27

AW: Curosr in TEdit ans Ende setzen
 
Ich würde sogar sagen unser Code hat überhaupt nichts gemeinsam ....
und auch wenn der Code kürzer ist tut er IMHO nicht was er soll.

DeddyH 3. Jan 2012 09:29

AW: Curosr in TEdit ans Ende setzen
 
Zitat:

Zitat von Bummi (Beitrag 1144113)
und auch wenn der Code kürzer ist tut er IMHO nicht was er soll.

Das ist die Antwort auf meine (eigentlich rhetorische) Frage :mrgreen:

v2afrank 3. Jan 2012 12:11

AW: Curosr in TEdit ans Ende setzen
 
Aber um es noch mal zusammenzufassen. Das Problem ist ja das Onclick mit der Maus. Wenn man durch Tab in das Eingabefeld wechselt funktioniert es ja richtig.
Ich würde wie in weiter oben schon angegeben auch noch das Onclick Ereignis zusätzlich zum OnEnter nutzen
Delphi-Quellcode:
procedure TForm16.EditurlClick(Sender: TObject);
begin
  if EditURL.Text = 'http://' then
     EditURL.SelStart := EditURL.GetTextLen;

end;

procedure TForm16.EditurlEnter(Sender: TObject);
begin
 if ((EditURL.Enabled) and (Length(EditURL.Text) = 0)) then begin
     EditURL.Text := 'http://';
     EditURL.SelStart := EditURL.GetTextLen;
   end;

end;
Ich denke so funktioniert es wie der TE es sich vorgestellt hat

Frickler 9. Jan 2012 17:32

AW: Curosr in TEdit ans Ende setzen
 
Es ginge natürlich auch ein eigenes Ereignis, z.B. so:

Delphi-Quellcode:
const WM_AFTERENTER = 50;

// mit der passenden Methode

procedure WMAfterEnter(var Msg: TMessage); message WM_AFTERENTER;

// und dann:

procedure TForm1.EditURLEnter(Sender: TObject);
begin
  PostMessage(Handle, WM_AFTERENTER, 0, 0);
end;

procedure TForm1.WMAfterEnter(var Msg: TMessage);
begin
  if EditURL.Enabled and (Length(EditURL.Text) = 0) then begin
    EditURL.Text := 'http://';
    EditURL.SelStart := EditURL.GetTextlen;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz