Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi wie erfahre ich in der Form1 welches Editierfeld gekickt ist (https://www.delphipraxis.net/109388-wie-erfahre-ich-der-form1-welches-editierfeld-gekickt-ist.html)

binio 29. Feb 2008 12:41


wie erfahre ich in der Form1 welches Editierfeld gekickt ist
 
Habe eine Form1 mir zig Editierfeldern
Möchte jetzt die Einfüge-Taste realisieren.
Diese Taste kennt man von Word oder anderen editiertools.
Hier bis jetzt mein Code:
Delphi-Quellcode:
procedure TForm1.StringEditKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  {mit der [Einfg]-Taste zwischen Einfüge- und Überschreibmodus wechseln}
  if (Key=VK_Insert) and (Shift=[]) then
    schreibmodus.Checked:=not schreibmodus.Checked;
end;
Delphi-Quellcode:
procedure TForm1.StringEditKeyPress(Sender: TObject; var Key: Char);
var Zeile    : string;
    CursorPos : integer;
begin
  if schreibmodus.Checked then begin
    if Key<#32 then
      Key:=#0
    else begin
      {Aktuelle Einfügeposition merken}
      CursorPos:=StringEdit.SelStart;
      {Memotext in einer string-Variablen zwischenspeichern}
      Zeile:=StringEdit.Text;
      {Falls sich an der aktuellen Cursorposition ein
       Windows-Zeilenumbruch befindet, müssen zwei
       Zeichen (#13=CR und #10=LF) gelöscht werden:}
      if (Zeile[CursorPos+1]=#13) and (Zeile[CursorPos+2]=#10) then
        delete(Zeile,CursorPos+1,1);
      {Das Zeichen an der Einfügeposition löschen}
      delete(Zeile,CursorPos+1,1);
      {Memotext aus der string-Variablen zurückladen}
      StringEdit.Text:=Zeile;
      StringEdit.SelStart:=CursorPos;
    end;
  end;
end;
WIe man in den Beispiel sieht gibt es probleme wenn ich das für gut 50 Editierfeldern einzeln machen muss. Daher mein ansatz in der Form1 ein KeyPress zu programmieren der ermittelt welches Editierfeld ausgewählt wurde um dann mein Code auszuführen.

Meine bischerigen Ansätze waren:
Delphi-Quellcode:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
showmessage(TObject.ClassName);
showmessage(TObject.MethodName(TObject.MethodAddress("StringEdit")));
end;
Ich hoffe doch das mein vorhaben überhaupt machbar ist

DeddyH 29. Feb 2008 12:47

Re: wie erfahre ich in der Form1 welches Editierfeld gekickt
 
Mir fallen spontan 2 Möglichkeiten ein: entweder die Methode allgemein machen (d.h. Sender auswerten) und jedem Edit zuweisen oder ActiveControl abfragen.

mkinzler 29. Feb 2008 12:47

Re: wie erfahre ich in der Form1 welches Editierfeld gekickt
 
Du kannst alle Edits mit der selben Eventmethode verbinden. Das auslösende edit steht dann im Parameter Sender.

Delphi-Quellcode:
(Sender as TEdit).<Methode> bzw. Property

binio 29. Feb 2008 13:08

Re: wie erfahre ich in der Form1 welches Editierfeld gekickt
 
Die Idee von mkinzler gefällt mir sehr...
Nur weiss ich nicht die das zu verstehen ist.
Also ich habe jetzt eine Procedure meiner Form1 hinzugefügt und allen Editierfeldern diese beim KeyPress Event zugeordnet. Wie komme ich den Jetzt mit Sender an die Klassennamen?

Delphi-Quellcode:
procedure TForm1.einfuegemodus(Sender: TObject; var Key: Char);
begin
  with (Sender as TEdit).<Methode> do
      begin
        showmessage(ClassName);
      end;
end;

DeddyH 29. Feb 2008 13:09

Re: wie erfahre ich in der Form1 welches Editierfeld gekickt
 
Delphi-Quellcode:
if Sender is TEdit then
  ShowMessage(TEdit(Sender).Name);

mkinzler 29. Feb 2008 13:10

Re: wie erfahre ich in der Form1 welches Editierfeld gekickt
 
Delphi-Quellcode:
(Sender as TEdit).ClassName
Dieser ist aber immer der selbe, wenn alle TEdits sind.

binio 29. Feb 2008 13:22

Re: wie erfahre ich in der Form1 welches Editierfeld gekickt
 
Hab nun
Delphi-Quellcode:
procedure TForm1.einfuegemodus(Sender: TObject; var Key: Char);
begin
{if Sender is TEdit then
  ShowMessage(TEdit(Sender).Name);@WORK}

var Zeile    : string;
    CursorPos : integer;
begin
  if schreibmodus.Checked then begin
    if Key<#32 then
      Key:=#0
    else begin
      {Aktuelle Einfügeposition merken}
      CursorPos:=TEdit(Sender).Name.SelStart;
      {Memotext in einer string-Variablen zwischenspeichern}
      Zeile:=TEdit(Sender).Name.Text;
      {Falls sich an der aktuellen Cursorposition ein
       Windows-Zeilenumbruch befindet, müssen zwei
       Zeichen (#13=CR und #10=LF) gelöscht werden:}
      if (Zeile[CursorPos+1]=#13) and (Zeile[CursorPos+2]=#10) then
        delete(Zeile,CursorPos+1,1);
      {Das Zeichen an der Einfügeposition löschen}
      delete(Zeile,CursorPos+1,1);
      {Memotext aus der string-Variablen zurückladen}
      TEdit(Sender).Name.Text:=Zeile;
      TEdit(Sender).Name.SelStart:=CursorPos;
    end;
  end;
end;
geht aber nicht er mekert bei CursorPos:=TEdit(Sender).Name.SelStart;...

DeddyH 29. Feb 2008 13:23

Re: wie erfahre ich in der Form1 welches Editierfeld gekickt
 
Lass den Namen weg:
Delphi-Quellcode:
TEdit(Sender).SelStart;

binio 29. Feb 2008 13:27

Re: wie erfahre ich in der Form1 welches Editierfeld gekickt
 
Schade das es kein Smile für "mir ist ein Licht aufgegangen" gibt :)
Aber ein :thumb: für deine Antwort gibt es und ein :wall: für meine Frage
Danke Jungs !!! :mrgreen: :mrgreen: :mrgreen:

DeddyH 29. Feb 2008 13:39

Re: wie erfahre ich in der Form1 welches Editierfeld gekickt
 
:coder2: <-- :zwinker:

WIng2005 20. Mär 2008 14:52

Re: wie erfahre ich in der Form1 welches Editierfeld gekickt
 
Hallo Gemeinde...

stehe vor einem ähnlichen Problem:

möchte die Eingaben eines TJvEdits formatieren, d.h. 100 -> 100,00
Das Problem hierbei ist, dass unter Verwendung der Jedis mit

Delphi-Quellcode:

TJVEdit(sender).text:=dl(TJVEdit(sender).text) ;
sowie

Delphi-Quellcode:
function dl(s:string):string;
Begin
try
result:=Format('%1.2n',[StrToFloatdef(s,0)] );
except
result:='0';
end;
end;
nicht weiter komme. Fehler: [Fehler] PCtrlKalk.pas(793): Undefinierter Bezeichner: 'TJVEdit'

Hat hierfür vielleicht jemand nen Tip......?

MFG
Steffen

DeddyH 20. Mär 2008 14:54

Re: wie erfahre ich in der Form1 welches Editierfeld gekickt
 
Da scheint eine Unit in der uses-Klausel zu fehlen.

shmia 20. Mär 2008 15:13

Re: wie erfahre ich in der Form1 welches Editierfeld gekickt
 
Du arbeitest irgendwie an der VCL und Windows vorbei.
Ein TEdit hat das Property AutoSelect.
Wenn das True ist, wird der gesamte Text bei Betreten des Feldes automatisch selektiert.
Wenn der Benutzer sofort losschreibt, wird der alte Inhalt überschrieben;
klickt er nochmals in das Edit-Feld, verschwindet die Selektion und der Benutzer ist im Einfüge Modus.
Der Benutzer kann auch Teile des Editfelds selektieren und dann schreiben-der selektierte Teil wird überschrieben.
Daher braucht man keinen Überschreibmodus.

Damit die Sache mit dem Überschreibmodus überhaupt einen Sinn macht, müsste dieser Modus vom Edit Control unterstüzt werden. Ohne Unterstützung wird auch der Cursor (bzw. das Carret) nicht richtig angezeigt und du hast nur ein halbe und schlechte Lösung.

WIng2005 20. Mär 2008 17:26

Re: wie erfahre ich in der Form1 welches Editierfeld gekickt
 
@DeddyH: Ich glaube der Fehler ist darin begründet ist, dass das Ganze nicht in der Main-Unit stattfindet, in der die Jedis eingebunden sind sind :wall:
Werde dass mal testen...

MFG
Steffen


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:09 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 by Thomas Breitkreuz