Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Return to Sender (https://www.delphipraxis.net/57058-return-sender.html)

Murdock 15. Nov 2005 07:57


Return to Sender
 
Hallo Ihr alle!!

Ich weiß jetzt nicht wirklich ob ich hier richtig bin, wenn nicht möge mir man dies verzeihen.
Doch leider finde ich eine Funktion nicht wieder die ich mal vor geraumer Zeit gesehen hatte.
Vielleicht kann mir einer von euch weiter helfen. Es geht um folgendes:

Ich habe mehrere Edit Felder die ich nach einem betätigen eines Buttons abfrage. Wenn jetzt ein Feld leer ist soll das Programm dort hin springen und einen Eintrag direkt ermöglichen. Ich meine ich hätte da mal eine Funktion gesehen die irgendwie mit "setfocus Sender Tedit" oder so ähnlich.
Leider weiß ich das nicht mehr genau.

von der abfrage her stelle ich mir das irgendwie so vor:

if Edit1.Text = '' or if edit2.Text = '' usw.... then

und dann sollte er zum ersten leeren feld springen.

Ich hoffe ihr könnt mit meiner Beschreibung etwas anfangen und mir weiter helfen

Danke und Gruß
Murdock

Sharky 15. Nov 2005 08:01

Re: Return to Sender
 
Hai Murdock,

meinst Du das so:
Delphi-Quellcode:
begin
  if blubb = blubb then
  begin
    Edit1.SetFocus;
  end;
end;

chrisw 15. Nov 2005 08:05

Re: Return to Sender
 
so in etwa müsste das aussehen !
Delphi-Quellcode:
for i := 0 to ComponentCount -1 do
  if Component[i] is TEdit then
    if (Component[i] as Tedit).Text = '' then
    begin
      (Component[i] as TEdit).SetFocus;
      break;
    end;

Murdock 15. Nov 2005 08:12

Re: Return to Sender
 
Hallo Sharky

Nein nicht wirklich.
Ich versuch es mal anders:

if Edit1.Text = '' Then
edit1.SetFocus;
end;
if Edit2.Text = '' Then
edit2.SetFocus;
end;
.
.
.
usw. // insgesamt 10 Edit Felder

Das Problem ist jetzt beim Ablauf er überrüft das 1. Feld merkt ist leer und springt dahin.
Ich stell mir das so vor er überprüft erst alle Felder und Springt dann zum ersten LEEREN Feld und markiert die anderen in einer anderen Farbe.

Ich hoffe so ist verständlicher ( ist gar nicht so einfach Probleme zu erklären) :wall:

Murdock

chrisw 15. Nov 2005 08:17

Re: Return to Sender
 
wie wärs mit 'nem array ?
Delphi-Quellcode:
var myEditArray : array [0..9] of TEdit;

.......//initialisieren der EDitfelder usw.


for i :=0 to 9 do
if myEditArray[i].Text = '' then
begin
  myEditArray[i].SetFocus;
  break;
end

Ghostwalker 15. Nov 2005 09:30

Re: Return to Sender
 
Eine weiter Möglichkeit besteht darin sich die fehlerhaften Felder zu merken und erst am Schluß
das ganze zu handhaben. Das wär dann in etwa folgender Code:

Delphi-Quellcode:
     var errlist : TObjectlist;
begin
   errlist := TObjectlist.create....
//Hier wird geprüft und die entsprechenden edits ggf. in die liste eingetragen
   if (edit1.text = '') then
       errlist.add(edit1);
   if (edit2.text = '') then
       errlist.add(edit2);
           :
//Wenn Fehler da sind, dann tu was...
   if (errlist.count > 0) then
   begin
      for I := 0 to errlist.count -1 do
      begin
         Tedit(errlist.items[i]).color := clLime;
         if (i = 0) then
           Tedit(errlist.items[i]).setfocus;
      end;
   end;
//Wichtig...die Liste wieder freigeben. Nicht aber die edits !!
   errlist.free;
end;
Hoffe das hilft. Ausprobiert hab ich es allerdings jetzt nicht.

Gruß

Uwe

Murdock 15. Nov 2005 12:50

Re: Return to Sender
 
Danke für die Vorschläge.

Ich werde jetzt mal schauen welcher für mich (Anfänger) am besten einzubauen ist.

Vielen Dank
Murdock

Der_Unwissende 15. Nov 2005 14:17

Re: Return to Sender
 
Zitat:

Zitat von Murdock
Nein nicht wirklich.
Ich versuch es mal anders:

if Edit1.Text = '' Then
edit1.SetFocus;
end;
if Edit2.Text = '' Then
edit2.SetFocus;
end;
.
.
.
usw. // insgesamt 10 Edit Felder

Das Problem ist jetzt beim Ablauf er überrüft das 1. Feld merkt ist leer und springt dahin.

Da musst du den Ansatz von crisw eigentlich nur ein wenig erweitern :

Delphi-Quellcode:
function isValid(const s : String) : Boolean;
begin
  result := s <> ''; // oder halt beliebig anders
end;

...
...
var i : Integer;
    buffer : TControl;
begin
  buffer := nil;

  for i := 0 to self.ControlCount - 1 do
    begin
      if self.Controls[i] is TEdit then
        begin
          if not self.isValid((self.Cotrols[i] as TEdit).Text) then
            begin
              self.Controls[i].Color := clRed; // Farbe ändern
              buffer := self.Controls[i]; // letztes Edit das falschen Eintrag enthält merken
            end; // if not self.isValid((Component[i] as TEdit).Text)
        end; // if self.Component[i] is TEdit
    end; // for i := 0 to self.ComponentCount - 1
 
  // wenn mindestens ein Edit ungültige Eingabe enthielt
  if assigned(buffer) then
    begin
      buffer.setFocus; // Focus setzen
    end; // if assigned(buffer)
end;
Ein paar kleine Anmerkungen:
Da TEdit ein Control ist, solltest du über die Controls des Form iterieren. TControl bietet schon die Eigenschaft Color und die Methode setFocus. Deshalb muss an den stellen auch nicht gecastet werden. Ansonsten würde ich (wie hier) eine eigene Methode zur Validierung der Eingabe nehmen. Kann ja sein, dass du irgendwann eine andere Eingabe als gültig ansiehst.

Ja, hoffe das hilft dir weiter,
Gruß Der Unwissende


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 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